目录
引述
Java当中创建的类通常有着很多属性,而大多数类一般都具有某些相同类型的属性,例如生活中的猫、狗,同属动物,它们有着许多相同的行为,比如说都有名字,都会吃饭,睡觉。
要描述清楚猫(A)和狗(B),可以有两种叙述方法:
1.A是动物,然后A是猫;B是动物,然后B是狗。
2.A和B都是动物,A是猫,B是狗。
对比之下可以发现第一种叙述方法很明显是多余的,因为A和B都是动物,完全没有必要分开来说,可以一次性说完。
第二种叙述方法在面向对象思想中的体现便是继承。继承主要解决的问题是:共性的抽取,实现代码复用。
继承的概念与语法
继承指的是,在保持原有类特性的基础上进行扩展,增加新功能。
而这个原有类,称为父类(基类),增加新功能后的类称为子类(派生类)。
Java中表示类与类之间的继承关系,通过关键字extends实现:
public class Animal {
String name;//名字
int age;//年龄
void eat() {
System.out.println(name + "is eating");
}
}
狗类:
public class Dog extends Animal {
void bark () {
System.out.println(name + "is barking");
}
}
猫类:
public class Cat extends Animal{
void meow() {
System.out.println(name + "is meowing");
}
}
应用:
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.name = "xixi ";
dog.bark();
cat.name = "haha ";
cat.meow();
//输出:
//xixi is barking
//haha is meowing
}
}
注意:
子类中必须创建新的成员变量或成员方法,否则就没必要继承了。
子类中创建的成员变量或成员方法名称注意和父类相区别,如果不慎子类父类有同名变量,则优先访问子类的。
通过子类进行访问,如果子类中有,则访问子类的,否则访问父类(如果父类有,没有则报错)。
在某些情况下,父类和子类的某些变量名相同是不可避免的,为了避免访问冲突,需要用到super关键字。通过super.变量名访问父类中的成员变量或成员方法。注意super只能在非静态方法中使用。
super关键字
super除了可以用来访问父类成员以外,在子类对象的初始化方面,同样有着大用途。
普通类实现初始化,需要用到this关键字。例如这样一个Person类:
而对于继承父类的子类对象的初始化,比如继承Person类的Student类,除了父类中这样写以外,子类中同样需要构造,只不过这里this需要改成super:
子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。
super的用法几乎和this一样,都只能访问非静态变量或方法,都要放在构造方法的第一行,且二者不能同时存在于同一构造方法中。区别在于this作用于本类,而super作用于父类。
IDEA中可以实现快速构造:
与继承设计初衷类似的还有组合, 也是为了提高代码的复用性。如果说继承是:子类 is a 父类,那么组合就是 组合对象 has a 子类。组合仅仅是将对象看作一个成员变量处理。