继承的目的是为了代码复用。往子类中添加新的方法和域可以使子类更加符合需求。
继承是“is-a”的关系,子类“is a”父类。
把通用的方法写入父类中,子类可以通过Override重写父类的方法。
子类不能直接访问父类中的private域或者方法,需要通过父类的public方法访问。
使用父类的方法需要用super关键字。
public int getSalary() { this.bonus=getSalary(); return bonus; }
这样的代码会不停的调用子类的getSalary方法,应该使用super关键字。public int getSalary() { this.bonus=super.getSalary(); return bonus; }
super与this的区别:super只是一个关键字,this表示是对本对象的引用。
调用父类构造器可以使用super关键字。
super(var1,var2);
如果子类不显式地调用父类的构造方法,那么会调用父类的默认构造方法(无参数),如果父类没有默认的构造方法,会报编译错误。
多态:一个对象可以引用多种实际类型的现象。
TestFather[] tf=new TestFather[3]; tf[0]=new TestExtend(); tf[1]=new TestExtend(); tf[2]=new TestFather(); tf[0].getSalary(); tf[2].getSalary();
结果会是
child father
这种现象就是多态,JVM知道tf中元素的实际类型。
但是tf中的元素不能调用子类中独有的方法。因为tf声明的对象类型是父类的对象类型。对父类的引用也不能赋给子类。
动态绑定:运行时自动选择调用适当的方法的现象。
静态绑定:如果一个方法是private,static,final或者是构造器的,那么编译器将会很清楚的指导调用的是哪个方法,称为静态绑定。
JVM会为每个类型创建一个方法表,通过方法名和参数特点来确定调用的是哪个方法。
继承可以多层次的,但是只能单继承,多继承是通过实现接口来实现的。
子类如果要覆盖父类的方法,那么该方法的可见性不能低于父类方法的可见性,如:父类方法为public,那么子类必须为publc。
不想让继承的类可以用final关键字修饰,该类的所有方法为final但是域不是。
如果用final修饰方法的话,那么该方法不能被子类覆盖。
如果用final修饰域的话,那么域的值在初始化后不能被修改。
强制类型转换要注意两点:一是只能在继承层次内进行转换,二是在父类转换成子类前要用instanceof进行检查,null的对象检查结果为false。
抽象类可以包含具体的域和方法。
扩展抽象类有2中选择,一是将其抽象方法都实现,那么子类可以不是抽象类,二是加入抽象方法或者抽象方法不实现,那么子类也需标记为抽象类。
抽象类不能被实例化,但是可以创建一个子类的对象。
AbstractFather f=new Child();
抽象类即使不含抽象方法,也可以被声明为abstract的。
访问修饰符:
private:对本类可见
public:对所有类可见
protected:对本包和所有子类可见
默认:对本包可见
如果要实现一个对象的实例比较相等,那么需要实现equals方法和hashCode方法。具体在Java Core第五章没讲明白,据说卷二第二章有讲。
泛型
Java继承的学习(一)
最新推荐文章于 2024-09-20 15:32:13 发布