1.多态
多态是在继承 / 实现情况下的一种现象 , 有两种表现形式 : 对象多态 / 行为多态 . ( java中成员变量没有多态 )
有三种情况可以表现出多态 :
-
有继承 / 实现关系
-
父类需引用子类对象时
-
子类的方法需要重写时
多态的定义方法 : 使用父类接收子类新建的对象
例 : Animal d1 = new Dog();
注意 : 父类虽然接收了子类的对象 , 但不能用子类独有的方法 .
为了使用子类里独有的方法 , 会进行类型转换 :
-
自动类型转换 : 父类 变量名 = new 子类();
例 : Animal d1 = new Dog();
-
强制类型转换 : 子类 变量名 = (子类) 父类变量;
例 : Dog d2 = (Dog) d1;
但强制类型转换有时在运行时会报错 :
例 : Cat c = (Cat) d1; // d1的真实类型是Dog类 , 不是Cat
最好先判断对象的真实类型 , 再进行方法的调用
例 :
if(Animal instanceof d Dog){ //如果是Dog对象则会调用Dog类里的eat方法 d.lookHome(); } else if(Animal instanceof c Cat){ //如果是Cat对象则会调用Cat类里的eat方法 c.catchMouse(); }
多态的好处 : 右边的对象是解耦合的 , 便于扩展与维护
1.1.练习
要求 :
-
定义一个动物类 , 它具有名称 , 性别 , 年龄三个属性 , 具有吃饭的行为 .
-
定义一个猫类 , 它继承动物类 , 其独有方法为抓老鼠 .
用多态的形式测试调用吃饭与抓老鼠的行为 .
示例 :
public class Animal { // 定义动物类(父类) private String name; private int age; private char sex; // 无参构造与有参构造 public Animal() { } public Animal(String name, int age, char sex) { this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } // eat方法 public void eat(){ System.out.println(name + "在吃饭"); } }
public class Cat extends Animal{ // 定义猫类(子类, 继承了动物类) public Cat() { } public Cat(String name, int age, char sex) { super(name, age, sex); } //猫类独有的catchMouse方法 public void catchMouse(){ System.out.println(getAge() + "岁的" + getName() + "在抓老鼠"); } }
public class test03 { // 测试类 public static void main(String[] args) { Animal c1 = new Cat("狸花", 2, '女'); // 用父类来接收猫类对象 c1.eat(); // 可直接调用父类的方法 Cat c = (Cat) c1; // 强制转换为猫类 c.catchMouse(); // 调用猫类的catchMouse方法 } }
2.final关键字
final可以用来修饰变量 , 方法 , 类 .
-
修饰变量 : 变量成为了常量 , 只可被赋值一次 , 不可修改 .
-
修饰方法 : 方法不可重写 .
-
修饰类 : 类不可以拥有子类 , 不可被继承
注意 : final修饰引用数据类型时 , 地址不可改变 , 但堆内存中的数据是可以改变的 .