Java继承详解

阅读: 评论:0

Java继承详解

Java继承详解

什么是继承,怎么继承?

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模,就好比人是父类,这时候学生和老师就可以作为子类,他们是对人这个大类其中一个类进行抽象,里面有这个类的属性和方法.继承是类与类之间的一种关系,除此以外,可以了解一下,类与类之间还有依赖,组合,聚合等关系,但我们主要只了解继承;继承关系的两个类,一个是子类,一个是父类,子类继承父类,我们是使用关键字extends来实现继承关系,extends的意思是"扩展",子类是父类的扩展.这里的继承是指子类继承父类,而父类也有可能是另外一个父类的子类,这里有点类似树这个数据结构,且我们要知道程序最高的类是Object,所有类都间接或直接的继承Object类.但这是体现在程序的底层,所以我们程序中最高的父类其实也是子类,是Object的子类.程序代码中是省略了extends Object.最后我们要注意Java中类只有单继承,没有多继承,就好比一个儿子只能有一个父亲.而当子类继承了父类之后,子类就会拥有父类的所有方法,但前提是父类方法的修饰符是public,一般情况下,父类的方法都是public修饰符的,而父类的属性一般是private修饰符,这时候子类就不能拥有父类的属性.总的来说无论是属性还是方法,私有的是无法被继承的.我们想象一个场景来理解,父亲有一千万这个属性和怎么赚一千万的方法,儿子不能直接继承得到父亲的一千万,但儿子可以调用父亲赚一千万的方法,当然在只是一个比喻,方便大家理解.

在程序中,我们一般使用super关键字对父类的属性或者方法进行调用.

我们先来看一段代码实现对属性值的调用:

首先是实现类(main方法类):

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        st("鸡块");//调用Student类的test方法实现对属性的调用,传入"鸡块"值
    }
}
然后是子类Student(继承父类Person):

public class Student extends Person{
    private String name = "麦乐鸡侠";//public:公共的
    public void test(String name){
        System.out.println(name);//鸡块
        (调用处传入过来的属性值;如果调用出是空参,那就输出本身调用者定义的值)
        System.out.println(this.name);//麦乐鸡侠(子类本身定义的属性值)
        System.out.println(super.name);//鸡块上校(父类定义的属性值)
    }
}
最后是父类Person:

public class Person /* extends Object */{
    //public->protected->default->private
    protected String name = "鸡块上校";//protect:受保护的
}

不难看出 : name , this.name和super.name分别调用不同的值,name输出的是实现类调用处触底过来的值,如果是空参,那就输出本身调用者定义的值.this.name输出的是子类Student也就是本身调用者定义的值,而super.name输出的是父类Person定义的值.而this在子类没有继承父类的情况下也可以使用,而super必须是在继承了的情况下才能使用.这就是继承的具体实现和作用.

再来看一段代码实现对方法的调用:

首先是实现类(main方法类):

