1多态
1.1多态概念
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
多态就是允许方法重名 参数或返回值可以是父类型传入或返回。
举例: Cat c=new Cat();
Animal a=new Cat();
猫可以是猫的类型。猫 m = new 猫();
同时猫也是动物的一种,也可以把猫称为动物。动物 d = new 猫();
1.1.1多态前提
(1)要有继承关系。
(2)要有方法重写。 其实没有也是可以的,但是如果没有这个就没有意义。
(3)要有父类引用指向子类对象,父 f = new 子();
1.1.2多态的好处
(1)提高了代码的维护性(继承保证);
(2)提高了代码的扩展性(由多态保证) ;
1.1.3多态的弊端及解决
(1)弊端:不能使用子类特有的功能
(2)解决问题
1.创建子类对象调用子类方法(无法使用多态);
2.把父类的引用强转为子类引用(向下转型);
强制转化的风险
强制转化,如果父类的引用本身不是指向子类对象的,那就会出现Class Cast Exception异常。
1.1.4多态内存图
1.1.5多态中成员访问特点
成员变量 编译看左边(父类),运行看左边(父类)
成员方法 编译看左边(父类),运行看右边(子类)。
静态方法 编译看左边(父类),运行看左边(父类)。
构造方法 创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
1.2案例
1.2.1猫狗案例
父类
package Kscng.Dmeo1;
public class Animal {
public void eat(){
System.out.println("吃饭");
}
}
子类1
package Kscng.Dmeo1;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫爱吃鱼");
}
}
子类2
package Kscng.Dmeo1;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗爱吃骨头");
}
}
测试类
package Kscng.Dmeo1;
public class MyTest {
public static void main(String[] args) {
Cat c1 = new Cat();
c1.eat();
Dog d1 = new Dog();
d1.eat();
}
}
1.2.2多态中分析题
题1:
class Fu {
public void show() {
System.out.println("fu show");
}
}
class Zi extends Fu {
public void show() {
System.out.println("zi show");
}
public void method() {
System.out.println("zi method");
}
}
class DuoTaiTest3 {
public static void main(String[] args){
Fu f = new Zi();
f.method();
//存在错误,应该是 Zi a = (Zi)f;
// a.method();
f.show();
}
}
结果:
zi show
zi method
题2:
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 DuoTaiTest4 { //去掉public
public static void main(String[] args) {
A a = new B();
a.show();
B b = new C();
b.show();
}
}
结果:
爱
你
2抽象类
2.1抽像类的成员
2.1.1抽象类成员变量
(1)成员变量:既可以是变量,