首页 > 编程语言 >秦疆的Java课程笔记:69 面向对象 Super详解

秦疆的Java课程笔记:69 面向对象 Super详解

时间:2023-12-14 16:58:55浏览次数:34  
标签:Java Student 子类 Person 秦疆 69 父类 super public

  • super调用父类属性
//首先写一个父类
public class Person {  
    protected String name = "1";  
}
//然后写一个子类
public class Student extends Person{  
    private String name = "2";  
    public void test(String name){  
        System.out.println(name);  
        System.out.println(this.name);  
        System.out.println(super.name);  
    }  
}
//最后在Application类中写主程序方法
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {  
        Student student = new Student();  
        student.test("3");  
    }  
}
====运行结果====
3   //这时主程序方法传参给子类的“name”
2   //这是子类中自己的“this.name”
1   //这是子类中调用父类的“super.name”
  • 除了调用属性外,还能调用方法:
//在父类里写一个print方法
public class Person {  
    public void print() {  
        System.out.println("Person");  
    }  
}
//在子类里也写一个print方法,输出不一样。再写一个test方法供Application类调用
public class Student extends Person{  
    public void print() {  
        System.out.println("Student");  
    }  
    public void test(){  
        print();  
        this.print();  
        super.print();  
    }  
}
//在Application类中调用test方法
import OOP.demo2.Student;  
public class Application {  
    public static void main(String[] args) {  
        Student student = new Student();  
        student.test();  
    }  
}
====运行结果====
Student   
Student   //“print()”和“this.print()”都是子类自己的方法,加上this更便于区分
Person   //“super.print()”则是调用的父类方法
  • 当父类中的属性、方法权限为private时,super无法调用。

  • 再从下面的例子看看super的特性

//父类中写一个无参构造
public class Person {  
    public Person() {  
        System.out.println("Person无参执行了");  
    }  
}
//子类中写一个无参构造
public class Student extends Person{  
    public Student() {  
        System.out.println("Student无参执行了");  
    }  
}
//Application类
import OOP.demo3.Student;  
public class Application {  
    public static void main(String[] args) {  
        Student student = new Student();  
    }  
}
====运行结果====
Person无参执行了
Student无参执行了
  • 你会发现new一个子类中的方法时,却先执行了父类的无参构造。这是因为在子类的构造器中有一行隐藏的默认的代码super();,在调用父类的无参构造。
  • 而且,如果你显式定义了super();,然后试图在这行代码之上写子类的方法,会直接报错。也就是说,这行super();必须在子类构造器的第一行。
public class Student extends Person{  
    public Student() {  
        super();   //可以显式地写出来,对运行无影响,别写到构造器外面去了
        System.out.println("Student无参执行了");  
    }  
}
  • 下面的内容秦疆老师讲得很快,且不甚清晰,总之我尽力理清楚。
  • 如果我们在子类中显式定义super();,再加一个有参构造,用this();调用自身的有参构造,父类保持无参:
//父类==============================
public class Person {  
    public Person() {  
    }  
}
//子类==============================
public class Student extends Person{  
    public Student() {  
        super();  
        this("name");   //报错
    }  
    public Student(String name) {   //一个有参构造
    }  
}
  • 这时代码会报错:this();调用必须是构造函数主体中的第一条语句。

  • 如果this();super();调换顺序,则会报错:super();调用必须是构造函数主体中的第一条语句。

  • 如果将父类中的无参构造改为有参构造,子类的无参构造中显式定义super();

//父类==============================
public class Person {  
    public Person(String name) {   //父类改成有参
    }  
}
//子类==============================
public class Student extends Person{  
    public Student() {  
        super();   //报错
    }  
}
  • 按照之前所学,定义了有参构造,那么无参构造要么重新显式定义一个,要么就直接没了。这时,显式调用父类无参构造的super();会报错,因为父类的无参构造已经没有了。
  • 若删除super();语句,子类的无参构造也会报错:父类中没有可用的默认构造参数。(这里的默认构造参数就是无参构造)。
//父类==============================
public class Person {  
    public Person(String name) {
    }  
}
//子类==============================
public class Student extends Person{  
    public Student() {   //报错
    }  
}
  • 若加上显式定义语句super("name")super调用了父类的参数"name",则能正常调用。
