首页 > 编程语言 >Java基础9

Java基础9

时间:2024-08-20 21:50:58浏览次数:14  
标签:调用 Java 子类 基础 id 父类 super public

super关键字

为什么需要super:

举例1: 子类继承父类以后,对父类的方法进行重写,那么在子类中,使用super关键字仍然可以对父类中重写的方法进行调用

举例2: 子类继承父类以后,发现子类和父类中定义了同名的属性,使用super关键字仍然可以在子类中区分这两个同名的属性

super的理解: 父类的

super可以调用的结果:属性、方法、构造器

super调用属性、方法

子类继承父类以后,我们就可以在子类的方法或构造器中,调用父类中声明的属性或方法。(满足封装性前提下)

调用时,需要使用 "super." 的结构,表示调用父类的属性或方法,一般情况下可以省略。

但是! 如果出现了子类重写了父类的方法或同名的属性时,则必须使用 "super." 结构,显示的调用父类中被重写的方法或属性。

public class Person {
    //属性
    String name;
    private int age;
    int id = 1001;

    public void eat(){
        System.out.println("人会吃饭!");
    }
    public void sleep(){
        System.out.println("人会睡觉!");
    }
}
public class Student extends Person{
    String school;
    int id = 1002;

    public void eat(){ //重写
        System.out.println("学生要多吃有营养的食物!");
    }
    public void show(){
        super.eat(); //调用父类中的eat方法
    }
    public void show2(){
        System.out.println(id);  // 子类的id
        System.out.println(this.id);  // 子类的id
        System.out.println(super.id);   // 父类的id
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s = new Student();
        s.eat();   //学生要多吃有营养的食物!
        s.show();   //人会吃饭!
        s.show2();
    }
}

super调用构造器

  • 子类继承父类时,不会继承父类的构造器。只能通过 "super(形参列表)" 的方式调用父类指定的构造器
  • 规定:  "super(形参列表)" ,必须声明在子类构造器的首行
  • 前面提到,在构造器的首行可以使用 "this(形参列表)" ,调用本类中重载的构造器,  结合上一点,在构造器的首行this和super只能二选一
  • 如果在子类构造器的首行既没有显示调用 "super(形参列表)" ,也没调用 "this(形参列表)" 。则子类此构造器默认调用 "super( )"即父类的空参构造器 
  • 子类的任何一个构造器,要么调用本类中重载的构造器,要么调用父类的构造器,只能二选一。
  • 一个类中声明有n个构造器,最多有n-1个构造器使用 "this(形参列表)",则剩下的那一个构造器一定使用 "super(形参列表)" 

注意: 我们在通过子类的构造器创建对象时,一定在调用子类构造器的过程中,直接或间接的调用到父类的构造器。也正因为调用过父类的构造器,我们才会将父类中声明的属性或方法加载到内存中,供子类对象使用。

public class Person {
    //属性
    String name;
    private int age;
    int id = 1001;

    public  Person(){
        System.out.println("Person()....");
    }
    public Person(String name, int age, int id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println("人会吃饭!");
    }
    public void sleep(){
        System.out.println("人会睡觉!");
    }
}
public class Student extends Person{
    String school;
    int id = 1002;

    public Student(){
        super(); //super必须在构造器的首行!
        System.out.println("Student()....");
    }
    public Student(String name,int age){
        this.name = name;
        setAge(age);  //这里age是private 所以只能通过方法赋值
    }
    public void eat(){ //重写
        System.out.println("学生要多吃有营养的食物!");
    }
    public void show(){
        super.eat(); //调用父类中的eat方法
    }
    public void show2(){
        System.out.println(id);  // 子类的id
        System.out.println(this.id);  // 子类的id
        System.out.println(super.id);   // 父类的id
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s = new Student();  //输出:Person()....  Student()....
        //
        Student s2 = new Student("小红",21);  //输出:Person()....

    }
}

子类对象实例化全过程

从结果的角度看:体现为类的继承性

