java中的抽象函数_java中的抽象类

packagecom.aaa.zxf.ajax.test;/**一、java中的 抽象

Animal这个类 存在的意义是什么?

(动物园真的有一个动物叫Animal吗?没有 但是你为了某种操作创建了Animal 那么此时程序就有一个bug

分析:

1 Animal这个来存来仅仅是用来产生多态,但是为了多态而导致能创建Animal对象这显然是不合理的,

所以我们希望:Animal这个类得存在,但是不能通过new 创建对象

2 Animal的eat有用,在编译的时候 如果Animal没有eat函数 编译不会通过,但是我们运行的时候 是调用的真实类型的eat()所以Animal的eat不会被调用。

Animal的eat方法得有 但是方法体没什么用。

所以我们希望:Animal中的eat函数 只声明 不写实现(因为没必要写)。

3 Animal的子类必须要有各自的eat函数,但是我们做的练习 eat可以不写,此时会去调用父类的eat函数。所以我们希望:子类必须实现eat()函数

解决方案:将Animal这个类变成抽象类

二、声明一个抽象类

三、java中抽象类中构造函数使用

1. 构造函数是对象的基本,没有构造函数就没有对象。

2. 父类抽象类中写了有参数的构造函数,子类继承是就必须写一个构造函数来调用父类的构造函数

四、匿名内部类*/

public classJavaDuoTai {public static voidmain(String[] args) {//继承多态

Animal02 h = newHourse();//h 代表了两个对象。

h.sleep(); //调用父类抽象类中的普通方法 sleep

h.eat(); //调用子类中的方法 eat。

Hourse hourse= new Hourse("张三", 45);

System.out.println(" name="+hourse.name +" age="+hourse.age);/*** 抽象类无法通过new 来创建对象。 因为是抽象的。

* 我是匿名内部类 实现它的抽象方法。

* 这种写法*/Animal02 animal02= newAnimal02() {

@Overridepublic voideat() {

System.out.println("我是匿名内部类");//多一个T$1.class,这个class就是匿名内部类的原型,//所以new针对的还是普通的class(虽然内部类和普通类有很大不一样),只不过这个class的写法稍有不同,它是编译器帮我们从匿名内部类中提取的。

System.out.println("获得class的对象"+this.getClass());

}

};//执行 匿名内部类

animal02.eat();

}

}classAnimal01{public intid;publicString name;private intage;voidrun(){

System.out.println("动物要吃饭");

}

}class Dog01 extendsAnimal01{publicString food;

@Overridevoidrun(){

System.out.println("狗吃骨头");

}

}class Cat01 extendsAnimal01{publicString color;

@Overridevoidrun(){

System.out.println("猫吃鱼");

}

}/*** 二、 声明一个抽象类

*

* 1. 关键字 abstract 用来修饰类 和 方法。

*

*

* 2. 抽象类的特征?

* A 抽象方法不需要写方法体

* B 抽象方法必须在抽象类中

* The type Animal must be an abstract class to define abstract methods

* C 抽象类中不一定要有抽象方法 (抽象类可以有抽象方法 普通方法 成员方法)

* D 子类继承了一个抽象父类并且父类中有抽象方法 那么子类必须去重写抽象方法----》抽象方法由子类负责实现

* E 抽象类不能通过new创建对象 但是 有构造函数 (

* 这个构造函数是用来让子类调用的

**/

//定义一个抽象类。

abstract classAnimal02{publicString name;public intage;publicAnimal02() {

}//有参数的构造函数 这个构造函数是用来让子类调用的

public Animal02(String name, intage) {this.name =name;this.age =age;

}public abstract void eat(); //1.抽象方法不需要写方法体 2.抽象方法必须在抽象类中//抽象类中不一定要有抽象方法 普通方法

public voidsleep(){

System.out.println("睡觉!");

}

}//子类 继承抽象类 需要重写父类的方法

class Hourse extendsAnimal02{publicHourse() {

}//让子类调用父类的 构造函数 关键字 super

public Hourse(String name, intage) {super(name, age);

}

@Overridepublic voideat() {

System.out.println("马飞飞。");

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值