super关键字及方法重写

super关键字及方法重写

1.super关键字

  • 调用父类 (Superclass) 的属性成员或者方法(super.属性名)(super.方法名());

  • 调用父类的构造方法super();

  • 误区:super表示父类对象,这个说法相当于说super关键字会在子对象里创建一个父对象。这是错误的。因为在创建子类对象时不会创建父类对象;

  • 只会将父类信息加载到子类对象中存储;

  • super(实参)的作用是:初始化当前对象的父类型特征;

    并不是创建新对象。实际上对象只创建了1个。

    下面用以前的代码来具体解释super关键字:

实例

package jicheng;

public class Animal {
    private int age;
    private String name;
    public Animal(){
        super();//默认有;
        System.out.println("Animal的无参构造");
    }
    public Animal(String name){
        super();
        System.out.println("Animal的有参构造");
    }
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return age;
    }
}
package jicheng;

public class Dog extends Animal{
    public Dog(){
        super();//默认有;
        System.out.println("Dog的无参构造");
    }
    public Dog(String name){
        super(name);//调用父类有参构造
        System.out.println("Dog的有参构造");
    }
}

package jicheng;

public class hashiqi extends Dog {
    public hashiqi(){
        super();//默认有super()去调用父类的无参构造
        System.out.println("哈士奇的无参构造");
    }
    public hashiqi(String name){
        super(name);//如果不设置,则默认有super()去调用父类的无参构造;
        System.out.println("哈士奇的有参构造");
    }
}

package jicheng;

public class Demo {
    public static void main(String[] args) {
        hashiqi hsq1=new hashiqi();
        System.out.println();
        hashiqi hsq2 = new hashiqi("哈士奇");
    }
}

输出结果;

Animal的无参构造
Dog的无参构造
哈士奇的无参构造

Animal的有参构造
Dog的有参构造
哈士奇的有参构造

注意:在构造方法执行过程中一连串调用了父类的构造方法,父类的构造方法又继续向下调用它的父类的构造方法,但是实际上对象只 创建了一个。

2.方法重写

1,什么是方法重写

  • 重写:子父类出现了一模一样的方法(注意:返回值类型可以是子父类);

2,方法重写的应用:

  • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。这样,即沿袭了父类的功能,又定义了子类特有的内容。

方法重写

重新定义从超类继承的类中的实例方法称为方法重写。

例子

让我们考虑类A和类B的以下声明:

public class A  {
    public void  print() { 
        System.out.println("A");
    }
}

public class B  extends A  {
    public void  print() { 
        System.out.println("B");
    }
}

类B是类A的子类。类B从其父类继承print()方法并重新定义它。

类B中的print()方法覆盖类A的print()方法。

如果一个类覆盖了一个方法,它会影响覆盖的类及其子类。考虑下面的类C的声明:

public class C  extends B  {
}

类C不声明任何方法。它继承类B中的print()方法。

注意

  • 类总是继承它的直接超类的可用的。
  • 方法必须是实例方法。重写不适用于静态方法。
  • 重写方法必须具有与重写方法相同的名称。
  • 重写方法必须具有与重写方法相同顺序的相同类型的相同数量的参数。
  • 当方法的参数使用通用类型时,考虑通用类型参数的擦除,而不是通用类型本身与其他方法比较。
  • 参数的名称无关紧要。
  • 如果重写方法的返回类型是引用类型,则重写方法的返回类型必须与重写方法的返回类型兼容。

访问级别

  • 重写方法的访问级别必须至少与重写方法的访问级别相同或更宽松。
  • 下表列出了重写方法允许的访问级别
重写方法访问级别允许重写方法访问级别…
publicpublic
protectedpublic, protected
package-levelpublic, protected, package-level

重写的访问

从子类访问重写的方法。子类可以使用关键字super作为限定符来调用超类的重写方法。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在构造函数和方法中使用super关键字: 在Java中,super关键字用于调用父类的构造函数或方法。当子类构造函数或方法需要继承父类的某些属性或方法时,可以使用super关键字来调用父类相应的构造函数或方法。 示例代码: ``` public class Animal { String name; int age; public Animal(String name, int age) { this.name = name; this.age = age; } public void eat() { System.out.println(name + " is eating."); } } public class Dog extends Animal { public Dog(String name, int age) { super(name, age); } @Override public void eat() { super.eat(); System.out.println(name + " is eating bones."); } } public class Main { public static void main(String[] args) { Dog myDog = new Dog("Buddy", 3); myDog.eat(); } } ``` 在上面的示例代码中,Dog类继承了Animal类,并通过super关键字调用了父类Animal的构造函数。在子类中重写了父类的eat()方法,并在方法中使用super关键字来调用父类的eat()方法,然后再添加一行输出语句。 重载方法: 在Java中,方法重载是指在同一个类中,有多个方法名相同但参数列表不同的方法。方法的参数列表包括参数的类型、数量和顺序,只要有一个不同,就可以认为是不同的方法。 示例代码: ``` public class Calculator { public int add(int x, int y) { return x + y; } public double add(double x, double y) { return x + y; } public int add(int x, int y, int z) { return x + y + z; } } public class Main { public static void main(String[] args) { Calculator myCalculator = new Calculator(); System.out.println(myCalculator.add(1, 2)); System.out.println(myCalculator.add(2.5, 3.5)); System.out.println(myCalculator.add(1, 2, 3)); } } ``` 在上面的示例代码中,Calculator类中定义了三个add()方法,分别接受不同数量和类型的参数。在Main类中创建了一个Calculator对象,并分别调用了三个不同的add()方法。 重写方法: 在Java中,方法重写是指在子类中定义一个与父类中同名、同参数列表、同返回类型的方法,并且这个方法的访问修饰符不能比父类的更严格。 示例代码: ``` public class Animal { public void move() { System.out.println("Animal is moving."); } } public class Dog extends Animal { @Override public void move() { System.out.println("Dog is running."); } } public class Main { public static void main(String[] args) { Animal myAnimal = new Animal(); Dog myDog = new Dog(); myAnimal.move(); myDog.move(); } } ``` 在上面的示例代码中,Animal类中定义了一个move()方法,用于显示动物在移动。Dog类继承了Animal类,并重写了move()方法,用于显示狗在奔跑。在Main类中创建了一个Animal对象和一个Dog对象,并分别调用了它们的move()方法,输出结果分别为“Animal is moving.”和“Dog is running.”。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr. Rabbit.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值