想分享一下我学到的关于继承的知识:

此时我有两个类,类名1:Cat   类名2:Dog

public class Cat {
    public int age;
    public String name;

    public void ear(){
        System.out.println(this.name+"正在吃猫粮");
    }
}

public class Dog {
    public int age;
    public String name;

    public void eat(){
        System.out.println(this.name+"正在吃狗粮");
    }
}

要向描述一只猫的话,这只猫肯定有名字和年龄吧?同样的,描述一只狗,这只狗也有名字和年龄

但如果有十只,十几只动物呢?难道我要在这么多类里都写上 public int age和public String name吗?这个时候,就能体现出Java牛福之处了,在Java中,有继承这一说法

继承是什么?有什么用?怎么继承?

一、介绍继承

  1.在继承中,有两种类,父类(基类/超类)和子类(派生类),我们可以提取出这一堆子类中的共同点,放到父类里,保留子类的特殊独有代码,等子类继承父类里的东西后,就相当于子类里有了父类里的代码。

接下来,我们按一中说的,删去猫类和狗类中共有的代码,只保留各自的特殊代码

public class Cat {

    public void eat(){
        System.out.println(this.name+"正在吃猫粮");
    }
}
public class Dog {

    public void eat(){
        System.out.println(this.name+"正在吃狗粮");
    }
}

随后,我们创造父类,都是动物的话吗,我们可以将父类定义为Animal

public class Animal {
    public int age;
    public String name;
}

这两行就是猫类和狗类中共有的代码,接下来就是如何继承,非常简单

语法:子类名 + extends + 父类名

实例:

public class Cat extends Animal{

}

public class Dog extends Animal{

}

这样,我们就成功继承了父类,接下来测试父类的代码是否成功继承给了子类

public class Dog extends Animal{
    
    public void eat(){
        System.out.println(this.name+"正在吃狗粮");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.age = 100;
        System.out.println(dog.age);
    }
}

可以看到,Dog这个类里,没有age这个成员变量,但我们在main方法里不仅通过dog这个引用访问到了age,还对其进行了修改并访问,此时子类成功继承了父类里的代码

2.继承的作用

  通过上面的例子可以看到,继承让我们在敲代码的时候做到的省时省力,做到了代码的复性使用,这就是继承的好处

二、super

  跟this很像,用于指向父类的成员

上实例:

public class Animal {
    public int age=100;
    public String name;
}
public class Dog extends Animal{

    public int age = 10000;
   public void func1(){
       System.out.println(age);
   }
    public void eat(){
        System.out.println(this.name+"正在吃狗粮");
    }
}

此时,在Dog中有个age变量值为10000,而父类当中的age变量值为100

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
       dog.func1();//打印结果为子类的age,10000
    }
}

那么我在main方法中访问这个age,打印结果是子类的10000,还是父类的100呢

打印结果为子类的10000

为什么呢?原因是因为func1方法中的这一行

System.out.println(age);

其实一直有个隐藏的this,所以这一行其实长这样

System.out.println(this.age);

这个this指向的当然是子类的age变量而非父类,所以打印结果为子类的age

如果我们要打印父类的age,该怎么办呢?这个时候就体现出了super的作用了

前面说过super和this其实很像,所以用法也是一样的,super + "."后加变量或方法,当然,加的要是非静态的

所以我们把func1改成这样就可以成功访问到父类的age了

public void func1(){
    System.out.println(super.age);
}

父类和子类同时出现age,这种现象叫做重写,不仅是变量,方法也有重写

public class Animal {
    public int age=100;
    public String name;

    public void test1(){
        System.out.println("父类的test1");
    }
}
public class Dog extends Animal{
    
   public void test1(){
       System.out.println("子类的test1");
   }
    public void eat(){
        System.out.println(this.name+"正在吃狗粮");
    }
}

可以看到父类和子类都有test1方法,那么跟变量一样,main方法中若访问test1方法,则优先访问子类的test1,同理,如果我们想要访问父类中的test1方法,可以用super.test1

public void test1(){
    System.out.println("子类的test1");
    super.test1();
}

这样我们就成功的在main方法中访问到了父类的重写方法

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