继承
1 java继承与C++继承的不同
java继承区别于C++继承的一大特点: java支持"多重继承", 即: B为C父,A为B父
一般情况下,java不支持多继承,即 public class C extends A,B {} is wrong!
但通过implements 可以变相使用多继承,
public class C implements A,B{}
(这里本质上是不同接口的使用,逗号分隔两个接口)
2 super和this
super用来使用父类的方法;this用来使用自己的方法:
class Animal { void eat()
{ System.out.println("animal : eat"); }
}
class Dog extends Animal
{ void eat() { System.out.println("dog : eat"); }
void eatTest()
{ this.eat();// this 调用自己的方法
super.eat();// super 调用父类方法 } }
3 构造器
构造器: 构造函数和构造方法
如果父类构造函数无参,则无需改变什么; 但如果父类构造函数有参,那么必须在子类中通过子类的构造函数中使用 super(int n); 相当于c++里的初始化列表
[例]
多态
1 什么是多态
可以通过相同的表达形式,实现不同的功能
2 多态的必要条件
- 继承 (继承抽象类)
- 重写 (重写抽象类,否则子类还是抽象类)
- 父类引用指向子类对象:Parent p = new Child(); (和c++不同,必须是父类引用p指向子类对象Child,没有指针)
abstract class Animal{ // 抽象类的抽象方法 abstract void eat(); } //猫类 class Cat extends Animal { public void eat(){ System.out.println("猫吃鱼"); } public void work(){ System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); } } public class Test { public static void main(String []args){ show(new Cat());// 以Cat对象调用show() show(new Dog());// 以Dog对象调用show() Animal a= new Cat(); //父类引用指向子类对象 || 向上转型,从a到Cat a.eat(); //调用Cat.eat() Cat c=(Cat)a; //a向下转型到c c.work(); //调用Cat的work } }
怎么实现继承和重写?
虚函数!
3 虚函数
虚函数的存在是为了多态。
和c++不同,Java不和c++一样使用virtual 作为虚函数前缀
Java 中其实没有虚函数的概念,它的普通函数就相当于 C++ 的虚函数,动态绑定是Java的默认行为。如果 Java 中不希望某个函数具有虚函数特性,可以加上 final 关键字变成非虚函数。
4 重写
java的super方法等价于c++中的初始化列表,