Java_继承使用细节全都在这了

哈喽,小琳我又来啦~~~Java_继承使用细节全都在这了

废话不多说,我今天总结了关于继承的9条细节,分成四个部分来讲,这是我花了接近一天的时间总结的知识点,希望对我也对你有所帮助哈!

继承快速入门:

package com.hspedu.extend.improve;
//测试
import com.hspedu.extend.Graduate;
import com.hspedu.extend.Pupil;

public class Extends01 {
    public static void main(String[] args) {
        com.hspedu.extend.Pupil pupil = new Pupil();
        pupil.name = "小明~";
        pupil.age = 10;
        pupil.setScore(90);
        pupil.testing();
        pupil.showInfo();
        System.out.println("=========");
        com.hspedu.extend.Graduate graduate = new Graduate();
        graduate.name = "大明~";
        graduate.age = 20;
        graduate.setScore(90);
        graduate.testing();
        graduate.showInfo();
    }
}
package com.hspedu.extend.improve;
//父类
public class Student {
    //共有属性
    public String name;
    public int age;
    private  double score;

    //共有的方法
    public void setScore(double score) {
        this.score = score;
    }

    public void showInfo(){
        System.out.println("小学生名" + name + "年龄" + age +"成绩" + score);
    }
}
package com.hspedu.extend.improve;
//子类
public class Graduate extends Student{
    public void testing(){
        System.out.println("小学生" + name + "正在考数学");
    }
}

继承使用细节1;子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问。

看一个例子:

package com.hspedu.extend.Extends02;

    //父类
    public class Bace { 
    //4个属性
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;
    // 无参构造器
    public Bace(){
        System . out . println("Base()....");
    }
    //父类提供一个public方法,返回n4
    public int getN4(){
        return n4;
    }
    public void test100() {
        System . out . println("test100");
    }
    protected void test200() {
        System.out.println("test200");
    }
    void test300(){
        System.out.println("test300");
    }
    private void test400(){
        System.out.println("test400");
    }
    }
package com.hspedu.extend.Extends02;
//子类
public class Sub extends Bace{
    public Sub() {
        System.out.println("sub...");
    }
    public void sayOk(){//子类方法
        //非私有的属性和方法可以在子类直接访问
        System.out.println(n1 + "" + n2 + "" + n3 );
        //但是私有属性和方法不能在子类直接访问
        test100();
        test200();
        test300();
        //test400();错误
        //通过父类提供的方法去访问
        System.out.println("n4=" +getN4());
    }
}
//测试
package com.hspedu.Extends02;

import com.hspedu.extend.Extends02.Sub;

public class Extend001 {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.sayOk();

    }
}

继承使用细节2:1.子类必须调用父类的构造器,完成父类的初始化 2.当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无 参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过.

在上面的例子中来看:

//父类
//    // 父类的无参构造器
//    public Bace(){
//        System . out . println("父类Base()....");
//    }
    //指定的有参构造器
    public Bace(String name,int age){
        System.out.println("父类Bace(String name,int age)构造器被调用");
    }
package com.hspedu.extend;
//子类
public class Sub extends Bace{
    //无参构造器
    public Sub() {
        /*
        当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器
        如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪一个构造器
        完成对父类的初始化工作,否则编译不会通过
         */
        //super();默认调用父类的无参构造器
        super("smkhy",10);
        System.out.println("子类sub...");
    }
    public Sub(String name){
        super("jhfg",23);
        //do nothing
        System.out.println("Sub(String name)构造器被调用");
    }
}
package com.hspedu.extend;
//测试
public class ExtendsDetail {
    public static void main(String[] args) {
        System.out.println("===第一个对象===");
        Sub sub = new Sub();//创建子类对象sub
        System.out.println("===第二个对象===");
        Sub sub2= new Sub("jgjyg");//创建子类对象sub2
    }
}

运行结果:Java_继承使用细节全都在这了

继承使用细节3:1.super在使用时,必须放在构造器的第一行,且只能在构造器中使用。2.super和this不能再一个构造器里面。3.如果希望指定去调用父类的某个构造器,则显式的调用一下。

