您好,欢迎访问一九零五行业门户网

Java抽象定义的示例分析

一、概述在oop这个概念中,所有的对象都是通过类来描述的;但是并不是所有的类都是用来描述对象的。如果一个类没有包含足够的信息来描述一个具体的对象,这样的类称为抽象类。
抽象类:(1)抽象类不能实例化对象,如果实例化某个对象,编译无法通过。只有抽象类的非抽象子类可以创建对象(2)可以包含:成员变量、成员方法、构造方法等。(3)构造方法、类方法(用static修饰的方法)不能声明为抽象方法
抽象方法:(1)如果一个类包含抽象方法,那么该类一定是抽象类(2)任何子类必须重写父类的抽象方法,或者声明自身为抽象类
定义:abstract class 类名
二、示例:农民喂动物animal:抽象类--------getname()、move()、drink()
reptile、mammal:继承抽象类
蛇、老虎、山羊、兔子:分别继承reptile或mammal
fammer:bringwater()、feedwater(animal animal)---- 负责将水带到指定的地方,然后动物移动去目的地,喝水
代码如下:
package abstractdemo; /** * @author lpx * @description todo * @date 2021-04-07 */public abstract class animal { abstract string getname(); abstract void move(string destination); abstract void drink();}abstract class reptile extends animal{ } abstract class mammal extends animal{ } class tiger extends mammal{ private static string name="tiger"; @override string getname() { return this.name; } @override void move(string destination) { system.out.println("tiger move to "+destination+"."); } @override void drink() { system.out.println("tiger lower it is head and drink"); }} class goat extends mammal{ private static string name="goat"; @override string getname() { return this.name; } @override void move(string destination) { system.out.println("goat move to "+destination+"."); } @override void drink() { system.out.println("goat lower it head to drink"); }} class rabbit extends mammal{ private static string name="rabbit"; @override string getname() { return this.name; } @override void move(string destination) { system.out.println("rabbit move to "+destination+"."); } @override void drink() { system.out.println("rabbit put out it is tongue and drink"); }} class snake extends reptile{ private static string name="snake"; @override string getname() { return this.name; } @override void move(string destination) { system.out.println("snake move to "+destination+"."); } @override void drink() { system.out.println("snake dived into and drink"); }} class farmer{ public void bringwater(string destination){ system.out.println("farmer bring water to " + destination + "."); } public void feedwater(animal a){ // polymorphism this.bringwater("feeding room"); a.move("feeding room"); a.drink(); } } class test{ public static void main(string[] args) { farmer fm=new farmer(); snake snake=new snake(); goat goat=new goat(); tiger tiger=new tiger(); rabbit rabbit=new rabbit(); fm.feedwater(snake); fm.feedwater(goat); fm.feedwater(tiger); fm.feedwater(rabbit); }}
执行结果:
总结:
如果每种动物不是抽象出drink和move方法的话,就无法实现多态。农夫类就需要根据参数的不同重载多个feedwater。如果继续添加动物那么重载个数就越来越多。为了方便对比理解,我也按照常规思维去写了一下,代码如下:
package abstractdemo; /** * @author lpx * @description todo * @date 2021-04-07 */ class tiger1{ private static string name="tiger"; string getname() { return this.name; } void move(string destination) { system.out.println("tiger move to "+destination+"."); } void drink() { system.out.println("tiger lower it is head and drink"); }} class goat1{ private static string name="goat"; string getname() { return this.name; } void move(string destination) { system.out.println("goat move to "+destination+"."); } void drink() { system.out.println("goat lower it head to drink"); }} class rabbit1{ private static string name="rabbit"; string getname() { return this.name; } void move(string destination) { system.out.println("rabbit move to "+destination+"."); } void drink() { system.out.println("rabbit put out it is tongue and drink"); }} class farmer1{ public void bringwater(string destination){ system.out.println("farmer bring water to " + destination + "."); } public void feedwater(goat1 goat){ // polymorphism this.bringwater("feeding room"); goat.move("feeding room"); goat.drink(); } public void feedwater(tiger1 tiger){ // polymorphism this.bringwater("feeding room"); tiger.move("feeding room"); tiger.drink(); } public void feedwater(rabbit1 rabbit1) { this.bringwater("feeding room"); rabbit1.move("feeding room"); rabbit1.drink(); }} public class test1{ public static void main(string[] args) { farmer1 farmer1=new farmer1(); tiger1 tiger1=new tiger1(); goat1 goat1=new goat1(); rabbit1 rabbit1=new rabbit1(); farmer1.feedwater(tiger1); farmer1.feedwater(goat1); farmer1.feedwater(rabbit1); }}
手敲了这个例子,发现基础很重要呀,以前学习的不细致,导致很多地方迷糊不知道为啥那么写。
(1)一个.java文件中可以定义多个class类,但是只有一个可以定义为public,且这个类名必须和文件名相同
(2)抽象类继承抽象类,不用覆盖其抽象方法(原因也很简单呀,本身他就是抽象的不能实现方法体)。而非抽象类继承抽象类必须覆盖抽象方法,非抽象方法非必要。
(3)重写和重载的区别(高频面试题 ?)
重载:定义相同的方法名,参数不同。属于编译时多态
重写:子类重写父类的方法@override。属于运行时多态
以上就是java抽象定义的示例分析的详细内容。
其它类似信息

推荐信息