当创建子类对象后,子类对象就获取了其父类中声明的所有的属性和方法,在权限允许的情况下,可以直接调用

从过程的角度来看:

当我们通过子类的构造器创建对象时,子类的构造器一定会直接或间接的调用到其父类的构造器,而其父类的构造器同样会调用其父类的父类的构造器....直到调用了object类中的构造器为止。

正因为调用过子类的所有父类的构造器,所以我们会将父类中声明的属性、方法加载到内存中,供子类的对象使用

 

标签:调用,Java,子类,基础,id,父类,super,public
From: https://www.cnblogs.com/gjwqz/p/18370385

相关文章

  • CSS2基础(part-1)
    CSS2基础基础简介【全称】CascadingStyleSheets,又名层叠样式表层叠:一层一层涂上去表:列表样式:如文字大小,颜色,元素宽高等。CSS描述了在屏幕、纸质、音频等其他媒体上的元素应该如何被渲染的问题。语言类型标记语言,为HTML结构美化样式,实现语义与效果的分离,更好地美化......
  • 交互式智能代理基础模型:迈向通用人工智能的新途径
     人工智能咨询培训老师叶梓转载标明出处传统的AI系统主要集中在收集有用的感官信息上,而新一代的通用AI系统不仅要能够理解环境,还要能够以有意义的方式与之交互。交互式智能代理基础模型代表了开发具有跨任务和数据模态单一神经模型训练能力的通用AI系统的重要一步,这种方法......
  • 性能测试理论基础一
    一、性能测试概念1.为什么程序会有性能问题,性能问题是怎么出现的?2.性能测试和功能测试的区别是什么?3.核心性能指标:吞吐量QPS/TPS4.核心性能指标:并发量5.核心性能指标:响应时间1.性能和功能的区别功能角度:验证程序是否满足功能性需求(有没有功能,能不能用)性能:多角度分析......
  • Java面向对象
    1.面向对象类和对象的理解类:类是对现实生活中一类具有共同属性和行为的事物的抽象,是对现实事物的一种描述。(例如一个描述人的类,他只描述人的总体特征,有姓名、身高等信息,而没有具体的值)类的组成:成员变量,方法,构造器,代码块,内部类。对象:对象是真实存在的实体,是类的实例。......
  • vue切换组件基础模板
    需求:登录注册两个按钮,点击登录的时候登录显示,点击注册的时候注册显示,另外一个隐藏如下图所示先定义两个template组件<templateid="login"><div><h2>用户登录</h2><p>用户名:<inputtype="text"v-model="us......
  • 036、Vue3+TypeScript基础,路由中使用replace不让前进后退
    01、代码如下:<template><divclass="app"><h2class="title">App.Vue路由测试</h2><!--导航区--><divclass="navigate"><router-linkreplaceto="/Home"class="nav......
  • FileTypeUtil.java 文件格式util
    //文件格式Utilpackagecom.lgq.ai.Util;importjava.util.Arrays;publicclassFileTypeUtil{publicstaticintfileType(StringfileName){if(!StringUtil.isEmpty(fileName)){StringfileType=fileName.split("\\.")[1];......
  • Java并发编程(七)
    1、当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法如果其他方法没有synchronized的话,其他线程是可以进入的。所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的。2、乐观锁和悲观锁的理解及如何实现,有哪些实现......
  • c语言基础------数组指针
    在C语言中,数组指针是一种特殊的指针类型,它指向一个数组。具体来说,数组指针是指向数组首元素的指针,但它与普通指针有所不同,因为它包含了数组的大小信息。下面是关于数组指针的一些基本概念和用法:定义数组指针数组指针可以通过以下方式定义:int(*arrayPtr)[10];//arra......
  • c语言基础--------字符串指针
    在C语言中,字符串指针是一个指向字符类型的指针,通常用于指向字符串的第一个字符。字符串在C语言中通常表示为字符数组,而字符串指针则是用来存储这种字符数组首地址的变量。定义字符串指针字符串指针的定义方式如下:char*stringPtr;这里的char*表示stringPtr是......