再对上面的例子来看:

 //父类中再来一个有参构造器
    public Bace(String name){
        System.out.println("父类Bace(String name)构造器被调用");
    }
 //子类中再加一个构造器
    public Sub(String name,int age){
        //        super();//父类的无参构造器
        /*
        1.想要调用父类的无参构造器:要么什么都不写,要么用super()
        2.如果希望指定去调用父类的某个构造器,则显式的调用一下
         */
        //super在使用时,必须放在构造器的第一行,且只能在构造器中使用
        //super和this不能再一个构造器里面
        super("jyg");
        System.out.println("子类Sub(String name)被调用");
    }
//测试
//第三个对象
        System.out.println("===第三个对象===");
        Sub sub3= new Sub("jgjyg");//创建子类对象sub3

运行结果:

Java_继承使用细节全都在这了

继承使用细节4:1.java所有类都是Object的子类,输入ctrl+h就可以看到类的继承关系。2,父类构造器的调用不限于直接父亲,将一直网上追溯直到Object类(顶级父亲).3,不能滥用继承,子类和父类之间必须满足is-a的逻辑关系。

Java_继承使用细节全都在这了
java所有类都是Object的子类,输入ctrl+h就可以看到类的继承关系
Java_继承使用细节全都在这了

附上总体的代码啦:

父类:

package com.hspedu.extend;
//父类
public class Bace extends TopBace {
    //4个属性
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;
    // 父类的无参构造器
    public Bace(){
        System . out . println("父类Base()....");
    }
    //指定的有参构造器
    public Bace(String name,int age){
        //super();
        System.out.println("父类Bace(String name,int age)构造器被调用");//2
    }
    //父类中再来一个有参构造器
    public Bace(String name){
        System.out.println("父类Bace(String name)构造器被调用");
    }
    //父类提供一个public方法,返回n4
    public int getN4(){
        return n4;
    }
    public void test100() {
        System . out . println("test100");
    }
    protected void test200() {
        System.out.println("test200");
    }
    void test300(){
        System.out.println("test300");
    }
    private void test400(){
        System.out.println("test400");
    }
}

子类:

package com.hspedu.extend;
//子类
//输入ctrl+h就可以看到类的继承关系
public class Sub extends Bace{
    //子类中再加一个构造器
    public Sub(String name,int age){
        //        super();//父类的无参构造器
        /*
        1.想要调用父类的无参构造器:要么什么都不写,要么用super()
        2.如果希望指定去调用父类的某个构造器,则显式的调用一下
         */
        //super在使用时,必须放在构造器的第一行,且只能在构造器中使用
        //super和this不能再一个构造器里面
        super("jyg");
        System.out.println("子类Sub(String name)被调用");
    }
    //无参构造器
    public Sub() {
        /*
        当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器
        如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪一个构造器
        完成对父类的初始化工作,否则编译不会通过
         */
        //super();默认调用父类的无参构造器
        super("smkhy",10);
        System.out.println("子类sub...");
    }
    public Sub(String name){
        super("jhfg",23);
        //do nothing
        System.out.println("子类Sub(String name)构造器被调用");//3
    }
    public void sayOk(){//子类方法
        //非私有的属性和方法可以在子类直接访问
        System.out.println(n1 + "" + n2 + "" + n3 );
        //但是私有属性和方法不能在子类直接访问
        test100();
        test200();
        test300();
        //test400();错误
        //通过父类提供的方法去访问
        System.out.println("n4=" +getN4());
    }
}

创建一个TopBace类

package com.hspedu.extend;

public class TopBace {//父类是object
    public TopBace(){
        //super(); object的无参构造器
        System.out.println("构造器TopBace()被调用");//1
    }
}

测试:

package com.hspedu.extend;
//测试
public class ExtendsDetail {
    public static void main(String[] args) {
//        System.out.println("===第一个对象===");
//        Sub sub = new Sub();//创建子类对象sub
//        System.out.println("===第二个对象===");
//        Sub sub2= new Sub("jgjyg");//创建子类对象sub2
        //第三个对象
        System.out.println("===第三个对象===");
        Sub sub3= new Sub("jgjyg");//创建子类对象sub3

//        sub.sayOk();
    }
}

好了就到这里了,有什么建议可以在公众号后台联系我或者加我VX找我共同讨论学习都可以,拜拜。

Java_继承使用细节全都在这了


原文始发于微信公众号(易小琳):Java_继承使用细节全都在这了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/251563.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!