抽象类
抽象类
关键字为:abstract
Java中使用抽象类作用:限制实例化(不能建立对象)
语法:
Public abstract class Pet{
//属性
//方法
}
abstract也可用于方法——抽象方法
- 抽象方法没有方法体
- 抽象方法必须在抽象类里
- 抽象方法必须在子类中被实现,除非子类也是抽象类
final用法
被final定义的类不可以被修改
如:
Public final class Dog(){
//…
};
被final定义的方法为最终方法不可以被修改
Public final void show(){
//…
};
被final定义的属性不可以被修改(常量)
final String name=”小黑”;
多态
多态:提供的接口(方法),面对不同的对象执行不同的的操作
使用多态实现思路(实现多态的三要素)
- 编写具有继承关系的父类和子类
- 子类重写父类的方法
- 使用父类的引用指向子类的对象
向上转型:(自动转换)//父类的引用指向不同的对象
如: Dog dog= new Dog(“旺财”,“土狗”)
改为Pet dog= new Dog(“旺财”,“土狗”)
向下转型//父类到子类的转换
如:Pet pet=new Dog(“欧欧”,”雪纳瑞”);
Dog dog = (Dog)pet; //必须转换为父类指向的真实子类类型
使用instanceof运算符
语法:
对象 instanceof 类或接口
作用:匹配两个类型是否相等(通常和强制类型转换结合使用)
//向下转型
public void play(Pet pet) {
if (pet instanceof Dog) {
//强转
Dog dog = (Dog)pet;
dog.fly();
}else if (pet instanceof Penguin) {
Penguin pen=(Penguin)pet;
pen.swimming();
}
}
实现多态的两种形式
1.使用父类作为方法形参实现多态
2.使用父类作为方法返回值实现多态
实例:
//父类
public abstract class Pet {
//属性
String name;
int health=80;
int love=0;
//构造
public Pet() {
}
public Pet(String name) {
this.name =name;
}
//抽象方法
public abstract void eat();
public void show(){
System.out.println("名字:"+this.name+"\t品种:"+"\t健康值:"+this.health+"\t亲密度:"+this.love);
}
}
/*
- 子类:狗类继承父类
*/
public class Dog extends Pet{
//属性
String strain;
//构造
public Dog(String name,String strain) {
super(name);
this.strain=strain;
}
//方法1:吃
public void eat() {
if (super.health>=100) {
System.out.println("狗狗吃饱了。。。");
}else {
super.health=+5;
System.out.println("狗狗吃鸡翅了");
}
}
//方法2:和主人玩飞盘
public void fly() {
System.out.println("和主人玩飞盘很开心");
}
public void show(){
System.out.println("名字:"+this.name+"\t品种:"+this.strain+"\t健康值:"+this.health+"\t亲密度:"+this.love);
}
}
//子类:企鹅类
public class Penguin extends Pet {
//属性
String sex;
//构造
public Penguin(String name,String sex) {
super(name);
this.sex=sex;
}
//方法1:吃
public void eat() {
if (super.health>=100) {
System.out.println("小猫鱼吃多了。。。");
}else {
super.health=+3;
System.out.println("猫吃小鱼了。");
}
}
//方法2:游泳
public void swimming() {
System.out.println("和主人游泳很开心");
}
public void show(){
System.out.println("名字:"+this.name+"\t性别:"+this.sex+"\t健康值:"+this.health+"\t亲密度:"+this.love);
}
}
//主人类:创建多态方法
public class Master {
//多态方法1使用父类作为方法形参实现多态:喂食
public void feed(Pet pet) {
pet.eat();
}
//多态方法:和动物玩
//向下转型
public void play(Pet pet) {
if (pet instanceof Dog) {
//强转
Dog dog = (Dog)pet;
dog.fly();
}else if (pet instanceof Penguin) {
Penguin pen=(Penguin)pet;
pen.swimming();
}
}
//方法2.使用父类作为方法返回值实现多态
public Pet choice(int i) {
Pet pet =null;
if (i==1) {
pet=new Dog("小黑", "拉布拉多");
}else if (i==2) {
pet=new Penguin("小白", "雌");
}
return pet;
}
}
/*
- 测试类
*/
public class DomeTest {
public static void main(String[] args) {
//创建主人对象
Master master=new Master();
Scanner input=new Scanner(System.in);
System.out.println("请选择宠物:1.狗2.猫");
int i=input.nextInt();
//向上转型
//创建狗狗对象
Pet dog=new Dog("小黑", "中华田园犬");
//创建企鹅对象
Pet pen=new Penguin("小白", "雌");
Pet p=master.choice(i);
p.show();
master.feed(dog);
master.feed(pen);
master.play(dog);
master.play(pen);
}
}
结果为: