CHAPTER-7 继承和多态

继承和多态



继承

继承是面向对象大的三大特性之一。

在Java中只支持单继承,即每个类只能有一个直接父类。

-语法

[访问修饰符]class<SubClass>extends<SuperClass>{
    
}

在Java中继承通过extends关键字实现,其中SubClass称为子类,SuperClass称为父类或基类

访问修饰符如果是public,那么该类在整个项目中可见

若不写访问修饰符,则该类只在当前包中可见

在Java中,子类可以从父类中继承以下内容:

1.可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包里;

2.可以继承默认修饰符修饰的属性的方法,但是子类和父类必须在同一个包里;

3.无法继承父类的构造方法

//父类为Department
public class Department{
    private int ID;//部门编号
    private String name="";//部门名称
    private int amount=0;//部门人数
    private String reponsibility="";//部门职责
    private String manager="";//部门经理
    
    public Department(){
        //无参构造方法
    }
    public Department(String name,String manager,String responsibility){
        //带参构造方法
        this.name=name;
        this.manager=manager;
        this.responssibility=responsibility;
    }
    public int getID(){
        return ID;
    }
    public void setID(){
        this.ID=id;
    }
    //...省略的其他aetter\getter的代码
    public void printDetail(){
        System.out.println("部门:"+this.name+"\n经理:"+this.manager
                           +"\n部门职责:"+this.responsibility+"\n+.....");
    }
}

方法重写

方法重写或方法覆盖(overriding)

1.子类根据需求对父类继承的方法进行重新编写

2.重写时,可以用 super.方法 的方式来保留父类的方法

3.构造方法不能被重写

方法重写规则

1.方法名相同

2.参数列表相同

3.返回值类型相同或者是其子类

4.访问权限不能严于父类

5.父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法

6.子类可以定义为父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)

7.父类的私有方法不能被子类覆盖

8.不能抛出比父类方法更多的异常

Object类

Object类是所有类的父类

Object类被子类经常重写的方法

方法说明
toString()返回当前对象本身的有关信息,按字符串对象返回
equals()比较两个对象是否是同一个对象,是则返回true
hashCode()返回该对象的哈希代码值
fetClass()获取当前对象所属的类信息,返回Class对象
Object类的equals()方法

1.比较两个对象是否是同一个对象,是则返回true

2.操作符 ==

-1.简单数据类型,直接比较直。如 1==2

-2.引用类型,比较两者是否为同一对象

–1.Object类的equals()方法与==没区别

–2.当有特殊需求,如认为属性相同即为同一对象时,需要重写equals()

–3. Jaca.lang.String 重写了equals()方法,把equals()方法的判断变为了判断其值


多态

使用父类作为方法的形参,是Java中实现和使用多态的主要方法

什么是多态

1.同一种事物,由于条件不同,产生的结果也不同

多态:同一个引用类型,使用不同的实例而执行不同操作

多态的使用

1.方法重写时实现多态的基础

抽象方法

1.抽象方法没有方法体

2.抽象方法必须在抽象里

3.抽象方法必须在子类中被实现,除非子类时抽象类

public abstract void print();

向上转型

<父亲类><引用变量类型>=new<子类型>();

1.通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法

2.通过父类引用变量无法调用子类特有的方法

向上转型:父类的引用指向子类对象,自动进行类型转换

向下转型

调用子类特有的方法

Dog dog = (Dog)pet;//将pet转换为Dog类型
dog.catchingFlyDisc;//执行Dog特有的方法

向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即:父类类型转换为子类类型。需强制类型转换

<子类型><引用变量名>=(<子类型>)<父亲类型 的引用变量>;

在向下转型的过程中,如果没有转换为真是子类类型,会出现类型转换异常

instanceof

1.如何减少在向下转型的过程中,没有转换为真实子类类型的类型转换异常?

Java中提供了 instanceof 运算符来进行类型的判断

2.使用 instanceof 时,对象的类型必须和 instanceof 后面的参数所指定的类在继承上有上下级关系



案例

案例1

创建子类 狗狗类

//狗狗类
public class Dog extends Pet {
	private String strain;
	public Dog(String name,int health,int love,int strain) {
		super(name,health,love);
		this.strain = strain == 1 ? "泰迪" : "雪娜瑞犬" ;
	}
	public String getStrain() {
		return strain;
	}
	public void setStrain(String strain) {
		this.strain = strain;
	}
	@Override
	public void print() {		
		super.print();
		System.out.println("我是一只"+this.strain);
	}

}

创建子类 企鹅类

//企鹅类
public class Penguin extends Pet {
	private String sex;
	
	
	public Penguin(String name,int health,int love,int sex) {
		super(name,health,love);
		this.sex = sex == 1 ? "Q仔" : "Q妹";
	}


	public String getSex() {
		return sex;
	}


	public void setSex(String sex) {
		this.sex = sex;
	}


	@Override
	public void print() {
		
		super.print();
		System.out.println("我的性别是"+this.sex);
	}
}

创建父类 宠物类

import java.util.Scanner;

//宠物电子系统
public class Pet {
	private String name;
	private int health;
	private int love;
	
	
	public Pet() {
		super();
		
	}
	public Pet(String name,int health,int love) {
		this.name = name;
		this.health=health;
		this.love= love;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getHealth() {
		return health;
	}
	public void setHealth(int health) {
		this.health = health;
	}
	
	public int getLove() {
		return love;
	}
	public void setLove(int love) {
		this.love = love;
	}
	
	

	

	public void print() {

		System.out.println("宠物的自白: ");
		System.out.println("我的名字叫 "+this.name+",我的健康值是"+this.health+",我和主人的亲密度是"+this.love+".");	
	}
}

创建测试类 Test

import java.util.Scanner;

public class TestHw01 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("欢迎来到宠物店");
//		System.out.println("Please enter the name of Pet");
//		String name = sc.next();
		System.out.print("请选择宠物的类型(1.狗狗  2.企鹅):");
		int type = sc.nextInt();
		switch(type) {
		//Type of Dog
		case 1:
			Dog d = new Dog("欧欧",100,0,2);
			d.print();
			break;
		//Type of Penguin
		case 2:
			Penguin p = new Penguin("楠楠",100,0,2);
			p.print();
			break;	
		}	
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值