//父类==============================
public class Person {  
    public Person(String name) {
    }  
}
//子类==============================
public class Student extends Person{  
    public Student() {  
        super("name");   //不再报错
    }  
}
  • 所以秦疆老师的经验谈:一旦重写了有参构造,先把无参构造加上。

  • 小结:

    • super调用父类的构造方法,必须在子类构造方法的第一行。
    • super只能出现在子类的方法或者构造器中。
    • superthis不能同时调用构造器。
    • super对比this
      • 代表的对象不同:
        • this代表的是本身调用者这个对象。
        • super代表的是父类对象的引用。
      • 使用前提不同;
        • this没有继承也可以使用。
        • super只能在继承条件下使用。
      • 构造方法不同:
        • this();本类的构造。
        • super();父类的构造。

标签:Java,Student,子类,Person,秦疆,69,父类,super,public
From: https://www.cnblogs.com/Acolyte/p/17901503.html

相关文章

  • java集合和文件数据互转
    一、集合到文件packagecom.itbianma01;importjava.io.BufferedWriter;importjava.io.FileWriter;importjava.io.IOException;importjava.util.ArrayList;publicclassDemo{publicstaticvoidmain(String[]args)throwsIOException{ArrayList<......
  • 秦疆的Java课程笔记:70 面向对象 方法重写
    重写都是方法的重写,和属性没有关系。//父类写一个静态方法======================publicclassA{publicstaticvoidtest(){System.out.println("A=>test()");}}//子类也写一个静态方法====================publicclassBextendsA{......
  • java字符流
    一、概述1、为什么出现字符流2、编码表 3、字符串的编码和解码 4、字符流的编码和解码问题 二、字符流写数据的五种方式  1、写一个字符 2、写一个字符数组 3、写入字符数组的一部分   4、写一个字符串 5、写入字符串的一部分 ......
  • 什么是JAVA异常
    1:异常的概念?在Java中,异常(Exception)是指程序执行过程中可能出现的不正常情况或错误。它是一个事件,它会干扰程序的正常执行流程,并可能导致程序出现错误或崩溃。异常在Java中是以对象的形式表示的,这些对象是从java.lang.Throwable类或其子类派生而来。Throwable是异常类层次结构的......
  • java实现大文件上传
    文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦、缺乏交互、用户体验差。一、前端代码英国程序员RemySharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用HTML5的API,对文件上传进行渐进式增强:*iframe上传*ajax上传*进度......
  • 无涯教程-Java - cos()函数
    该方法返回指定双精度值的余弦值。cos()-语法doublecos(doubled)d - 此方法接受双精度数据类型的值。cos()-返回值此方法返回指定双精度值的余弦值。cos()-示例publicclassTest{publicstaticvoidmain(Stringargs[]){doubledegrees=45.0......
  • Java中的消息队列(MQ)应用实践
    摘要:本文将介绍Java中消息队列(MQ)的概念、应用场景以及如何使用Java中的消息队列进行实践。我们将探讨如何使用Java消息队列实现异步通信、解耦和流量削峰等常见需求,并通过实际案例展示其应用。一、引言在分布式系统中,消息队列(MQ)是一种常见的中间件技术,用于实现异步通信和解耦。通过......
  • java中大文件上传
    1、什么是秒传通俗的说,你把要上传的东西上传,服务器会先做MD5校验,如果服务器上有一样的东西,它就直接给你个新地址,其实你下载的都是服务器上的同一个文件,想要不秒传,其实只要让MD5改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,你多加几个字,MD5就变了,就不会秒传了.2、本文......
  • docker~构建java应用程序的正确姿势
    我们的构建和打包,都是在docker环境进行的,你可以使用Dockerfile中的多镜像模式,也可以单独执行,我是在jenkinspipeline中用到这个,所以我单独写,这个使我的Dockerfile更加简洁。构建java项目,我们为了保证宿主机的整洁,我们采用docker的方式进行项目的编译和打包$workspace是在docke......
  • 无涯教程-Java - sin()函数
    该方法返回指定双精度值的正弦值。sin()-语法doublesin(doubled)这是参数的详细信息-d  - 双精度数据类型。sin()-返回值此方法返回指定双精度值的正弦。sin()-示例publicclassTest{publicstaticvoidmain(Stringargs[]){doubledegree......