java基础:继承和多态
目录
- 一、继承
- 继承的注意事项
- 二、多态
- 1、多态的定义
- 2、多态的优点
- 3、多态的缺点
- 三、继承和多态的综合练习
一、继承
继承是java面对对象的三大特征之一,继承是子类继承父类的方法和属性,使子类可以使用父类的属性和方法。
继承关键字:extends。
继承的定义方式:
class 父类{
}
class 子类 extends 父类{
}
继承的目的:代码复用。
继承的注意事项
1、Java之中只允许多层继承,不允许多重继承,Java存在单继承局限。
2、子类构造方法会默认调用父类的无参构造。
3、private修饰的方法和属性不可以被继承,final修饰的方法和属性不可以被继承。
4、方法签名必须相同,被static和final修饰的方法不可以被重写,访问权限比父类更加宽松。
5、子类实例化时,父类也会被实例化。
6、定义的类都会默认继承object类
7、instanceof 和类型转换, java语言编译时向下强制转换,不会报错,但是会有运行时错误。
代码如下:
Parent p = new Child();
if (p instanceof Child) {Child c = (Child) p; // 安全转换
}
二、多态
1、多态的定义
多态是java面对对象的三大特征之一,多态分为:编译时多态和运行时多态。
编译时多态:编译器在编译时可以识别一个方法的多种形态,它指的是方法的重载。
运行时多态:编译器在编译时无法最终确定匹配哪个方法,在真正运行时,才能确定执行哪个类的哪个方法,它指的是方法的重写。
语法规则:
父类 变量名 = new 子类();
实现多态的必要性:继承、重写、父类引用指向子类对象。
编译时看左边,看父类。
运行时右边,看子类。
1、如果子类没有重写父类的方法,当调用方法的时候,只能够调用父类的方法。
2、使用多态后,可以调用父类特有的方法,但是不可以调用子类中特有的方法。
3、当使用多态的时候,会在堆中先开辟父类,再开辟子类,变量名指向父类,当有重写的方法时,该方法会调用子类当中重写的方法。
2、多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
- 提高代码的复用性
3、多态的缺点
不能够使用子类当中特有的方法和属性,以及没有重写父类的方法也只能够调用父类的情况。
三、继承和多态的综合练习
分别定义四个类 : A、B、C、D,各种类之间存在继承关系。
A类定义如下:
public class A {public String show(D obj){return "A and D";}public String show(A obj){return "A and A";}
}
B类定义如下:
public class B extends A{public String show(Object obj){return "B and B";}public String show(A obj){return "B and A";}public String show(D obj){return "A and D";}
}
C类定义如下:
public class C extends B{
}
D类定义如下:
public class D extends B{
}
以及Test用于测试的类
public class Test {public static void main(String[] args) {A a1 = new A();A a2 = new B();B b = new B();C c = new C();D d = new D();System.out.println(a1.show(b));System.out.println(a1.show(c));System.out.println(a1.show(d));System.out.println(a2.show(b));System.out.println(a2.show(c));System.out.println(a2.show(d));System.out.println(b.show(b));System.out.println(b.show(c));System.out.println(b.show(d));System.out.println("--------------------");}
}
分析如下:
1、a1::正常定义的A类的对象,并未实现多态,因此可以调用本身的方法以及父类的方法。
A a1 = new A();
可以调用:
2、a2:是使用多态定义出来的,编译时看左侧,运行时看右侧。
a2可以调用:
3、b:正常定义出来的B类的实例化对象。
b可以调用:本身自己的方法和父类继承下来的方法。
4、c:定义的C类的实例化对象
可以调用:本身自己没有定义方法,但是可以继承父类的方法。
5、d:定义的D类的实例化对象
可以调用:本身自己没有定义方法,但是可以继承父类的方法。
分析下面运行代码:
System.out.println(a1.show(b));System.out.println(a1.show(c));System.out.println(a1.show(d));System.out.println(a2.show(b));System.out.println(a2.show(c));System.out.println(a2.show(d));System.out.println(b.show(b));System.out.println(b.show(c));System.out.println(b.show(d));
1、System.out.println(a1.show(b));
符合上面的a1中的show(A)的方法,因为用到了参数的多态
所以结果为:
2、 System.out.println(a1.show©);
符合上面的a1中的show(A)的方法,因为用到了参数的多态
所以结果为:
3、System.out.println(a1.show(d));
符合上面a1方法的show(d)。
结果如下:
4、 System.out.println(a2.show(b));
符合a2中的show(A)
所以结果是:
5、 System.out.println(a2.show©);
符合a2中的show(A)
所以结果是:
6、 System.out.println(a2.show(d));
符合a2中的show(D)
所以结果是:
7、 System.out.println(b.show(b));
符合a2中的show(A)
所以结果:
8、 System.out.println(b.show©);
符合a2中的show(A)
所以结果:
9、 System.out.println(b.show(d));
符合a2中的show(D)
所以结果: