首页 > 其他分享 >详解:this和super的区别

详解:this和super的区别

时间:2024-10-27 20:16:01浏览次数:7  
标签:调用 name 区别 子类 详解 父类 super public

        在Java编程中,thissuper是两个非常关键的关键字,它们各自有独特的作用和用途。理解这两个关键字对于掌握Java面向对象编程非常重要。

this关键字

this关键字用于引用当前对象。它可以用于以下场景:

  1. 解决成员变量与局部变量名冲突:当局部变量与成员变量同名时,可以通过this关键字来区分。
  2. 在构造器中调用另一个构造器:一个构造器内部可以通过this()调用另一个构造器(必须是第一条语句)。
  3. 返回当前对象的引用:在一些情况下,this可以用于返回当前对象的引用。
  4. 在继承关系的条件下,如果子类没有和父类一样的非私有属性和方法(访问修饰是默认、protectedpublic的),子类可以通过this调用父类的属性和方法。其实在继承关系下,父类的非私有的属性和方法在子类中都可以直接调用,非继承关系但在同一个包的条件下,其他类也可以通过创建对象(你想访问的对象)调用他的非私有成员(属性和方法)

示例

public class Example {  
    private int number;  
  
    // 构造器1  
    public Example() {  
        this(0); // 调用构造器2  
    }  
  
    // 构造器2  
    public Example(int number) {  
        this.number = number; // 解决局部变量与成员变量名冲突  
    }  
  
    public Example getInstance() {  
        return this; // 返回当前对象的引用  
    }  
  
    public void printNumber() {  
        System.out.println(this.number);  
    }  
  
    public static void main(String[] args) {  
        Example example = new Example(5);  
        example.printNumber(); // 输出5  
    }  
}


super关键字

super关键字用于引用当前对象的直接父类(超类)。它可以用于以下场景:

  1. 访问父类的成员(字段和方法):当子类隐藏(重写)了父类的成员时,可以通过super来访问父类的成员。
  2. 调用父类的构造器:在子类的构造器中,super()用于调用父类的构造器(必须是第一条语句,如果父类没有无参构造器,则必须显式调用)。
  3. 在继承关系的条件下,如果子类没有和父类一样的非私有属性和方法(访问修饰是默认、protectedpublic的),子类可以通过super调用父类的属性或方法。其实在继承关系下,父类的非私有的属性和方法在子类中都可以直接调用。

示例

class Parent {  
    private String name = "Parent";  
  
    public Parent() {  
        System.out.println("Parent constructor called");  
    }  
  
    public void printName() {  
        System.out.println(name);  
    }  
}  
  
public class Child extends Parent {  
    private String name = "Child";  
  
    // 调用父类的构造器  
    public Child() {  
        super(); // 必须是第一条语句  
        System.out.println("Child constructor called");  
    }  
  
    // 隐藏父类的方法  
    @Override  
    public void printName() {  
        super.printName(); // 调用父类的方法  
        System.out.println(this.name);  
    }  
  
    public static void main(String[] args) {  
        Child child = new Child();  
        child.printName();  
        // 输出:  
        // Parent constructor called  
        // Child constructor called  
        // Parent  
        // Child  
    }  
}

解释:为什么会输出  Parent constructor called  和  Child constructor called  两条语句?

        因为在创建Child对象时调用了子类Child的无参构造方法,而子类的无参构造方法又调用父类Parent的无参构造方法,不理解的小伙伴可以看看另一期刊:

面向对象的三大特征-CSDN博客


 例题1:问Father类和Son类中通过this和super都可以调用哪些属性和方法?

public class Grand {
    String name="爷爷";
    private int age = 88;
    public void method(){}
}
class Father extends Grand{
    String id ="01";
    private double score;
    public void work(){
        //方法体内this可以访问哪些成员?
        // super可以访问哪些成员?
    }
}
class Son extends Father{
    String name="儿子";
    public void study(){}
    private void show(){
        //方法体内this可以访问哪些成员?
        // super可以访问哪些成员?
    }
}

答案:

  • Father类this调用的成员:
//调用Grand类
this.name;     //调用Grand类的name
this.method(); //调用Grand类方法
//下面都是调用本类的成员
this.id;  
this.score=100.0;
this.work();
  • Father类super 调用的成员:
//调用父类Grand的非私有成员
super.name;
super.method();

解释: 在继承关系的条件下,子类Father没有和父类Grand一样的非私有属性(name),所以可以用this.name调用父类的属性,即使你不使用this或super,只要父类的属性不是private的,子类也可以直接访问它,因为子类继承了父类的默认、protectedpublic成员。

  • Son类this调用的成员:
this.name; //注意:因为子类有和父类Grand一样的属性name,所以调用的是自己的name属性
this.id; //调用父类Father的属性id
this.method(); //调用父类Grand非私有method方法
this.work();//调用父类Father非私有work方法
this.show();//递归调用
this.study();//调用本类的方法
  •  Son类super调用的成员:
//调用父类Grand的非私有成员
super.name;
super.method();
//调用父类Father的非私有成员
super.id;
super.work();

 解释:super关键字是从父类开始查找成员,例如先查找Son的父类Father的成员,如果没有Father类没有name属性,那么就往上继续查找Grand类的name属性,如果有则返回,没有则报错!

例题2: 下面代码的输出结果是什么?

public class Father {
    String name ="Rose";
    Father(){
        System.out.println("调用Father()无参构造方法。。");
    }
    Father(String name){
        this.name=name;
    }

}
class Son extends Father{
    String name="Jack";
   Son(){
       super();
       System.out.println("调用Son()无参构造方法。。");
   }
   Son(String name){
       super(name);
   }
   public void test(){
       System.out.println(super.name);
       System.out.println(this.name);
   }

    public static void main(String[] args) {
        new Son().test();//匿名对象:仅使用一次,用完后废弃
        new Son("john").test();
    }
}

答案:

调用Father()无参构造方法。。
调用Son()无参构造方法。。
Rose
Jack
john
Jack

解释:

  • new Son()创建对象时调用子类无参构造器,但在调用子类无参构造器之前会默认父类的无参构造器 ,所以第一句输出:调用Father()无参构造方法。。
  • 在test方法中输出父类和子类name属性
  • new Son("john")调用子类的有参构造器,方法体中写了super(name);调用父类的有参构造器(如果不写 super(name);会默认调用父类的无参构造器),然后将John 传给了父类属性,此时Father类的name是John
  • 在test方法中输出父类和子类name属性(即John和Jack)

区别总结

  • 作用对象this引用当前对象,super引用当前对象的直接父类。
  • 用途this主要用于解决成员变量与局部变量名冲突、调用另一个构造器、返回当前对象的引用;super主要用于访问父类的成员(字段和方法)、调用父类的构造器。
  • 使用场景this通常用于当前类内部,super通常用于子类内部访问父类。
  • 在继承关系的条件下,如果子类没有和父类一样的非私有属性和方法(访问修饰是默认、protectedpublic的),子类可以通过this或super调用父类的属性和方法。其实在继承关系下,父类的非私有的属性和方法在子类中都可以直接调用

标签:调用,name,区别,子类,详解,父类,super,public
From: https://blog.csdn.net/2401_83418369/article/details/143198977

相关文章

  • PLC 编程和 IIOT 工业物联网的区别是什么
    PLC编程和IIOT工业物联网的区别:1.技术定义和应用范围;2.功能特性对比;3.系统架构差异;4.数据处理方式;5.未来发展趋势。PLC主要负责现场控制和设备直接管理,而IIOT则担负着将设备数据互联互通、优化整体生产流程的任务。1.技术定义和应用范围PLC编程:是指利用一种专门的编程......
  • 【详解】多状态DP:买卖股票的最佳时机 系列问题
    一.解法思路买卖股票的最佳时机系列是十分经典的多状态DP问题。分析这种多状态DP问题我们可以借助状态机的思想。我们可以根据问题分析出这个问题有几个状态,每个状态之间是怎么转化的。通过转化的方式我们可以写出状态转移方程。状态转移方程这个很好理解,就是状态要转移时要付......
  • 静态网页和动态网页有什么区别
    ​​静态网页和动态网页在构建和呈现方式上存在显著差异。本文探讨了静态网页与动态网页的区别,包括:1.页面内容生成方式;2.用户交互性;3.数据加载方式;4.适用场景差异;5.网站性能影响。深入剖析了这两种网页类型的技术特点,为读者更好地理解和选择适当的网页类型提供了参考。1.......
  • ubuntu ftp 服务器搭建及vsftpd.conf配置实例详解
    一、ftp服务器搭建与简单配置总结一下步骤吧:1、安装sudoapt-getinstallvsftpd可查看版本号命令vsftd-v2、修改配置文件/etc/vsftpd.conf根据具体的情况进行修改,去掉注释等,接下来会详细介绍。3、重启vsftpd服务sudoservicevsftpdrestart然后查看服务是否成......
  • tf卡和sd卡有什么区别
    本文深入探讨了移动存储设备中常见的两种格式:TF卡(TransFlashCard)和SD卡(SecureDigitalCard)之间的区别。虽然这两种卡在外观和功能上看似相似,但它们在设计、容量、速度以及与不同设备的兼容性方面存在显著差异。文章内容包括:1.各自的历史和发展;2.物理尺寸和形状的对比;3.存储容量......
  • TCP与UDP的区别和应用场景
    TCP和UDP的区别包括:1.连接方式不同;2.传输可靠性不同;3.数据顺序性不同;4.速度和延迟不同;5.头部大小不同;6.应用场景不同。TCP是一种面向连接、可靠的传输协议,主要用于需要数据完整性和顺序的应用,如Web浏览和电子邮件。而UDP是一种无连接、速度更快但可能丢失数据的协议,常用于流媒体......
  • kubernetes中的微服务详解
    华子目录什么是微服务微服务的类型ipvs模式ipvs模式配置方式注意微服务类型详解`ClusterIP`类型`Services`创建后`集群DNS`提供`解析``ClusterIP`中的特殊模式:`headless无头服务`NodePort类型访问过程NodePort默认端口`LoadBalancer`类型访问过程metalLBmetalLB功能......
  • Openwrt编译后生成的固件区别
    Openwrt编译后生成的固件区别2024-07-02固件格式:kernel:内置最简文件系统的Linux内核,适用于首次安装或故障恢复sysupgrade:从本来就是openwrt的固件基础上升级,或者无刷机引导限制的机器上直接刷入此格式文件factory:用于从设备的原厂固件刷入factory,再刷入breed之类不死......
  • 同步电机与异步电机的区别
    同步电机和异步电机是电机领域中常见的两种类型,它们在工作原理、性能特点和应用领域上存在显著差异。本文将深入探讨同步电机和异步电机之间的区别,以帮助读者更好地理解它们的运行原理和适用场景。引言电机是现代工业和家庭中不可或缺的设备之一。同步电机和异步电机是两种常......
  • SSD和HDD在数据恢复难易程度上有什么区别_1
    固态硬盘(SSD)和机械硬盘(HDD)在数据存储技术上有着本质的不同,这些差异直接影响到数据恢复的难易程度。这两种存储技术在数据恢复方面的差异,包括:1.存储技术和数据丢失风险;2.数据恢复技术;3.恢复过程中的挑战;4.数据恢复成功率;5.数据恢复成本;6.预防和备份策略;7.未来趋势。1.存储技术和......