【Java面向对象】继承的认识与实现(2) 关键字 this 与 super 区别

简介: 【Java面向对象】继承的认识与实现(2) 关键字 this 与 super 区别

this 的初步认识


Q:什么是 this 关键字


A: this是当前对象的引用,就是说当前用构造函数建的对象是谁,这个this就代表谁,它是一个引用。


Q:怎么使用 this 关键字


我们来看下面这个案例。


public class Text {
  public static void main(String[] args) {
       student stu = new student("cc");
       stu.info();
   }
}
class student {
   String name;
   public student(String sname) {
       name = sname;
   }
   public void info() {
       System.out.println(name);
   }
}


在这个案例里面,我们通过调用构造器来对name赋值,由于sname与name不能相同,这就让构造器看起来就很奇怪,有没有什么方法可以把构造器的形参直接写成属性名呢。


我们使用this关键字就可以了!


public class Text {
  public static void main(String[] args) {
       student stu = new student("cc");
       stu.info();
   }
}
class student {
   String name;
   public student(String name) {
       this.name = name;
   }
   public void info() {
       System.out.println(name);
   }
}



Q: this 关键字有什么用处


this.data : 用来访问本类的成员方法。

举个例子(上面那个就是)

this.func(): 用来在普通成员方法中调用另一个成员方法。

举个例子

public class Text {
  public static void main(String[] args) {
       student stu = new student("cc");
       stu.Class();
   }
}
class student {
   String name;
   public student(String name) {
       this.name = name;
   }
   public void Class() {
       System.out.println(name+"上课");
       this.Homework();
   }
   public void Homework() {
       System.out.println(name+"正在写作业");
   }
}


this(): 用来访问本类的成员方法。


举个例子

public class Text {
   public static void main(String[] args) {
       student stu = new student();
       stu.show();
   }
}
class student {
   String name;
   public student() {
       this("cc");
   }
   public student(String name) {
       this.name = name;
   }
   public void show() {
       System.out.println(name);
   }
}


注意: this() 不能使用在普通方法中 只能写在构造方法中,而且必须是构造方法中的第一条语句。



super 的初步认识


Q:什么是 super 关键字


A: supe在java的子类中指代父类引用。


Q: super 关键字的作用


调用父类被子类重写的方法

调用父类被子类重定义的字段(被隐藏的成员变量)

调用父类的构造方法


Q: super 关键字的特点


我们来看下面这个案例。


class Animal {
  //构造函数
  public Animal() {
  System.out.println("Animal类的无参数构造函数执行");
  }
}
class Cat extends Animal{
  //构造函数
  public Cat() {
  System.out.println("Cat类的无参数构造函数执行");
  }
}


当我们new一个新的cat类的时候,会出现运行结果:


Animal类的无参数构造函数执行
Cat类的无参数构造函数执行


为什么呢?

当子类的构造方法内第一行没有出现“super()”时,系统会默认给它加上无参数的"super()"方法。上面的例子就相当于:


class Animal {
  //构造函数
  public Animal() {
  System.out.println("Animal类的无参数构造函数执行");
  }
}
class Cat extends Animal{
  //构造函数
  public Cat() {
  super();
  System.out.println("Cat类的无参数构造函数执行");
  }
}


this 与 super 区别


this和super一样,都是对象内部的引用变量,只能出现在对象内部;

this指向当前对象自己,super指向当前对象的父类型特征。

this()和super()都只能出现在构造方法的第一行,因此this()和super()方法不能共存,当一个类的构造方法第一行中没有this(),也没有super(),系统默认有super()方法;

this()是构造方法中调用本类其他的构造方法,super()是当前对象构造方法中去调用自己父类的构造方法。


相关文章
|
2天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
6天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
8 2
|
11天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
12 3
|
11天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
11天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
24 2
|
11天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
23 2
|
11天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
22 1
|
14天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
15天前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
43 0
|
5月前
|
Java 开发者
Java 面向对象新视界:揭秘子类如何“继承”父类精华,再添“创新”之笔
【6月更文挑战第16天】在Java的面向对象世界,子类继承父类的特性,如`Circle`继承`Shape`,展示“is-a”关系。子类不仅保留父类的`color`和`display`方法,还添加了`radius`属性及定制的显示逻辑。这种继承与创新允许代码复用,增强灵活性和可扩展性,使得构建复杂系统变得更加高效和模块化。通过持续的继承与定制,开发者能构建出一系列独具特色的类,充分展现面向对象编程的力量。
150 57