继承
继承的作用:
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
实现语法:
关键字 extends
public class Father {
final String flag = "zhang";
public Father() {
System.out.println("构造Father");
}
public void run() {
System.out.println("father run");
}
}
public class Son extends Father {
final String flag = "lin";
public Son() {
System.out.println("构造Son");
}
public void run() {
System.out.println("son run");
}
}
public class GrandSon extends Son{
final String flag = "wang";
public GrandSon() {
System.out.println("构造GrandSon");
}
public void run() {
System.out.println("grandson run");
}
public static void main(String[] args) {
//强转运行时出错
//Son son = (Son) new Father();
Son son = new Son();
System.out.println(son.flag);
//构造Father
//构造Son
//lin
Father father = new Son();
System.out.println(father.flag);
father.run();
//构造Father
//构造Son
//zhang
//son run
Father father2 = new GrandSon();
System.out.println(father2.flag);
father2.run();
//构造Father
//构造Son
//构造GrandSon
//zhang
//grandson run
}
}
继承的一些规则:
1.关于构造
默认情况下,调用子类则会先调用父类的默认构造函数
如果在子类的构造方法中想要调用父类的构造方法,super必须使用在第一行语句(很好理解,父类先执行)
如果父类没有默认构造方法时,子类必须使用super显示调用父类特定的构造方法(同上)
如果不想调用父类的默认构造方法,则需在子类的构造方法中使用super(父类构造方法参数);
如果不想调用父类的默认构造方法,则需在子类的构造方法中使用super(父类构造方法参数);
构造函数不能被继承
当多级继承A extend B B extendC C extend D extend D 则构造方法(实例)调用顺序DCBA,有父才有子
2.重写
父类的属性与方法子类可以直接使用(private修饰的除外),子类可以重写父类的方法(全部要一样)并覆盖直接调用,此时要调用父类可用super.方法
重写后的方法不能比被重写的方法有更严格的访问权限(可以相同)
重写后的方法不能比重写的方法产生更多的例外
重写后的方法不能比被重写的方法有更严格的访问权限(可以相同)
重写后的方法不能比重写的方法产生更多的例外
3.super
访问父类被隐藏的成员变量,如:super.variable;调用父类中被重写的方法,如:super.Method([paramlist]);
调用父类的构造函数, 如:super([paramlist]);
4.多层继承
不支持多继承,但支持多层继承注意,在多成继承的情况下,从顶层开始继承,也就是构造方法调用顺序
从最顶层开始,所以一般要关注最底层的,因为他如果最后一次重写方法
则以他为主
5.继承范围
同一个包中 | 不同包中的子类 | |
private | ||
default | ★ | |
protected | ★ | ★ |
public | ★ | ★ |
6.其他
重写是伴随着继承的,重载是在同一个类
多态
多态是什么
多态放在这里讲主要是,多态是基于继承
多态体现为:体现为派生类向上转型为基类
如Father father = new Son();
多态是一种运行期的行为不是编译器行为,所以要运行了才出错
多态的一个好处,屏蔽子类的差异性,用父类的一个公共性解决
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
类型转换
1.向上转型
将子类型转换为父类型,向上转型不需要显示指定
Father father = new Son();
2.向下转型
将父类型转换为子类型,向下转型需要显示指定
Father father = (Son)new Son();
Son son = (Son)father;//这样才能调用子类的方法
son.sing();
Son son = (Son)father;//这样才能调用子类的方法
son.sing();
//Son son = (Son) new Father();//强转失败,运行报错