1.啥是继承
2.父类成员访问
3.super关键字(VS this)
4.父类构造方法
什么是继承?
继承在生活中有很多情况,比如继承了你爹的遗产,或者是你遗传了你爸爸的基因,简单来说你就拥有了你爸爸的一部分,而代码中的继承也大同小异,
比如,写两个类,分别是狗类和鸟类
class Dog{
public String name;
public int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public void eat(){
System.out.println(name + " 正在吃狗粮");
}
public void swim(){
System.out.println(name + " 正在狗刨游泳");
}
}
class Bird{
public String name;
public int age;
public Bird(String name, int age) {
this.name = name;
this.age = age;
}
public void eat(){
System.out.println(name + " 正在吃虫子");
}
public void fly(){
System.out.println(name + " 正在飞");
}
}
狗和鸟都是动物,从两个类来看,它们都有名字name,年龄age,并且都会eat吃这个方法,name,age,eat这些都是它们的共性,所以我们可以把它们的共性抽取出来放在Animals类里面,Animals是动物,而鸟和狗从属于Animals,这就出现了包含关系,所以Animals中的eat吃可以被鸟和狗继承,而在代码中的表现就是,鸟和狗继承了Animals后,就拥有了Animals里的eat,而不用再单独给猫狗类分别写eat,当然,Animals中的成员变量也可以被继承
实现继承关系后(相对而言)
Animals类被称为父类/超类/基类
Dog类和Bird类被称为子类/派生类
我们用extends关键字来继承
class Animals{
public String name;
public int age;
public void eat(){
System.out.println(name + "正在吃饭");
}
}
class Dog extends Animals{
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public void swim(){
System.out.println(name + " 正在狗刨游泳");
}
}
class Bird extends Animals{
public Bird(String name, int age) {
this.name = name;
this.age = age;
}
public void fly(){
System.out.println(name + " 正在飞");
}
}
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog("狗子",3);
Bird bird = new Bird("小鸟",2);
dog.eat();
bird.eat();
}
}
从代码来看,狗和鸟继承Animals类后,不需要再写父类里有的成员(name,age,eat)
继承的本质就是:共性的抽取,实现对代码的复用
访问父类的成员
1.在子类中访问父类的成员变量
(1).父类变量与子类变量不重名
(2).父类和子类变量重名
父类和子类中如果出现重名变量,则会优先访问子类的变量
那要是非要在重名的情况下访问父类的变量,则用super关键字来进行访问
用super就可以访问到父类的重名变量
总结:成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。如果访问的变量父类与子类都没有,则编译错误
2.在子类中访问父类的成员方法
(1).子类方法与父类方法不重名
class Base{
public void methodA(){
System.out.println("父类方法");
}
}
class Derived extends Base{
public void methodB(){
System.out.println("子类方法");
}
public void methodC(){
methodA();
methodB();
}
}
public class Demo2 {
public static void main(String[] args) {
Derived derived = new Derived();
derived.methodC();
}
}
总结:成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。
(2).子类方法与父类方法重名
与访问重名的父类变量一样,会优先访问子类里的重名方法
子类方法可以与父类方法实现方法重载,代码会根据重载方法的参数来实现对应方法
同样的,如果我们非要访问父类的重名方法也同样是调用super关键字来访问
总结:
通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;
不能在非静态的方法里访问静态的成员方法,如果访问的方法是静态的,子类方法,得先创建子类对象,调用对象来访问,而访问静态的父类方法,可以用类名来访问
super关键字
super关键字,该关键字主要作用:在子类方法中访问父类的成员。
【注意事项】
1. 只能在非静态方法中使用
2. 在子类方法中,访问父类的成员变量和方法。
在上面的代码调用过super作为示例,这里不过多介绍
父类构造方法
父子父子,先有父再有子,即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。
class A{
int a;
int b;
public A(int a, int b) {
this.a = a;
this.b = b;
}
public void methodA(){
System.out.println("这是父类的成员方法");
}
}
class B extends A{
public B(int a, int b) {
super(a, b);
}
int c;
int d;
public void methodB(){
System.out.println("这是子类的成员方法");
}
}