首页 > 其他分享 >super关键字和方法重写

super关键字和方法重写

时间:2023-04-19 13:02:05浏览次数:47  
标签:super int 子类 void 关键字 父类 重写 public

1.super关键字介绍

super 代表父类的引用,用于访问父类的属性、方法、构造器

2.基本语法 297

super关键字和方法重写_构造器

代码在com.stulzl.super_.包中

父类A

package com.stulzl.super_;

public class A {
    //4 个属性
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;

    //无参构造器
    public A() {
    }

    public A(String name) {
    }

    public A(String name, int age) {
    }

    // public void cal() {
// System.out.println("A 类的 cal() 方法...");
// }
    public void test100() {

    }
    protected void test200() {

    }
    void test300() {

    }
    private void test400() {

    }
}

子类B

package com.stulzl.super_;

public class B extends A{
    //访问父类的属性 , 但不能访问父类的 private 属性 [案例]super.属性名
    public void hi(){
        System.out.println(super.n1+" "+super.n2+" "+super.n3);
    }
    //访问父类的属性 , 但不能访问父类的 private 方法 [案例]super.方法名(参数列表)
    public void ok(){
        super.test100();
        super.test200();
        super.test300();
        //super.test400();//不能访问父类private方法
    }
    //访问父类的构造器(这点前面用过):super(参数列表);只能放在构造器的第一句,只能出现一句!
    public B(){
        //super();
        //super("jack");
        super("jack",10);
    }
}

3. super关键字细节 298由于内容较多看视频

1. 调用父类构造器的好处(分工明确,父类属性有父类初始化,子类的属性由子类初始化)

2. 当子类中有和父类中的成员(属性和方法名)重名时,为了访问父类的成员,必须通过super,如果没有重名,使用super,this直接访问是一样的效果

3. super 的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用 super 去访问爷爷类的成员; 如果多个基类(上级类)中都有同名的成员,使用 super 访问遵循就近原则。A->B->C

代码在com.stulzl.super_detalil.包中

测试SuperDetail

package com.stulzl.super_detalil;


public class SuperDetail {
    public static void main(String[] args) {
        D b = new D();
        b.sum();   //298
        b.test();
    }
}

Base类父类是Object

package com.stulzl.super_detalil;

public class Base {//父类是Object
    public int n1=999;
    public int age =111;
    public void cal(){
        System.out.println("Base类的cal() 方法……");
    }
    public void eat(){
        System.out.println("Base类的eat() 方法……");
    }
}

父类C

package com.stulzl.super_detalil;

public class C extends Base{//父类
    //4 个属性
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;

    //无参构造器
    public C() {
    }
    //有参构造器
    public C(String name) {
    }
    public C(String name, int age) {
    }

    //方法
    public void cal() {
        System.out.println("A 类的 cal() 方法...");
    }


}

子类D

package com.stulzl.super_detalil;

public class D extends C{ //子类
    //属性
    //public int n1 = 888;

    //当子类中有和父类中的成员(属性和方法名)重名时,为了访问父类的成员,必须通过super,
    // 如果没有重名,使用super,this直接访问是一样的效果
    public void sum(){

        System.out.println("B类的sum");

        //希望调用父类A中的cal方法          298
        //这时,因为子类 B 没有 cal 方法,因此我可以使用下面三种方式
        //找 cal 方法时(cal() 和 this.cal()逻辑一样),顺序是:
        // (1)先找本类,如果有,则调用
        // (2)如果没有,则找父类(如果有,并可以调用,则调用)
        // (3)如果父类没有,则继续找父类的父类,整个规则,就是一样的,直到 Object 类
        // 提示:如果查找方法的过程中,找到了,但是不能访问, 则报错, cannot access
        // 如果查找方法的过程中,没有找到,则提示方法不存在
        cal();
        this.cal();//等价cal();
        super.cal();//找 cal 方法(super.call()) 的顺序是直接查找父类,其他的规则一样

        //演示访问属性的规则   298
        //n1 和 this.n1 查找的规则是
        //(1) 先找本类,如果有,则调用
        //(2) 如果没有,则找父类(如果有,并可以调用,则调用)
        //(3) 如果父类没有,则继续找父类的父类,整个规则,就是一样的,直到 Object 类
        // 提示:如果查找属性的过程中,找到了,但是不能访问, 则报错, cannot access
        // 如果查找属性的过程中,没有找到,则提示属性不存在
        System.out.println(n1);
        System.out.println(this.n1);
        System.out.println(super.n1); //找 n1 (super.n1) 的顺序是直接查找父类属性,其他的规则一样
    }

