java入门篇(9)多态,抽象类,接口
一、抽象类的一些特性
1.1 成员方法
- 可以包含抽象方法和非抽象方法。
- abstract修饰的方法在父类中申明,只有方法名,没有方法体。
如:abstract void method(); - 非抽象方法可以被protected,public ,final,static修饰
- 抽象方法不能被private,static修饰
- 抽象方法可以定义返回类型;
- 父类static,final,static,privated修饰的方法不可以被子类重写,其他的都可以。
- 重写父类的方法,权限修饰符只能大于或者等于原方法权限修饰符。
- 必须要重写的方法是原父类方法中abstract修饰的方法。
1.2 成员变量
- abstract 不可以修饰成员变量
- 成员变量可以用public,private,protected,static,final修饰,default,abstract不可以。
- final修饰的必须赋初值,static修饰的不可以赋初值。
1.3 构造方法
- 可以有构造法方法,不可以由final,static,abstract修饰。
- 可以有无参构造,也可以有有参构造。
- 有构造方法但是不能实例化。
1.4 子类
- 子类为抽象类,不用重写父类方法
- 子类不为抽象类,必须重写父类的抽象方法
1.5 父类
- 父类不能被实例化,但是可以创建子类的对象
- 可以定义一个抽象类的对象变量,但是只能引用非抽象子类的对象。
二、继承和多态
2.1 多态的特性
- 在父类引用指向子类对象时:
先看在父类中有没有该方法,有,再从子类中找到对应的子类方法,然后执行子类的方法,否则执行子类上一层父类的方法。 - 再看父类的方法体中是否嵌套子类有的方法,有,执行子类方法,否则执行父类方法体中内容
2.2 子类构造函数调用父类构造函数
-
构造函数的调用只能发生在构造函数体中
-
子类所有构造函数默认调用父类的无参构造函数
-
父类自定义有参构造函数,系统不会定义默认无参构造函数,此时需要子类显示调用父类相关构造函数。
-
子类调用父类构造函数,作用是初始化子类从父类继承来的成员属性。
2.3 向上转型和向下转型
-
可以通过强制类型转换将子类引用转换为父类引用(向上转型),作用:不能访问子类特有的成员方法和成员变量。
-
通过强制类型转换将父类引用转换为子类引用(向下转型),作用:可以访问子类特有的成员变量和成员方法。
-
子类引用不能指向父类引用:会报Incompatible types错误
-
父类引用可以指向子类引用,可以调用子类的成员方法和成员变量。
-
子类引用a可以指向向下转型后的父类的引用b,然后b调用子类所有的成员方法和成员变量;父类引用也可以指向向上转型的子类的引用。
-
final修饰的方法也不能被继承,但是final修饰的字段可以被继承
-
继承重写的方法的访问控制符的粒度不能比之前的小,只能更大
-
代码展示:
public class duo {
public static void main(String[] args) {
A22 a = new A22();
A22 a1 = new A22("a", "c");
A22 b = new A3();
A22 b1 = new A3("a", "b", "c");
A3 c = new A3();
A3 c1 = new A3("a", "b", "c");
c = (A3) a1;
A3 c2 = (A3) new A22();
System.out.println(((A22) c).a);
}
}
class A22 {
String a;
String b;
A22() {
}
A22(String a, String b) {
this.a = a;
this.b = b;
}
public void show() {
System.out.println("父类的成员变量的值a:" + a + "," + "b:" + b);
System.out.println("父亲");
}
}
class A3 extends A22 {
String c;
A3() {
super();
}
A3(String a, String b, String c) {
super(b, c);
super.show();
this.c = c;
}
public void method1() {
}
}
2.4 多态定义
父类指针指向不同类型的子类对象,执行子类对象的特有方法,得到的结果是不一致的。
2.5 动态绑定(dynamic binding)
是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
2.6 多态作用
消除类型之间的耦合关系。
2.7 多态存在的必要条件
- 继承
- 重写
- 父类引用指向子类对象
2.8 多态的好处
- 可替换性(substitutability):多态对已存在代码具有可替换性
- 可扩充性(extensibility):多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
- 接口性(interface-ability)::多 态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
- 简化性(simplicity):多态简化对应用软件的代码编写和修改过程。
2.9 多态的实现方式
接口实现,继承父类进行方法重写,同一个类中进行方法重载。
三、接口和抽象类的区别
表示关系 | 默认字段修饰符 | 默认方法修饰符 | 构造函数 | 子类 | 继承特性 | |
---|---|---|---|---|---|---|
接口 | 定义规范 | public static final,且只能是public static final,可以不写static final,但其实还是static,final | public abstract,可以有方法体,但是由default修饰,其他方法必须是public abstract | 无 | 接口可以继承多个接口 | |
抽象类 | 表示关系 | 默认是default | abstract/正常的,抽象类中可以没有抽象方法 | 抽象类需要有构造函数,供子类使用 | 子类可以是抽象类或者非抽象类 |
- final和abstract是相互对立的