关于继承大家想到了什么?反正主播想到的只有继承家产家业,哈哈可能最近霸道总裁文看多了
那么我们今天学习的内容继承,其实理解起来与这个相似吖,就是《儿子继承父亲》的东西。
初识继承
我们为什么会用到继承,继承能做什么?我们先来举个荔枝,如果我这里有一只狗和我自己,我们之间是不是有很多共性(说我是狗的自觉点┗|`O′|┛ 嗷~~),我们都是生物(animal)那么我们会吃饭,睡觉,有名字,年龄。我们也有不同是不是,比如我能写代码,我能上早八这些都是狗做不到的,我们把相同的点放在一个类中(Animal),把不同的点我单独再开一个类(Dogs)来储存,我单开的类通过extends引用共同点的类,那么我们的单开的类Dogs就继承了Animal中的属性变量和方法,这个时候Dogs就成了子类,Animal就成了父类,我们通过方法调用子类中的一些方法也可以调用到父类中量,具体怎么去调用我们接下来详细说说……
上面代码中我们我们的方法运行时输出的是子类(Dogs)中的name和age,这说明我们程序在引用这些属性时,当我们的子类中有相关属性时就有先自己的成员,如果没有又是什么情况呢:如图:
好,上面我们方法要访问name和age量而我们的Dogs(子类)中没有这两个成员,这个时候我们就可以去访问我们父类中的变量了,我们父类中刚好有这两个成员,所以我们程序运行后输出的是我们父类中的量,从这个里我们可以看出我们的继承使用的一些规律,方法调用时若子类中有这个成员那么我们有限子类中的成员,若我们子类中没有这个成员,那么我们就去查看父类中是否有这个成员,若父类有这个成员,那么我们就输出父类的成员,那么如果子类父类都没有会怎么样呢?
答案是程序错误如图:
我们程序里没有eat成员就无法调用,程序错误。
当然我们子类自带的内容也可以直接访问,这就体现出我们继承的方便性了,我们通过这种方法可以减少重复的代码输入,使得我们的代码更加工整,比如我们再开一个Cat子类也继承Animal中的相同的成员属性,是不是会方便很多。
总结:
关于继承,我们的子类父类调用先后问题
1.方法访问的成员在子类中有对应的成员时我们优先子类自己的成员,子类优先
2.方法访问的成员在子类中没有,若父类中有那么我们调用父类成员
3.若子类父类都没有这个成员则为访问错误
关于子类父类同名访问父类问题和关键字super
我们在上面讲到的子类父类同名时访问优先考虑子类,那么我们想要访问我们父类的成员有什么方法吗?
有的有的,这里我们就引出新的关键之字super,它的作用就是在子类父类中访问父类。
下面我们通过代码来演示:
如上图我们的子类父类,其中我们方法调用时包含子类父类,那么我们这段代码中像plantA子类父类同名情况,当我们给的输入条件不同,就能控制运用哪个plantA,这里呢我们plantA(1)括号内提供了参数那么我们就是子类的方法运行,如果没有就是父类的方法运行,我们在子类plantB()中可以通过super调用父类的属性。
继承重写方法
重写方法:在子类方法中鼠标右键,找到生成或者快捷键(ait+insert),之后选中我们需要重构的
方法就生成了。
当子类与父类的方法名相同但返回内容不同时我们可以在子类中直接生成重写方法来实现子类方法与父类方法的继承关系,当我们在text中调用子类方法时它会优先输出子类方法,同样的,我们在子类中调用父类方法也是可以实现的,使用super即可调用,具体操作如图:
看这个代码:下面这个代码我们定义了两个子类Dogs和Cats,都实现父类的方法,我们在text中测试时调用子类中eat方法,输出我们子类中的内容(其实这里我们使用了super关键字,而我们父类Animal中的eat方法中并没有任何内容,所以我们看到子类的方法被输出,其实如果我们父类eat中有内容输出,那么我们测试时就是先出父类方法中的内容再是子类的内容)
而我们不使用super时,子类重写了父类方法后,方法调用的优先级始终是子类方法优先,不会默认执行父类方法。
import java.security.spec.DSAGenParameterSpec;
public class Animal {
public String name;
public int age;
public void animal(String name,int age){
this.age=age;
this.name=name;
}
public void eat(){
}
}
//子类1
public class Cats extends Animal{
@Override
public void animal(String name, int age) {
super.animal(name, age);
}
@Override
public void eat() {
super.eat();
System.out.println(age+"岁的"+name+"在吃鱼鱼");
}
//子类2
public class Dogs extends Animal {
@Override
public void animal(String name, int age) {
super.animal(name, age);
}
@Override
public void eat() {
super.eat();
System.out.println(name+"吃狗粮");
}
}
//测试
public class text {
public static void main(String[] args) {
Dogs dogs=new Dogs();
dogs.animal("小狗",3);
System.out.println("name:"+dogs.name+"age:"+dogs.age);
dogs.eat();
System.out.println("-------------");
Cats cats=new Cats();
cats.animal("小白",1);
cats.eat();
}
}
我们现在删除子类中的super内容那么我们现在运行就是子类的方法,我们再把父类eat方法给上内容看是否会有父类方法的输出:
import java.security.spec.DSAGenParameterSpec;
public class Animal {
public String name;
public int age;
public void animal(String name,int age){
this.age=age;
this.name=name;
}
public void eat(){
System.out.println(name+"在吃东西");
}
}
//子类1
import jdk.swing.interop.SwingInterOpUtils;
public class Cats extends Animal{
@Override
public void animal(String name, int age) {
super.animal(name,age);
}
@Override
public void eat() {
System.out.println(age+"岁的"+name+"在吃鱼鱼");
}
}
//子类2
public class Dogs extends Animal {
@Override
public void animal(String name, int age) {
super.animal(name, age);
}
@Override
public void eat() {
System.out.println(name+"吃狗粮");
}
}
//text
public class text {
public static void main(String[] args) {
Dogs dogs=new Dogs();
dogs.animal("小狗",3);
System.out.println("name:"+dogs.name+"age:"+dogs.age);
dogs.eat();
System.out.println("-------------");
Cats cats=new Cats();
cats.animal("小白",1);
cats.eat();
}
}
输出:
我们可以看到当我们删掉子类eat方法中的super后,即使我们父类中有方法内容也不会输出,这就是子类优先原则。
总结:
子类在继承父类后,我们访问子类方法时,优先在子类的范围里找,如果子类中没有这个方法我们才会去父类中寻找,如果父类中也没有这个方法则会报错,而我们在访问子类方法时如果想使用父类方法中的内容我们可以通过使用super来访问。
以上就是全部内容了
完