    public void test(){  //299
        //super 的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用 super 去访问爷爷类的成员;
        // 如果多个基类(上级类)中都有同名的成员,使用 super 访问遵循就近原则。A->B->C
        System.out.println("super.n1="+super.n1);
        super.cal();
    }
}

4. super关键字和this关键字的比较300

super关键字和方法重写_构造器_02

5. 基本介绍

super关键字和方法重写_子类_03

注:这里的父类和子类关系不一定,也有可能是爷爷和孙子的关系

5.1 方法重写的注意事项 302

方法重写也叫方法覆盖,需要满足下面的条件

super关键字和方法重写_子类_04

6. 快速入门 301-302

代码在com.stulzl.override_.包中

测试Override

package com.stulzl.override_;

public class Override01 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.cry();
    }
}

父类Animal

package com.stulzl.override_;

public class Animal {//父类
    public void cry(){
        System.out.println("动物叫唤……");
    }

    //细节: 子类方法的返回类型和父类方法返回类型一样,302
    // 或者是父类返回类型的子类
    //比如 父类 返回类型是 Object , // 子类方法返回类型是 String
    public Object m1(){
        return null;
    }

    //细节: 子类方法不能缩小父类方法的访问权限
    //public > protected > 默认>private
    public void eat(){  //302

    }

    // 细节:这里 Object 不是 String 的子类,因此编译错误  302
//    public String m2(){
//        return null;
//    }
}

子类Dog

package com.stulzl.override_;

public class Dog extends Animal{//子类   301
    //解读
    //1. 因为 Dog 是 Animal 子类
    //2. Dog 的 cry 方法和 Animal 的 cry 定义形式一样(名称、返回类型、参数)
    //3. 这时我们就说 Dog 的 cry 方法,重写了 Animal 的 cry 方法
    public void cry(){//和父类中的cry方法重写了
        System.out.println("小狗叫……");
    }

    //细节: 子类方法的返回类型和父类方法返回类型一样,302
    // 或者是父类返回类型的子类
    //比如 父类 返回类型是 Object , // 子类方法返回类型是 String
    public String m1(){    //302
        return null;
    }

    //细节: 子类方法不能缩小父类方法的访问权限  302
    //public > protected > 默认>private
//    protected void eat(){
//
//    }

    // 细节:这里 Object 不是 String 的子类,因此编译错误  302
//    public Object m2(){
//        return null;
//    }

}

7. 方法重写练习

7.1 请对方法的重写和重载做一个比较 303

super关键字和方法重写_子类_05

7.2 题2 304

1) 编写一个 Person 类,包括属性/private(name、age),构造器、方法 say(返回自我介绍的字符串)。

2) 编写一个 Student 类,继承 Person 类,增加 id、score 属性/private,以及构造器,定义 say 方法(返回自我介绍的信息)。

3) 在 main 中,分别创建 Person 和 Student 对象,调用 say 方法输出自我介绍

代码在com.stulzl.override_exercise.包中

测试OverrideExercise

package com.stulzl.override_exercise;

//1) 编写一个 Person 类,包括属性/private(name、age),构造器、方法 say(返回自我介绍的字符串)。
//2) 编写一个 Student 类,继承 Person 类,增加 id、score 属性/private,以及构造器,
//    定义 say 方法(返回自我介绍的信息)。
//3) 在 main 中,分别创建 Person 和 Student 对象,调用 say 方法输出自我介绍

public class OverrideExercise {
    public static void main(String[] args) {
        Person person = new Person("jack",30);
        System.out.println(person.say());

        Student student = new Student("smith",20,123456,99.8);
        System.out.println(student.say());
    }
}

父类Person

package com.stulzl.override_exercise;

//1) 编写一个 Person 类,包括属性/private(name、age),构造器、方法 say(返回自我介绍的字符串)。
public class Person {
    private String name;
    private int age;

