标签:
继承是在现有类的基础上创建新类的过程。(实例变量和静态变量统称为域,类中的域、方法、嵌套类、接口统称为类成员)
反射机制:在程序运行期间查找类及其成员的能力
abstract方法没有实现;abstract类不能被实例化。
子类不能直接访问父类的私有实例变量。
不同于this引用,super不是对象的引用,而是绕过动态查找方法并调用特定方法的指令。
覆盖一个方法时,可以将返回类型改成子类型(协变返回类型是允许的)
重载一个方法时,子类方法的可见性至少与父类方法一样。父类方法是公有的,子类方法也必须声明为公有的。
1、子类的构造
因为子类的构造函数不能访问父类的私有变量,所以必须通过父类的构造函数来初始化他们。
1 public Manager(String name,double salary){ 2 super(name, salary); 3 bonus = 0; 4 }
2、父类赋值
将一个子类对象赋值给父类变量是合法的
1 Manager boss = new Manager(); 2 Employee empl = boss;
※此时在父类变量上调用方法时。即便类型是父类型,但是还是会调用子类型的方法。当调用方法时,虚拟机会查看对象的实际类型,并且定位方法的版本。这个过程被称作动态方法查找。
有了动态方法查找,就可以编写父类同意的操作,根据不同的子类返回不同的结果(一样的代码,返回不同的结果)。
在Java中,父类赋值同样适用于数组。java数组是协变的。
1 Manager[] bosses = new Manager[10]; 2 Employee[] empls = bosses; //合法的 3 empls[0] = new Employee() //编译通过,运行时错误,父类不能放在实际为子类数组里,ArrayStoreException
将子类放入父类对象中,只能调用父类的方法。
1 Employee empl = new Manager() 2 empl.setBonus(100); //编译报错,父类中没有setBonus方法 3 4 //可以将父类引用转化成子类引用 5 if(empl instanceof Manager){ 6 Manager mgr = (Manager)empl; 7 mgr.setBonus(100); 8 }
将一个方法声明为final时,子类不可以覆盖它。final并不能提高效率,现代虚拟机会进行推理进行自动内联(http://blog.csdn.net/zq602316498/article/details/40266633?utm_source=tuicool&utm_medium=referral)
3、抽象方法和类
一个类可以定义没有实现的方法,强迫子类去实现方法,这样的方法以及其所属的类被称为抽象方法和类。必须用abstract修饰。
抽象类中可以拥有非抽象方法。
※不同于接口,抽象类可以拥有实例变量和构造函数。!接口可以定义常量,public static final int MAX = 10;
构造抽象类的实例时不可能的。但是可以拥有一个类型为抽象类的变量,前提是该变量引用一个具体子类的对象。
4、protected类型
同一个包下的类都能访问,不同包下的子类能访问。
标签:
原文地址:http://www.cnblogs.com/Greekjone/p/5580063.html