栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Java进阶] 普通类之间继承(调用 , 重写 , this关键字 , super关键字)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Java进阶] 普通类之间继承(调用 , 重写 , this关键字 , super关键字)

继承是类与类之间的关系,子类继承父类(除构造方法外)的所有内容

目录

继承属性

属性名不同

属性名相同

继承方法

方法名不同

方法名相同

什么是重写

子父类方法名相同时的调用

构造方法

完成子父类成员变量初始化

标准继承写法


继承属性

属性名不同

当父类和子类的成员变量名不同时,子类所继承父类成员变量,相当于复制一份在自己的类里

内存结构 : 创建子类对象并调用子类构造方法的同时 , 会调用父类的构造方法 , 在子类对象中开辟一块super的空间,用于存储父类的成员变量.

public class Fu{
    int a;
}

class Zi extends{
    //子类继承父类,相当于将父类属性赋值到子类中
    int b;
    
    public void show(){
        //2.类中调用直接使用
        System.out.println(a);
        System.out.println(b); 
    }
}

class Test{
    public static void main(String[] args){
        Zi zi = new Zi();
        //1.父类和子类成员变量名不同  使用引用去调用
        System.out.println(zi.a);
        System.out.println(zi.b);

        //2.通过类中方法调用成员变量
        zi.show()
    }
}

属性名相同

当父类成员变量, 子类成员变量, 局部变量 名字相同时,使用this和super关键字区分

1. java的就近原则,直接写a 指的是局部变量


2. this表示调用者,调用这个方法的是Zi对象,因此this.a是子类的成员变量
    这里注意!!!  当子类成员变量没有a的情况下 this.a会去父类找


3. super是Zi对象在堆内存创建的空间,存放父类的成员变量内容
 

public class Fu{
    int a = 100;
}

class Zi extends Fu{
    int a = 200;
    
    public void show(){
        int a = 300;
        //java的就近原则,直接写a 指的是局部变量
        System.out.println("局部变量 a:"+a);
        //this表示调用者,调用这个方法的是Zi对象,因此this.a是子类的成员变量
        //这里注意!!!  当子类成员变量没有a的情况下 this.a会去父类找
        System.out.println("子类成员变量 a:"+this.a);
        //super是Zi对象在堆内存创建的空间,存放父类的成员变量内容
        System.out.println("父类成员变量 a:"+super.a);
    }
}
class Test{
    public static void main(String[] args){
        Zi zi = new Zi();
        //1.类外访问无法访问到  子类继承下来的number(父类的number)
        System.out,println(zi.a);

        //2.通过类中方法调用
        zi.show();
    }
}

继承方法

方法名不同

问题 : 属性是在对象中开辟super空间 , 那么子类是怎么获取到父类成员方法的 

类中访问的三种形式:
1).  直接写方法名,默认是加this的,现在子类找,子类没有找父类        

      method1();
2).  现在子类找,子类没有找父类        

      this.method1();
3).  直接找父类        

      super.method1();

public class Fu{
    public void method1(){
        System.out.println("这是父类的method1方法");
    }
}

class Zi extends Fu{
    public void method2(){
        System.out.println("这是子类的method2方法");
    }

    //2.通过类中方法 调用父类方法
    public void show(){
        //类中访问的三种形式:
        //1).直接写方法名,默认是加this的,现在子类找,子类没有找父类
        method1();
        //2).现在子类找,子类没有找父类
        this.method1();
        //3).直接找父类
        super.method1();
    }
}

class Test{
    public static void main(String[] args){
        //1.创建Zi对象引用, 使用引用直接调用父类和子类的方法
        Zi zi = new Zi();
        zi.method1();
        zi.method2();
        
        //2.通过类中方法调用父类方法
        zi.show();
    }
}

方法名相同

继承方法时方法名相同的三种情况:

1. 子类想要和父类一模一样的方法, 直接继承, 不用编写额外代码

2. 子类想在父类原有方法的基础上, 在添加额外的逻辑, 使用super拿到方法, 并加强逻辑

3. 子类有完全不同的逻辑, 完全重写

什么是重写

方法重写在子父类中, 出现了方法名相同, 返回值相同(满足某种情况可以不同),参数列表相同的方法. 当父类的逻辑并不能满足子类需求时, 子类可以选择重写或加强父类方法的逻辑.

子父类方法名相同时的调用
public class Fu{
    public void show(){
        System.out.println("这是父类的show方法!");
    }
}

class Zi extends Fu{
    public void show(){
        //super.show(); //这句是继承父类show的内容
        System.out.println("这是子类的show方法!");
    } 
}

class Test{
    public static void main(String[] args){
        Zi zi = new Zi();
        //通过创建对象  使用引用调用的子类重写后的方法
        zi.show();
    }
}

构造方法

这里注意, 构造方法是不能被继承的, 类的构造方法是和类名相同, 因此不同的类是不同的构造方法.

构造方法是用来初始化成员属性的, 当编译器发现子类是继承父类的, 会在子类的所有构造方法中的第一行加上super(); 先初始化父类的构造方法, 我们也可以按照逻辑自己编写有参的super 初始化父类的构造方法.

完成子父类成员变量初始化
public class Fu{
    int a;
    //1.在父类中创建有参构造和无参构造
    public Fu(){
    }
    public Fu(int a){
        this.a = a;
    }
}

//2.子类继承父类
class Zi extends Fu{
    int b;
    //3.创建子类的有参构造,并将数据a通过super传给父类的构造方法,从而赋值
    public Zi(int a, int b){
        super(a);
        this.b = b;
    }
    public Zi(){
    }
}

class Test{
    public static void main(String[] args){
        //4. 创建Zi对象,通过构造方法初始属性值
        Zi zi = new Zi(10, 20);
    }
}

标准继承写法

1. 创建父类, 私有化属性, 创建属性的get/set方法, 创建构造方法(有参+无参)

2. 创建子类, 继承父类, 编写实体类的构造方法(包括super();)

3. 创建测试类, 创建子类对象, 使用构造方法初始值, 但由于父类属性是私有的, 子类继承后也是私有的,只能通过get/set 方法取值或者设置属性值

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/880725.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号