Java基础 面向对象的三大特征之继承 方法覆盖

面向对象的三大特征:封装、继承、多态。继承基本的作用是:代码复用,更要的作用是,有了继承才有了以后方法的覆盖和多态机制!语法格式:
[修饰符列表] class 类名 extends 父类名{
  java语句
}

在java语句当中,继承只支持单继承,一个类不能同时继承很多类,但是可以间接继承多个类,例如B继承A,C继承B,那么C间接继承A。这里需要注意一些术语:

A类称为:超类,基类,父类,superclass B类称为:子类,派生类,subclass
在java语言中,子类继承父类需要注意:
  1. 私有的不支持继承
  2. 构造方法不支持继承
  3. 其它数据都可以被继承
java语言中,一个类显示没有继承任何类,该类默认继承JavaSE库中提供的java.lang.Object类:
public class VipRole {
	public static void main(String[] args){
		VipRole r = new VipRole();
		String s = r.toString();
		System.out.println(s);//com.day01.javase.VipRole@459189e1

	}
}
现在定义一个Role角色类:
public class Role {
	// 角色具有生命值和角色自身的属性
	private int live;
	private String attr;
	
	public Role() {
		
	}

	public Role(int live, String attr) {
		this.live = live;
		this.attr = attr;
	}
	
	//setter和getter
	public int getLive() {
		return live;
	}
	public void setLive(int live) {
		this.live = live;
	}
	public String getAttr() {
		return attr;
	}
	public void setAttr(String attr) {
		this.attr = attr;
	}
	
	
现在需要一个VipRole来定义vip角色,vip角色也具有生命值和属性,这时候就可以直接继承Role类:
public class VipRole extends Role{
	// VipRole类继承Role类
	private String action;

	public VipRole() {
		
	}

	public VipRole(String action) {
		this.action = action;
	}

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	
}
最后测试一下能不能成功,编写一个测试类:
public class RoleTest{
	public static void main(String[] args){
		VipRole u = new VipRole();
		u.setLive(100);
		u.setAttr("ordinary");
		u.setAction("fly");
		System.out.println("角色生命值:" + u.getLive() + "角色属性:" + u.getAttr() + "角色行为:" + u.getAction());

	}
}

方法覆盖

先说一下方法重载机制,方法重载又称为overload。 什么条件满足构成方法重载?
  1. 在同一个类中
  2. 方法名相同
  3. 参数列表不同:类型,顺序,个数
方法 重载和什么无关
  1. 方法的返回值类型
  2. 方法的修饰符列表无关
方法的覆盖,又称为方法重写,英文单词override/overwrite 什么时候该使用方法重写: 当父类中的方法已经无法满足当前子类的业务需求,子类有必要将父类中继承过来的方法进行重写,这个重写的过程称为方法覆盖/重写 什么条件满足之后构成方法重写
  1. 方法重写发生在具有继承关系的父子类之间
  2. 返回值类型相同,方法名相同,形参列表相同
  3. 访问权限不能更低,可以更高
  4. 抛出异常不能更多,可以更少
public class RoleTest{
	public static void main(String[] args){
		C c = new C();
		c.doSome();//B do some
	}
}
class A{
	public void doSome(){
		System.out.println("A do some");
	}
}

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

class C extends B{
	
}
私有方法不能继承,所以不能覆盖 构造方法不能继承,所以不能覆盖 静态方法不存在覆盖 覆盖只针对方法,不谈属性

发表评论