多态
前提和体现
- 有继承关系
- 有方法重写
- 有父类引用指向子类对象
成员访问特点
- 成员变量
- 编译看左边,运行看左边
- 成员方法
- 编译看左边,运行看右边(由于成员方法存在方法重写,所以它运行看右边)
- 静态方法
- 编译看左边,运行看左边
- 所以静态方法不能算方法的重写
- 构造方法
- 子类的构造都会默认访问父类构造
class A
{
public void show()
{
show2();
}
public void show2()
{
System.out.println("我");
}
}
class B extends A
{
public void show2()
{
System.out.println("爱");
}
}
class C extends B
{
public void show()
{
super.show();
}
public void show2()
{
System.out.println("你");
}
}
public class Polymorphisn
{
public static void main(String[] args)
{
A a = new B();
a.show();//调用父类show后调用子类show2
B b = new C();
b.show();//调用父类show后调用子类show2
//爱
//你
}
}
class A{
protected int age = 20;
protected void showAge(){
System.out.println(age);
}
}
class B extends A{
protected int age = 10;
}
public class Polymorphisn
{
public static void main(String[] args)
{
B b = new B();
b.showAge();//20
A a = new B();
a.showAge();//20
System.out.println(b.age);//10
System.out.println(a.age);//20
}
}
好处
- 提高了程序的维护性(由继承保证)
- 提高了程序的扩展性(由多态保证)
弊端
- 不能访问子类特有功能
- 需要向下转型
抽象类
抽象类的特点
- 抽象类和抽象方法必须用关键字abstract修饰
- 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
- 一个抽象类如果没有抽象方法作用是防止被实例化
- 抽象类不能实例化
- 构造方法用于子类访问父类数据的初始化
- 抽象类的子类
- 是一个抽象类。
- 是一个具体类。这个类必须重写抽象类中的所有抽象方法。
抽象类中的方法
- 抽象类的抽象方法:用于限定子类必须完成某些动作
- 抽象类的非抽象方法:用于提高代码的复用性
abstract不能和哪些关键字共存
final、static、private
接口
接口的实现类
- 是一个抽象类。
- 是一个具体类,这个类必须重写接口中的所有抽象方法。
接口的成员特点
- 成员变量
- 只能是常量
- 默认修饰符:public static final
- 构造方法
- 没有构造方法
- 成员方法
- 只能是抽象的
- 默认修饰符:public abstract
抽象类和接口的区别
- 成员区别
- 抽象类:
- 成员变量:可以变量,也可以常量
- 构造方法:有
- 成员方法:可以抽象,也可以非抽象
- 接口:
- 成员变量:只可以常量
- 构造方法:没有
- 成员方法:只可以抽象
- 抽象类:
- 关系区别
- 类与类
- 继承,单继承
- 类与接口
- 实现,单实现,多实现
- 接口与接口
- 继承,单继承,多继承
- 类与类
- 设计理念区别
- 抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
- 接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
以上概念总结于传智播客Java基础课程