最近在学习Java,谈一下学习中对抽象类的了解,如有谬误与还请大佬斧正。
在Java继承中会有子类与超类之分。超类与子类能够说是个别与非凡,形象与具体的关系。比方水果与香蕉,人与学生,汽车与红旗,手机与华为等。
在这里以Dog类与Bird类举例,每个动物都会有本人的名字或者品种,因而咱们能够引入一个公共的超类,能够把Dog类与Bird类中反复的办法放在继承档次中更高的一层。另外,咱们能够在公共的超类中增加一个getDescription办法,它能够进行一个动物的简要形容。此时咱们设置一个超类Animal。
然而在Animal中只理解到动物的名字,对于其余的形容无所不知,该如何设定getDescription办法呢?此时能够应用abstract关键字,这样就齐全不须要实现这个办法,把具体的实现代码留给子类中去实现。
public abstract class Animal{ /*.....*/ public abstract void getDescription();//形象办法}
为了进步程序的清晰度,蕴含一个或多个形象办法的类自身必须被申明为形象的。如Animal中,getDescription()办法是形象的,那么该类必须也被申明为形象的。 抽象类除了蕴含形象办法,也能够蕴含一些具体的字段和具体的办法。
public abstract class Animal{ private String name; public Animal(String _name) { this.name=_name; } public String getName() { return this.name; } public abstract void getDescription();//形象办法}
通过扩大形象Animal类,并实现办法getDescription类来定义Dog类与Bird类,此时因为在Dog与Bird类中不再含有形象办法,所以不须要将其申明为抽象类。
即便不含形象办法,也能够将类申明为抽象类。
抽象类是不能实例化的,但能够创立一个具体子类的对象.
Animal dog1 = new Animal("小黑");//谬误的申明 Animal dog1 = new Dog("小黑","汪汪汪","阿拉斯加");//这里的dog1是一个形象类型的 Animal变量,援用了一个非形象子类Dog的一个实例
下面试测试代码。
public abstract class Animal{ private String name; public Animal(String _name) { this.name=_name; } public String getName() { return this.name; } public abstract void getDescription();//形象办法}
public class Bird extends Animal{ private String color; private int age; public Bird(String _name,String _color,int _age) { super(_name); color = _color; age = _age; } @Override public void getDescription() { System.out.println("年龄为"+age+color+"色彩的"+getName()+"在地面翱翔"); }}
public class Dog extends Animal{ private String call; private String kind; public Dog(String _name,String _call,String _kind) { super(_name); call=_call; kind=_kind; } @Override public void getDescription() { System.out.println(getName() + "的品种是"+kind+"能够" + call); }}
public class Test{ public static void main(String[] args) { var animal = new Animal[2]; animal[0] = new Dog("小哈","汪汪汪","哈士奇"); animal[1] = new Bird("小红","红",5); for(Animal a : animal)//应用了形象办法,能够间接从变量a中调用getDescription办法 a.getDescription(); }}