方法重写与super关键字

在继承关系中,子类会自动继承父类中定义的方法,但有时需要对继承的方法进行修改,即对父类的方法进行重写。
需要注意的是,在子类中重写的方法需要和父类被重写方法的具有相同的方法名、参数列表以及返回值类型。
父类

public class SuperTest {
	String name = "动物";
	public void shout() {
		System.out.println("动物发出叫声");
	}
}

子类

public class Dog extends SuperTest {
	String name = "犬类";
	public void shout() {
		System.out.println("旺旺");
	}
}

测试类

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

需要注意的使,重写方法不会调用父类的方法,只会调用子类重写方法。

super关键字

使用super关键字访问父类的成员变量和成员方法。
父类

 public class Animal{
	String name = "动物";
	public void shout(){
		System.out.println("动物发出叫声");
	}
}

子类

public class Dog{
	String name  = "我是狗";
	void shout(){ //重写父类的shout方法
		System.out.println("旺旺");
		super.shout();//访问父类的成员方法
	} 
	public void PrintName(){
		System.out.println("Name="+super.name);
	}
}

测试类

public class Test(){
	public staitc void main(String [] args){
		Dog dog = new Dog();
		dog.shout();
		dog.PrintName();
	}
}// Output:
	动物发出叫声
	旺旺	
	

2.使用super访问父类的构造方法

父类

public class Animal{
	String name = "动物";
	public Animal(String name){
		System.out.println("我是一只"+name)
	}	
}

子类

public class Dog	{
	public Dog() {
		super("沙皮狗");
		// TODO Auto-generated constructor stub
	}
}

测试类

public void Test{
	public static void main(String [] args){
		Dog dog =  new Dog();
	}
}
  1. 测试类在实例化Dog对象时,一定会调用Dog类的构造方法。
  2. 通过super调用父类的构造方法的代码,必须位于子类构造方法的第一行,并且只能出现一次。

如果将子类的super(“沙皮狗”)注释掉,那么编译器会报错。
在子类的构造方法中一定会调用某个父类的构造方法。这是可以在子类的构造方法中通过super指定调用哪个构造方法,如果没有指定,在实例化子类对象时会自动调用父类的无参构造方法。
子类在实例化时默认调用了无参的构造方法,在定义一个类时,如果没有特殊需求,尽量定义一个无参的构造方法,避免被继承时出错。

Java中,类的继承允许一个子类(称为派生类或子类继承另一个类(称为父类或超类)的属性和方法。下面是一个简单的例子,演示了如何创建一个子类重写父类方法: ```java // 父类 Animal,定义了一些通用的行为 public class Animal { public void eat() { System.out.println("Animal is eating"); } // 使用 final 关键字声明 eatMethod 方法,表示该方法不可被子类覆盖 public final void eatMethod() { System.out.println("Default eating method for Animal"); } } // 子类 Dog,继承自 Animal 并重写了 eat 方法 public class Dog extends Animal { // 使用 super 关键字访问父类方法 @Override public void eat() { super.eat(); // 输出 "Animal is eating" System.out.println("Dog is eating specific food"); } // 由于 eatMethod 是 final 的,所以在 Dog 类中无法直接重写它,但可以在子类中添加新的行为 public void customEatMethod() { System.out.println("Dog has a custom eating behavior"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); // 输出:Animal is eating Dog is eating specific food dog.eatMethod(); // 输出:Default eating method for Animal dog.customEatMethod(); // 输出:Dog has a custom eating behavior } } ``` 在这个例子中,`Dog`类继承了`Animal`类,并通过`@Override`注解重写了`eat()`方法,展示了方法重写以及使用`super`关键字访问父类方法的情况。同时,`eatMethod()`作为`final`方法,不允许在子类中再次覆盖,但在`Dog`类中可以添加一个新的方法`customEatMethod()`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值