继承是面向对象的特征之一(封装,继承,多态),是指在父类中定义相关属性和方法,当子类需要使用父类属性和方法时,通过extends关键字获取,这样做减少代码量。
多态是指同一操作(同一方法)作用于不同的对象具有不同的结果,即一个事物具有多种形态,多态通过继承来实现。
- 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
- 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
- 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
- 多态情况下,不能访问子类特有的成员。
总结:多态情况下,子父类存在同名的成员时,访问的都是父类成员,除了在同名非静态函数时才是访问子类的。
下面借助一个事例来说明:
先定义一个父类Animal类,里面有一个voice方法。
父类:
public class Animals {
String voice;
public static void voice(String voice){
System.out.println(“动物叫声”+voice);
}}
再定义一个子类Dog类,继承了Animal类,并重写了Animal类中的voice方法
子类
public class Dog extends Animals{
static String dogVoice=“汪汪”;
public static void voice(String dogVoice){ System.out.println(“狗的叫是:”+dogVoice); }
}
如何在主函数中不定义字符串,直接通过构造方法传参来打印输出?
主类:
public class Zhu {
/** * @param args */
public static void main(String[] args) {
// TODO Auto-generated method stub Animals.voice(Dog.dogVoice);
}
}
这里有一个注意点:
当需要调用一个类中的属性和方法时,需要先将这个类实例化并通过对象名.的方式来调用
例如在Main中调用另一个类Dog类中的字符串String voice时,方法为Dog.dogvoice,同理,方法为Dog.voice
(类在使用之前必须实例化)
例如:Animals animal=new Animals()
这句话有以下意思:
实例化一个Animals类对象名为animals,并为其开辟空间。
Animals animals=new Dog();