重新开始学Java——继承与重写( override )

继承的概念 Java 语言中的继承是代码复用的一个重要手段。如果多个类具有很多相同的特点(属性)和行为(方法),就可以把这些共同的特点和行为抽取到一个类中, 该类被用作基类(父类),其它的类(子类), 从这个类派生而来。对于子类而言, 它可以继承基类的所有特点和行为;对于基类而言, 其派生和扩展就是子类。子类中可以添加父类中没有的特点和行为,子类也可把父类中的特点和行为隐藏起来。 例子:

父类:
/**
* 定义一个用来充当父类的类
* 父类(Superclass,所以有人又叫超类,叫超类的都是错误的)
* 也有地方管父类称作基类(C、C++)
*/
public class Human {
	private String name;
	public void eat(String food){
	 System.out.println(this.name+" 吃 " + food);
	}
	public void sleep(){
		System.out.println(this.name+" 睡 ");
	}
	public void walk(){
		System.out.println(this.name+" 走路 ");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
子类
public class Sinaean extends Human{
	// 从父类中继承了 eat 、 sleep、walk等方法
	// 自己可以为自己扩展自己所特有的方法
	public void taiji(){
		System.out.println(this.getName()+"打太极");
	}
	public static void main(String[] args) {
		Sinaean s = new Sinaean();
		s.setName("富二代");
		System.out.println(s.getName());
		s.eat("肉夹馍");
		s.sleep();
		s.walk();
		// 调用 本类中定义的方法
		s.taiji();
	}
}

那么继承到底继承了什么??

这里要明确说一下,继承是继承了所有的成员(构造不属于成员),但是因为修饰符的原因,是具有访问权限的。

注释:

如果某个类明确 用 extends 指定了继承某个类,则 extends 之后的那个类就是该
类的父类,比如:
public class Sinaean extends Human{}
如果某个类,没有明确用 extends 指定其父类是谁,那它的父类是 Java.lang.Object
比如:public class Human{};
Java.lang.Object 是所有类的父类

注意点:

Java 中的类与类之间不支持多继承:一个类只能有一个直接父类, 但可以有多个间
接父类;
一个类没有明写 extends 关键字, 则其父类是 Object,java.lang.Object 类中
protected、public 修饰的属性和方法被所有类所继承;
只能继承父类中 protected、public 修饰的属性和方法,私有的、默认级别的属性和
方法不能被继承。

概念

重写, 亦称覆盖
	当子类中定义的方法, 其方法名、 参数列表;跟父类中某个方法的方法名、 参数列表完全相同;就说子类的方法重写(覆盖)了父类的这个方法
	
	
发生的条件:
	必须是发生在父子类之间;必须满足两个相同(完全相同):方法名称相同,参数列表的顺序、 个数、 类型必须完全相同

解释:

方法的覆盖也成方法重写,是指在子类中出现了与父类中某个方法同名、同参、同返回的方法。此时就说子类中的这个方法覆盖了继承自父类的那个方法。
同名:子类中重新定义了一个与继承自父类的方法同名的方法
同参:子类中重新定义的那个方法的参数与继承自父类的那个方法的参数一模一样
同返回:如果父类的方法返回基本数据类型,则重写的方法返回类型必须与父类一模一样
如果父类的方法返回引用类型,则重写的方法的返回类型需要与父类方法返回类型“同源”
	这里的同源指的是同一个源头
	同源的解释解释
	返回类型同源:子类中的返回类型以父类中的返回类型为"源头"
	设 Schoolchildren 继承 Student , Student 继承 Person
	若父类 Father 中 getInfos 方法返回的是 Person
	那么 Father 的子类 Child 中, 如果重写了 getInfos 方法
	则 子类 Child 中的方法必须返回 Person 类型或者其子类类型

例如:

父类方法:
protected Food buy (double money){};
子类方法:
protected Fruit buy( double m){};
注明:Fruit 继承了 Food

例子:

public class Father {
	protected String name = "李世民";
	public int add(int a, int b){
		System.out.println("Father#add(int a, int b)");
		int c = a+ b;
		return c;
	}
}
public class Child extends Father{
	protected String name = "李恪";
	public void show(){
		// 要访问继承自父类的、被遮盖的属性,可以通过super来访问
		System.out.println(super.name);// 我爹的名字
		System.out.println(this.name); // 我的名字
	}
	// 子类中 覆盖了 继承自 父类的add方法
	public int add(int a,int b){
		System.out.println("Child#add(int a, int b)");
		//super.add(a, b);// 通过 super 来调用继承自父类的、被覆盖的方法
		return a+b;
	}
	public static void main(String[] args) {
		Child c = new Child();
		c.show();
		// 当覆盖了父类的add方法后,调用的就是自己的add方法
		c.add(3, 4);
	}
}

注意的事情:

子类中方法的访问权限不能比父类小(大于等于): protected < public
当覆盖发生后, 父类的方法就被隐藏了
父类的私有方法 、 final 方法不能被重写

重载和重写的异同:

环境:重载发生在同一个类中的同名不同参的多个方法之间,重写发生在子类继承了父类的方法后,然后覆盖了继承自父类的方法
名称:重载和重写都要求同名
参数:构成重载的多个方法之间,要求一定是不同参数(类型、个数、顺序);重写要求子类重写的那个方法必须跟继承自父类的方法参数相同
返回:重载对返回类型没有要求;重写要求返回类型跟继承自父类的方法相同(基本数据类型相同、引用类型同源)
修饰符:重载对修饰符没有要求;重写后的方法的访问修饰符的访问级别不能比继承自父类的级别小。

转载于:https://my.oschina.net/lujiapeng/blog/2252008

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值