    //构造器
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //返回信息
    public String say(){
        return "name="+name+" age="+age;
    }
    //set和get方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

子类Student

package com.stulzl.override_exercise;

//2) 编写一个 Student 类,继承 Person 类,增加 id、score 属性/private,以及构造器,
//    定义 say 方法(返回自我介绍的信息)。
public class Student extends Person{
    private int id;
    private double score;

    //构造器
    public Student(String name, int age, int id, double score) {
        super(name, age);
        this.id = id;
        this.score = score;
    }
    //返回信息
    public String say(){//这里体现super的好处,代码复用
        return super.say()+" id="+id+" score="+score;
    }

    //set和get方法
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}


标签:super,int,子类,void,关键字,父类,重写,public
From: https://blog.51cto.com/u_15784725/6206187

相关文章

  • vi 查找关键字
    https://blog.csdn.net/weixin_40959890/article/details/128004090vi打开一个文件后命令模式下敲斜杆(/),这时在状态栏(也就是屏幕左下脚)就出现了“/”然后输入你要查找的关键字敲回车就可以了。如果你要继续查找此关键字,敲字符n就可以继续查找了。敲字符N(大写N)就会向前......
  • Java-Day-12( 类变量 + 类方法 + main 方法 + 代码块 + 单例设计模式 + final 关键字 )
    Java-Day-12类变量定义一个变量count,是一个类变量(静态变量)staticclassPerson{privateStringname;// 该静态变量static最大的特点就是会被Person所有的对象实例共享publicstaticintcount=0;publicPerson(Stringname){this.na......
  • C++ const关键字
    参考资料:【C++const的各种用法详解】【const用法深入浅出】-COS-博客园(cnblogs.com)const的基本概念:const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。下面我就const的用法......
  • break和continue关键字的使用
    break和continue关键字的使用使用范围循环中使用的作用break:switch-case、循环结构中结束当前循环continue:循环结构中结束当次循环......
  • #yyds干货盘点#python关键字参数
    关键字参数kwarg=value 形式的 关键字参数 也可以用于调用函数。函数示例如下:defparrot(voltage,state='astiff',action='voom',type='NorwegianBlue'):print("--Thisparrotwouldn't",action,end='')print("ifyouput......
  • Groovy def关键字妙用
    在之前的文章和视频中,我分享过Groovy语法中def关键字的基本使用方法。当时对def理解是:不定类型变量,资料中也有说是无类型变量,感觉两个意思大差不差,就是不显式声明对象类型。基本使用方式如下:defa=1defb="FunTester"类似这样的方式,当时Java新版也已经支持了var可以替代一......
  • 方法的引用(静态方法中无this和super)
     引用静态方法: 代码:importjava.util.ArrayList;importjava.util.Collections;importjava.util.function.Function;publicclass静态方法{publicstaticvoidmain(String[]args){//需求;把集合中的字符串转化为intArrayList<String>list=ne......
  • The Super Powers UVA - 11752
     求1~2^64区间里,有多少合法数X合法数:X=a^b,至少存在2个不同的a #include<iostream>#include<algorithm>#include<vector>usingnamespacestd;constintN=65536+3;intb[int(1e6)];__int128_tMAX=1;voidinit(){ inti,j; b[0]=b[1]=1; fo......
  • 论文解读(PAWS)《Semi-Supervised Learning of Visual Features by Non-Parametrically
    论文信息论文标题:Semi-SupervisedLearningofVisualFeaturesbyNon-ParametricallyPredictingViewAssignmentswithSupportSamples论文作者:MahmoudAssran, MathildeCaron, IshanMisra, PiotrBojanowski, ArmandJoulin, NicolasBallas论文来源:NeurIPS2021论......
  • KingbaseES避免表的重写与数据类型二进制兼容
    KingbaseES避免表的重写与数据类型二进制兼容一、关于KingbaseES变更表结构表的重写:1.修改表结构可能会导致表进行重写(表OID发生变化)。2.修改表结构带有索引或者字段类型长度或者精度操作时,会触发索引重建。3.不修改列内容且旧类型与新类型二进制兼容(binarycoercible),不需要重......