------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
多态
01、多态的概述与前提
一多态:对象在不同时刻表现出来的不同状态。
例如:我们在父母面前是儿女,在学校是学生,在公司里是员工。
二多条的前提条件:
A:要有继承关系
B;要有方法的重写
C:要有父类的引用指向子类对象
</pre>代码示例<pre name="code" class="java">class Fu {
public int num = 100;
public void show() {
System.out.println("show Fu");
}
public static void function() {
System.out.println("function Fu");
}
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 200;
public void show() {
System.out.println("show Zi");
}
public void method() {
System.out.println("method zi");
}
public static void function() {
System.out.println("function Zi");
}
}
class DuoTaiDemo {
public static void main(String[] args) {
//要有父类引用指向子类对象。
//父 f = new 子();
Fu f = new Zi();
System.out.println(f.num);
//找不到符号
//System.out.println(f.num2);
f.show();
//找不到符号
//f.method();
f.function();
}
}
02、多态中类对象的成员编译和运行的特点
Fu fu = new Zi();
左边是Fu 右边是Zi
A:成员变量 :编译看父类(等号左边),运行看父类(等号左边)
B:成员方法 :编译看父类(等号左边),运行看子类(等号右边)
C:因为方法有重写而变量没有
03、多态的弊端及相应的解决方案
一多态的弊端及解决方法
多态的弊端:父类引用无法使用子类特有功能
解决办法:可以把父类向下转型
二引用类型:
向上转型:小到大
向下转型:大到小
/*
多态的弊端:
不能使用子类的特有功能。
<span style="white-space:pre"> </span>解决方法:可以把父类向下转型
*/
class Fu {
public void show() {
System.out.println("show fu");
}
}
class Zi extends Fu {
public void show() {
System.out.println("show zi");
}
public void method() {
System.out.println("method zi");
}
}
class DuoTaiDemo3 {
public static void main(String[] args) {
//测试
Fu f = new Zi();
f.show();
//f.method();
<span style="white-space:pre"> </span>//<span style="font-family: Arial, Helvetica, sans-serif;">把父类向下转型,就可以调用子类的特有方法</span>
<span style="white-space:pre"> </span>Zi z = (Zi)f;<pre name="code" class="java"><span style="white-space:pre"> </span>f.method();
}
}
04、多态中的类型转换问题
一在这个知识点中出现类型转换异常的根本原因是多态中子类之间没有继承关系,不能直接转换.
类型转换异常: java.lang.ClassCastException
如果遇到了这个异常那么表示代码中出现了类型不匹配
如果两个类没有任何关系不能互相转换(关系指的是继承或者实现)
/*
ClassCastException:类型转换异常
一般在多态的向下转型中容易出现
*/
class Animal {
public void eat(){}
}
class Dog extends Animal {
public void eat() {}
public void lookDoor() {
}
}
class Cat extends Animal {
public void eat() {
}
public void playGame() {
}
}
class DuoTaiDemo5 {
public static void main(String[] args) {
//内存中的是狗
Animal a = new Dog();
Dog d = (Dog)a;
//内存中是猫
a = new Cat();
Cat c = (Cat)a;
//内存中是猫
Dog dd = (Dog)a; //ClassCastException
}
}
05、多态的好处
多态的好处:
可以提高代码的扩展性和可维护性
06、抽象类
一、抽象类的基本特点
抽象类:类用关键字abstract 修饰
抽象方法:方法声明要用abstract, 第二没有方法体
二、抽象类不能被实例化,通过多态创建子类对象去实例化.。
三、如果一个类继承抽象类,子类继承抽象类,子类必须重写父类的所有抽象方法,要么子类也定义为抽象类。
四、抽象类的成员特点
A:成员变量:既有变量也有常量
B:构造方法:有构造方法
C:成员方法:有抽象方法也有非抽象方法,抽象类中的抽象方法,是为了强制要求子类实现某些功能。抽象类中的非抽象方法,是为了提高代码的复用性,让子类继承的。
注意:有抽象方法的类一定是抽象类(或者是接口)
抽象类中可以没有抽象方法.
07、接口
一、接口的基本特点
特点
A:接口不能实例化
B:接口中的方法,要么被子类重写,要么把子类也定义为抽象类或者接口
二、接口的成员特点
A:成员变量:接口中只有常量(因为接口中的变量有默认修饰符 public static final)
B:构造方法:接口中没有构造方法(接口中的常量是static修饰 接口中的方法没有方法体)
C:成员方法:接口中只有抽象方法(因为接口中的 方法有默认修饰符 publicabstract)
三、接口的思想特点
A:接口是对外暴露的原则。例如:电脑的USB插口
B:接口是程序对外的功能扩展。
C:接口的出现降低耦合性。
D:接口可以用来多实现
四、类、接口之间的关系
A:类与类的关系
是继承关系(只能单继承,但是可以多层继承 )
B:类与接口的关系
是实现关系(一个类在继承一个类的同时还可以实现多个接口)
C:接口与接口的关系
继承关系(可以单继承也可以多继承,因为接口直接不会出现方法调用不明确的情况)
D:类与抽象类的关系
继承关系
08、抽象类和接口的区别
抽象类:
成员变量:可以是变量,也可以是常量。
构造方法:有构造方法。
成员方法:可以是抽象方法,也可以是非抽象方法。
接口:
成员变量:只能是常量。默认修饰符 public static final
构造方法:无构造方法
成员方法:只能是抽象方法。默认修饰符 public abstract