public class Application {public static void main(String[] args) {Student student = new Student();st1();//调用Student类的test1方法实现对方法的调用}
}

然后是子类Student(继承父类Person):

public class Student extends Person{public void print(){System.out.println("Student");}//方法的调用public void test1(){print();//Student(方法是无法传递的,所以这里print是调用子类本身的print方法)this.print();//Student(子类本身定义的方法)super.print();//Person(父类定义的方法)}
}

最后是父类Person:

public class Person /* extends Object */{public void print(){ //如果这里修饰符是private,那子类是无法调用的System.out.println("Person");}
}

不难看出 : print, this.print和super.print分别调用不同的值,这里跟上面调用值不同的是,值是可以传递的,而方法无法传递,所以这里print和this.print都是调用子类本身的print方法,而super.print是调用父类定义的方法.注意:如果当父类的print方法修饰符是private私有时,子类是无法调用的.

以上就是super对属性和方法调用的叙述和代码实现了,这里再回顾一下构造器,我们知道,在调用类new一个类的时候,他是会在底层默认调用类的空参构造,这里要扩展的是,如果new的类有一个父类,那这时候new的类就作为子类了,在执行new的类这个子类的方法体之前,会先调用它的父类的空参构造,这是作为隐藏代码super()实现的,且这里还需要注意如果把这个代码写出来必须放在该构造方法第一行,而且是不能跟this()同时调用构造方法的.如果这里的父类不是空参构造是有参构造那就需要在子类中写有参构造调用父类了.这是需要大家注意的,是重点也是难点.我们来用代码实现看看:

首先是实现类(main方法类):

public class Application {public static void main(String[] args) {Student student = new Student();}
}

然后是子类Student(继承父类Person):

public class Student extends Person{private String name = "麦乐鸡侠";//公共public Student(){System.out.println("Student无参构造执行了");}
}

最后是父类Person:

public class Person /* extends Object */{public Person() {System.out.println("Person无参构造执行了");}
}

说了这么多super和this的关系,我们来对他们的使用做个总结:

super注意点:
    1.super是用来调用父类的构造方法,必须在构造方法的第一个
    2.super必须只能出现在子类的方法或者构造方法中!
    3.super和this不能同时调用构造方法!

this和super的区别:
    1.代表的对象不同
        this:代表本身调用者这个对象
        super:代表对父类对象的引用
    2.前提
        this:没有继承也可以使用
        super:必须在继承了的前提下才能使用
    3.构造方法
        this():本类的构造方法
        super():父类的构造方法
 

我们前面所说的都是父类的方法跟子类需要的方法完全匹配的情况,那如果父类的方法,子类不一定需要或者不一定满足,那应该怎么办呢?这个时候就有了重写的概念,这里可以理解为我们前面所说的,父类留了怎么赚一千万的方法给子类,而子类对父类的方法做出了修改,使这个方法更适合自己,这个就是重写的过程.这里我们要注意,重写一般都是针对方法而言的,跟属性没有关系.我们来看一段代码理解一下:

首先是实现类(main方法类):

public class Application {public static void main(String[] args) {//子类父类方法是静态方法还是非静态方法区别很大!//静态方法:方法的调用只跟左边(定义数据类型)有关//非静态方法:重写,修饰符都应该为public//静态方法和非静态方法的区别简单来说就是有没有static修饰符A a = new A();a.test();//A-->test//父类的引用指向了子类B b = new A();//子类A重写了父类B的方法b.test();//A-->test}
}

然后是子类Student(继承父类Person):

public class A extends B{@Override//注解:有功能的注释 override重写public void test() {System.out.println("A-->test");}
}

最后是父类Person:

//重写都是方法的重写,和属性无关
public class B {public void test() {System.out.println("B-->test()");}
}

这里a.test和b.test输出的都是A-->st大家能理解,但b.test是因为在子类A中重写了父类B的test方法,所以new A()new的是重写的方法,所以输出也为A-->test.这里可能有些难理解,因为它涉及到一些多态的知识,可以学习完多态再回来看,效果会更好.

最后我们对重写做了一个简单的总结:

为什么需要重写(alt+insert->override)?1.父类的功能,子类不一定需要或者不一定满足
重写:需要有继承关系,子类重写父类的方法!1.子类的方法和父类的方法方法名,参数列表必须要一致;而方法体不同2.修饰符:范围可以扩大,不能缩小  public>protected>default>private3.抛出异常:异常的范围可以缩小,但不能扩大ClassNotFoundException(小)-->Exception(大)4.重写一般是针对非静态方法,既方法修饰符都应该为public

以上就是我们对整个继承的一些了解,我们要知道一个类是由属性和方法构成的,这是根源,那一个类继承另一个类后,子类是可以调用父类的属性和方法的,这个调用的过程就需要弄清楚this和super的区别和关系,除此之外还能对方法进行重写,而这个过程就需要理解重写存在的意义,已经重写需要注意的地方.总而言之,要想学好继承,先搞清楚类的本质,再搞清楚子类和父类的定义,再就是this和super的关系和区别,最后就是理解重写的意义并掌握对方法的重写.这样一步步脚踏实地,就一定可以学好继承了.

本文发布于:2024-01-31 01:58:15,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170663749624518.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:详解   Java
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23