Java笔记整理 —— super关键字、方法重写/覆盖

super关键字

基本介绍

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

基本语法

1. 访问父类的属性,但不能访问父类的private属性:super.属性名;

2. 访问父类的方法,但不能访问父类的private方法:super.方法名(参数列表);

3. 访问父类的构造器(前面介绍过):super(参数列表); 只能放在构造器的第一句,只能出现一句

细节/好处

1. super调用父类构造器,可以使分工明确。父类属性由父类初始化,子类的属性由子类初始化。 

2. 当子类中由和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super如果没有重名,使用super、this、直接访问是一样的效果(只不过this和直接访问是从本类开始找,super是从父类开始找)。 调用类的属性的规则在上面已经说明过了,调用类的方法的规则与其相同,只不过把属性换成了方法。

子类确实可以写一个与父类完全相同的方法,虽然左边会有隐患提示,但是编译没有问题。

  下面对于子类调用父类的方法举一个例子(属性因为很简单就不举例了)

  定义一个父类Person:

public class Person {  //有四个不同修饰符的方法
    public void showName1(){
        System.out.println("调用Person的public方法");
    }
    void showName2(){
        System.out.println("调用Person的无修饰符方法");
    }
    protected void showName3(){
        System.out.println("调用Person的protected方法");
    }
    private void showName4(){
        System.out.println("调用Person的private方法");
    }
}

  定义一个子类Student,先测试在main方法中调用方法(必须用声明的变量调用):

public class Student extends Person{
    public static void main(String[] args) {
        Student student = new Student();
        student.showName1();   //成功调用
        student.showName2();   //成功调用  
        student.showName3();   //成功调用
        student.showName4();   //报错,不能调用父类的private方法
    }
}

    然后在子类的方法中继续测试,由于 this 和 super 都不能在主方法中调用,因此声明一个test方法,在该方法中测试this和super。

    public void test(){
        this.showName1();    //成功调用
        this.showName2();    //成功调用
        this.showName3();    //成功调用
        this.showName4();    //报错,不能调用private方法
        super.showName1();   //成功调用
        super.showName2();   //成功调用 
        super.showName3();   //成功调用
        super.showName4();   //报错,不能调用private方法
    }

  当然,该方法还是需要用main方法中声明的变量调用。

    同样的,最重要的一点——在子类调用一个方法时,如果子类没有该方法,会一直向上寻找如果找到Object类还没有找到,就会报错(super直接忽略本类)如果在中间找到了一个private的方法,即使上面还有该方法,也不会再寻找了,而是直接报错

 举一个例子:

private void showName1(){  //在Student类中加入一个与Person类同名但不同修饰符的函数
    System.out.println("调用Student的private函数");
}
public class Pupil extends Student{  //继承Student
    public static void main(String[] args) {
        Pupil pupil = new Pupil();
        pupil.showName1();  //直接报错,寻找到Student就停了,而不是继续向Person寻找
    }
}

 3. 如果多个父类中有相同的成员,那么super的访问根据就近原则。

4. super和this的区别

方法重写/覆盖(override)

基本介绍

    方法覆盖就是子类有一个方法和父类的某个方法 名称、返回类型、参数一样,这样我们就说子类的这个方法覆盖了父类的那个方法。

使用细节

1. 子类方法的 形参列表,方法名称 要和父类的完全一样。

2. 子类方法的 返回类型 可以和父类方法的返回类型一样,或者是父类返回类型的子类

     public Object showName(){
         System.out.println("返回值为Object的父类方法");
         return "OK";
     }  //父类的方法

    public String showName(){
          System.out.println("返回值为String的子类方法");
          return "OK";
    }  //子类的方法

    public static void main(String[] args) {
        Student student = new Student();
        student.showName(); //调用
    }

    public String showName(){
         System.out.println("返回值为Object的父类方法");
         return "OK";
     }

    public Object showName(){
          System.out.println("返回值为String的子类方法");
          return "OK";
    }  //报错

3. 子类方法不能缩小父类方法的访问权限(但扩大可以)public > protected > 默认 > private

     public void showName(){
         System.out.println("修饰符为public的父类方法");
     } 

    protected void showName(){
          System.out.println("修饰符为protected的子类方法");
    }  //报错,减小了范围

 4. 重载和重写的比较

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正确的使用super关键字来继承宠物类的属性和方法的示例代码如下: ```java public class Pet { protected String name; protected int age; // 宠物类的构造方法 public Pet(String name, int age) { this.name = name; this.age = age; } // 宠物类的方法 public void eat() { System.out.println(name + " is eating."); } } public class Dog extends Pet { private String breed; // 狗类的构造方法 public Dog(String name, int age, String breed) { super(name, age); // 调用父类的构造方法 this.breed = breed; } // 狗类重写了宠物类的eat方法 @Override public void eat() { System.out.println(name + " the " + breed + " is eating."); } // 狗类新增的方法 public void bark() { System.out.println(name + " is barking."); } } // 在另一个类中实例化Dog对象并访问其属性和方法 public class Main { public static void main(String[] args) { Dog myDog = new Dog("Buddy", 3, "Golden Retriever"); myDog.eat(); // 调用重写后的eat方法 myDog.bark(); // 调用新增的bark方法 System.out.println(myDog.name + " is " + myDog.age + " years old."); // 访问继承自父类的属性 } } ``` 上述示例代码中,Dog类继承了Pet类,并在自身的构造方法中通过`super`关键字调用了父类的构造方法来给父类的属性初始化。在重写了父类的`eat`方法后,Dog类新增加了一个`bark`方法。在使用Dog对象时,可以访问继承自父类的属性和方法,也能够调用自身新增的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值