【精选】java继承进阶——继承的特点 this、super

 博主介绍

‍ 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】
点赞➕评论➕收藏 == 养成习惯(一键三连)
欢迎关注一起学习一起讨论⭐️一起进步文末有彩蛋
作者水平有限,欢迎各位大佬指点,相互学习进步!


目录

成员变量的访问特点

代码:

练习:

成员方法的访问特点

代码:

方法的重写 @Override

方法重写的本质

练习

画图

代码


成员变量的访问特点

  • 就近原则:谁离我近,我就用谁
  • 先在局部位置找,本类(this)成员位置找,父类成员(super)位置找,逐级往上
代码:
package demon3;

public class Test {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.ziShow();
    }
}

class Ye {
    String name = "Ye";
}

class Fu extends Ye{
    String name = "Fu";
}

class Zi extends Fu{
    String name = "Zi";
    public void ziShow(){
        String name = "ziShow";
        System.out.println(name);//ziShow
        System.out.println(this.name);//Zi
        System.out.println(super.name);//Fu
    }
}


  1. System.out.println(name);将输出ziShow。这是因为在ziShow()方法的作用域中,存在一个局部变量name,它的值被赋为"ziShow",所以在当前作用域内,最近的定义的name变量即是这个局部变量。
  2. System.out.println(this.name);将输出Zi。这是因为this关键字表示当前对象(Zi类的实例对象),所以this.name表示当前对象的name属性的值,而Zi类中定义的name属性为"Zi"
  3. System.out.println(super.name);将输出Fu。这是因为super关键字表示父类对象(Zi类的父类Fu的实例对象),所以super.name表示父类对象的name属性的值,而Fu类中定义的name属性为"Fu"
练习:
  • //如何打印Zi
  • //如何打印Fu
  • //如何打印喝茶
  • //如何打印吃鸡
package demon3;
public class Test {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.show();
    }
}

class Fu {
    String name = "Fu";
    String hobby = "喝茶";

}

class Zi extends Fu {
    String name = "Zi";
    String game = "吃鸡";

    public void show() {
        //如何打印Zi
        System.out.println(name);
        System.out.println(this.name);
        
        //如何打印Fu
        System.out.println(super.name);
        
        //如何打印喝茶
        System.out.println(hobby);
        System.out.println(this.hobby);
        System.out.println(super.hobby);
        
        //如何打印吃鸡
        System.out.println(game);
        System.out.println(this.game);
    }
}


成员方法的访问特点

  • 直接调用满足就近原则:谁离我近,我就用谁
  • super调用,直接访问父类
代码:
package demon3;
public class Test {
    public static void main(String[] args) {
        OverseasStudent s = new OverseasStudent();
        s.lunch();
    }
}

class Person {
    public  void eat() {
        System.out.println("吃米饭,吃菜");
    }

    public void drink() {
        System.out.println("喝开水");
    }
}

//留学生
class OverseasStudent extends Person{
    public void lunch(){
        this.eat();//吃意大利面
        this.drink();//喝凉水

        super.eat();//吃米饭,吃菜
        super.drink();//喝开水
    }

    //应用场景:当父类中方法,不能满足子类现在的需求时,我们就需要把这个方法进行重写。
    //注意:子类中重写的方法上面需要加上@override
    @Override
    public  void eat() {
        System.out.println("吃意大利面");
    }

    @Override
    public void drink() {
        System.out.println("喝凉水");
    }

}




class Student extends Person{

    public void lunch(){
        //先在本类中查看eat和drink方法,就会调用子类的,如果没有,就会调用从父类中继承下来的eat和drink方法
        this.eat();
        this.drink();

        //直接调用父类中的eat和drink方法
        super.eat();
        super.drink();
    }

}

方法的重写 @Override

当父类的方法不能满足子类现在的需求时,需要进行方法重写。

书写格式 :

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

@Override重写注解

1.@Override是放在重写后的方法上,校验子类重写时语法是否正确。

2.加上注解后如果有红色波浪线,表示语法错误。

建议:重写的方法尽量和父类保持一致

方法重写的本质

【精选】java继承进阶——继承的特点 this、super_第1张图片

练习

现在有三种动物:哈士奇、沙皮狗、中华田园犬

暂时不考虑属性,只要考虑行为。

请按照继承的思想特点进行继承体系的设计。

**三种动物分别有以下的行为: **

  • 哈士奇: 吃饭(吃狗粮)、喝水、看家、拆家

  • 沙皮狗: 吃饭(吃狗粮、吃骨头)、喝水、看家

  • 中华田园犬:吃饭(吃剩饭)、喝水、看家

画图

【精选】java继承进阶——继承的特点 this、super_第2张图片

代码

总共要写5个代码

【精选】java继承进阶——继承的特点 this、super_第3张图片

Dog(父类)

package demon3;

public class Dog {
    public void eat(){
        System.out.println("狗在吃狗粮");
    }

    public void dirink(){
        System.out.println("狗在喝水");
    }

    public void lookhome(){
        System.out.println("狗在看家");
    }
}

Hsky

package demon3;

public class Hsky extends Dog{
    //哈士奇多一个拆家
    public void breakhome(){
        System.out.println("哈士奇在拆家");
    }
}

shapi

package demon3;

public class shapi extends Dog{
    //因为沙皮狗吃的是狗粮和骨头
    //父类中的方法不能满足我们的需求了,所以需要进行重写


    @Override
    public void eat() {
        super.eat();//狗在吃狗粮
        System.out.println("狗在啃骨头");

    }
}

chinaDog

package demon3;

public class chinaDog extends Dog{
    @Override
    public void eat() {
        System.out.println("吃剩饭");
    }
}

测试类DogTest

package demon3;

import demon.Hahky;

public class DogTest {
    public static void main(String[] args) {
        //创建对象并调用
        Hahky h = new Hahky();
        h.eat();
        h.breakhome();
        h.drink();
        h.lookhome();

        System.out.println("-----------------------------------------");

        chinaDog c = new chinaDog();
        c.eat();
        c.lookhome();
        c.dirink();

    }
}

【精选】java继承进阶——继承的特点 this、super_第4张图片

你可能感兴趣的:(小白学JAVA,web,java,开发语言,网络,网络安全,服务器,php)