Java8基础之super关键字

相信学过Java语言的小伙伴都熟悉super这个关键字,接下来,我们来研究他的一些基础用法吧。

定义名字为Father的类

package superkeyworld;

public class Father {

    public String name;

    public int age;

    public Father() {}

    public Father(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("父类构造方法调用了!");
    }

    public void sayHello() {
        System.out.println("你好,我是"+name);
    }
}

super关键字可以调用父类构造方法

当父类没有无参构造方法的时候,子类实例化的时候,必须显示调用父类的构造方法。

package superkeyworld;

public class Child extends Father {

    public Child(String name, int age) {
        // 必须位于第一行。
        super(name, age);
        System.out.println("子类构造方法执行了");
    }
}

实例化Chlid类,结果如下:

父类构造方法调用了!
子类构造方法执行了!

为什么非得放在第一行?

super()之所以存在,是有很重要的原因的!因为子类与父类之间是继承关系,而继承就意味着得到父类中所有的成员变量和方法。既然能够得到父类的这些成员,也就意味着子类可以访问父类的方法和成员变量(当然,得到不意味着就可以任意使用,使用的前提是必须是有相应的访问权限) ,如果子类在使用父类成员的时候,父类内的成员变量没有得到正确的初始化,那么就会发生意想不到的错误,所以问题就出现在了这里,如何保证父类成员是安全的呢? 这就得保证父类得到了正确的初始化,而父类正确的初始化就离不开父类的构造函数,super存在的意义也正是如此。在子类的构造函数,如果没有显式使用super(),并且第一行没有使用this()调用子类其他的构造函数,那么编译器就会自动在第一行补齐super()来调用父类的默认构造函数,如果父类没有默认的构造函数就会报错。
super()在第一行的原因就是: 子类有可能访问了父类的成员变量或者方法,比如在构造函数中使用父类的成员函数或者变量,在代码块中使用了父类的方法等, 所以为保证在子类可以访问父类成员的正确性,所以要先完成对父类的初始化。

super关键字可以调用父类成员方法和成员变量(非私有)

super关键字可以用来访问父类的成员方法或变量,当子类成员变量或方法与父类有相同的名字时也会覆盖父类的成员变量或方法,这个时候要想访问父类的成员变量或方法只能通过super关键字来访问,子类方法中的super.方法名()不需要位于第一行。

package superkeyworld;

public class Child extends Father {

    public Child(String name, int age) {
        // 必须位于第一行。
        super(name, age);
        System.out.println("子类构造方法执行了!");
    }

    public void sayHello() {
        super.sayHello();
        System.out.println("父亲的年龄:"+super.age);
        System.out.println("调用父类的方法,获取了父类的属性!");
    }
}

调用子类的sayHello方法结果如下:

你好,我是feige
父亲的年龄:23
调用父类的方法,获取了父类的属性!

原文地址:https://www.cnblogs.com/feiqiangsheng/p/11106125.html

时间: 2024-09-30 18:44:49

Java8基础之super关键字的相关文章

java基础之super关键字

一.在java里面,对于super关键字通常有两种用法: 1. 用在子类的构造方法里(初始化用),主要是调用父类的默认构造方法,如果父类有不止一个构造方法,可以通过super指定具体的构造函数,比如 super(paras): 2. 用在子类里调用隐藏或重写的属性或行为,比如 super.onDestroy()等等: 对于第1种需要注意,super表示当前类的父类,super()调用的是父类默认的构造方法,即这样可以对父类进行初始化.如何没有对父类进行初始化,当子类调用父类的方法时,便会从逻辑上

java基础:super关键字

  在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用. 1.1.super关键字测试 1 package cn.galc.test; 2 3 /** 4 * 父类 5 * @author gacl 6 * 7 */ 8 class FatherClass {

Java基础-super关键字与this关键字

用super调用父类构造方法 类如果没有显式声明构造方法,则自动生成无参数的默认构造方法. 1.先用一个无参数的父类构造方法验证一下, 执行子类构造方法会自动调用父类的构造方法.测试代码: class Human3{ public Human3(){ System.out.println("构造一个人"); } } class Pupil3 extends Human3{ public Pupil3(){ // super(); //本句注释与不注释执行结果是一样的 System.ou

JavaSE基础知识(5)—面向对象(5.5 this和super关键字)

一.this关键字 1.说明 this关键字代表当前类的对象,可以访问本类的属性.方法.构造器注意:谁调用该方法,则this就指谁 2.语法 访问属性: this.属性名 = 值; System.out.println(this.属性名);访问方法: this.方法名();访问构造器: this([参数列表]); 3.注意事项 一般来讲如果本类内部访问当前类的成员,则直接访问即可,默认也是通过this调用的.当局部变量和成员变量重名时,则必须通过this才能调用到成员变量! 二.super关键字

JAVA基础(十六)Super关键字

Super关键字: Super关键字的特点: This  与super 不能同时存在第一行: 构造方法第一行都有一个默认语句 super()无参构造: 私有化后显示定义无法在用默认, 空参时先调父类构造在子类构造,因为默认语句 super() 第一行只要this在就没有super. super的调用: super:代表当前对象父类的引用 super.成员变量 调用父类的成员变量 super(…) 调用父类的构造方法 super.成员方法 调用父类的成员方法 //定义Person类,将Studen

面向对象编程(十)——继承之Super关键字及内存分析

阅读目录 Super关键字画内存分析图了解程序执行的整个过程 Super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用. super是直接父类对象的引用.可以通过super来访问父类中被子类覆盖的方法或属性. (注意和this的区别:this是当前对

Java基础语法(一)---关键字、常量、变量、运算符

Java基础语法(一)---关键字.常量.变量.运算符一.关键字 定义:被Java赋予了特殊含义的单词. 特点:体现上都是英文小写. 1. 用于定义数据类型的关键字 基本数据类型: 整数类型: byte(1字节,最大值127) short(2字节,最大值为2^15-1) int(4字节,最大值为2^31-1) long(8字节,最大值为2^63-1) 浮点类型: float (单精度实数在内存中占32bit 有效数字为6~7位) double(双精度实数占内存单元为64bit 有效数字为15~1

重写、super关键字、final关键字、多态、子类型转换、抽象的初步了解

重写 含义 在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法.但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写.方法重写又称方法覆盖. 重写与重载的异同点 相同点 都是作用在方法上 不同点 重载时作用在同一个类中,多个方法名相同,参数列表不同(方法签名不同)而采用的方式 重写是作用在不同类,该类继承于需要修改方法的父类. 区别: 重载是在同一个类中,方法名相同,参数列表不同 重写是作用在两个有继承关系的子类中,方法签名相同 需要重写的原因 在一

super关键字的用法

package com.frank;//定义包名,必须是第一行.如果没有包名,那么就会被放在一个没有名字的默认包中. import java.util.*; /** 继承 */ public class Sample {     public static void main(String[] args)     {         OldMan o = new OldMan("张三",80);         System.out.println("名字:"+o.