49天精通Java,第10天,Java继承和多态
一、继承
Java用关键字extends表示继承。
关键字 extends 表明正在构造的新类派生于一个已存在的类。已存在的类称为超类(superclass),新类称为子类(subclass)。超类和子类是 Java 程序员最常用的两个术语。在设计类的时候,应该将通用的方法放在超类中, 而将具有特殊用途的方法放在子类中。
继承的基本思想是基于已有的类创建新的类,复用这些类的字段和方法,再增加一些新的字段和方法。
二、多层次继承
Animals --> Dog --> Tady
package com.nezha.javase; public class Tady extends Dog{ public Tady(String name, String info) { super(name, info); } }
三、多态
多态是同一个行为具有多个不同表现形式或形态的能力。
1、多态的优点
-
1. 消除类型之间的耦合关系 2. 可替换性 3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性
2、多态存在的三个必要条件
-
继承 重写 父类引用指向子类对象
Animals dog = new Dog("大黄","汪汪");
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
四、重写
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。
要想调用父类中被重写的方法,则必须使用关键字 super。
Animals类
package com.nezha.javase; public class Animals { public void call(){ System.out.println("动物叫..."); } }
Cat子类
package com.nezha.javase; public class Cat extends Animals{ @Override public void call() { System.out.println("喵喵喵..."); } }
Dog子类
package com.nezha.javase; public class Dog extends Animals{ @Override public void call() { super.call(); } public static void main(String[] args) { Animals dog = new Dog(); dog.call();//动物叫... Animals cat = new Cat(); cat.call();//喵喵喵... } }
子类可以通过super调用父类的方法。
五、虚函数
虚函数的存在是为了多态。
Java 中其实没有虚函数的概念,它的普通函数就相当于 C++ 的虚函数,动态绑定是Java的默认行为。如果 Java 中不希望某个函数具有虚函数特性,可以加上 final 关键字变成非虚函数。
六、子类构造器
package com.nezha.javase; public class Animals { private String name; private String info; public void call(){ System.out.println("动物叫..."); } public void speak(String name,String info){ System.out.println(name +" --> " + info); } }
子类构造器可以通过super调用父类的构造器,前提条件一定是父类要有这个构造器。
package com.nezha.javase; public class Animals { private String name; private String info; public void call(){ System.out.println("动物叫..."); } public void speak(String name,String info){ super.speak(name, info); } }
七、继承的设计技巧
1、将公共操作和域放在超类
2、不要使用受保护的域
有些人认为protected是一个很好的选择,然后并不是。
子类集合是无限制的,任何一个人都能由其他基类派生出一个子类,并编写代码以直接访protected的实例域,从而破坏了封装线。
在Java程序设计语言中,在同一包中的所有类都可以访问protected域,而不管它是否为这个类的子类。不过,protected方法对于指示哪些不提供一般用途从而应在子类中重新定义的方法很有用。