继承
继承是有已存在的类产生新类的一种机制,产生的新类叫做子类,原来的类叫做父类。子类继承了父类的部分成员变量和方法(私有变量和方法不会被继承)。并在父类变量和方法的基础上进行一定的扩充和重写。用extends关键字来来生成一个子类。
protect(受保护的)
受保护的方法和成员变量可以被其子类和间接子类继承,比如:B是A的子类,而C又是B的子类,那么在C中就可以直接用“.”运算符对A中受保护的变量和方法进行访问和调用。当在另一个没有继承关系的类,比如说D类中利用C的对象进行访问受保护的类或方法时分为两种情况:
1、访问C中受保护的变量和方法时,必须保证D类与C类同包。
2、访问A中受保护的变量和方法时,必须保证D类与A类同包。
子类对象的构造过程
当我们利用子类创建一个对象时,它同时会利用指定的构造方法(如果未指定则会利用无参的构造方法为父类创建对象)为父类也创建一个对象。这个过程是在子类构造方法体的第一行利用super关键字指定的。例如:super(); 表示利用父类无参构造方法创建父类对象,super(a,b); 则表示利用有两个参数的构造方法创建对象,其中a,b代表参数。
与继承有关的多态
在介绍多态之前,我们先介绍对象的上转型变量。
对象的上转型变量
举个例子,我们经常会说“老虎是哺乳动物,狗是哺乳动物”。在我们说这句话的时候就已经强调的不是“老虎是老虎”这个本质特点了,而是把老虎的本质上升到了哺乳动物,那么这么说来老虎就会失去了作为老虎的独有特征,只保留了其作为哺乳动物的共同特征。
假如B是A的子类,我们用A(父类)声明一个对象,然后给这个对象赋予一个B对象(子类)的引用:
A a;
a = new B();
//或者
A a;
B b = new B();
a = b;
那么就把a叫做b对象的上转型对象。
对象的上转型对象有两个特点:
‘1、作为对象的上转型对象,他会失去一些属性(子类新增的属性),失去一些方法(子类新增的方法),对于失去的属性和方法该上转型对象将失去操作的权力。
2、上转型对象可以操作子类继承的或者隐藏了的属性,上转型对象可以操作子类继承或者重写了的方法。当用上转型对象操作子类的方法时与子类对象操作一样,也就是说如果该子类重写了父类的方法,那么上转型变量操作该方法时表现的结果是重写后的结果。当上转型变量操作子类隐藏了的属性时所表现的结果是父类属性的结果。
多态
正是由于上转型变量对重写的方法操作的特点,才造就了与继承有关的多态表现。
假如Dog是Animal的子类,Cat也是Animal的子类,Dog和Cat都重写了Animal的方法cry。那么当我们分别用Dog和Cat的对象的上转型变量调用cry方法是就会有不同的表现。
package com.mfs.test;
class Animal{
void cry() {
}
}
class Dog extends Animal{
void cry() {
System.out.println("汪汪");
}
}
class Cat extends Animal{
void cry() {
System.out.println("喵喵");
}
}
public class Example {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal = new Dog();
animal.cry();
animal = new Cat();
animal.cry();
}
}
结果为:
可以看到我们用同一个对象animal调用同一个方法cry();但却给出了截然不同的结果,这便是与继承有关的多态。