今天学到了接口和抽象类
接口是什么?它是一种百分百纯抽象类。那么什么是抽象类呢?它是无法初始化的类。
我们可以写出这样的指令:
Wolf aWolf = new Wolf(); 声明了wolf类型的aWolf引用变量指向Wolf对象。
也可以这样:
Animal aHippo = new Hippo();声明了Animal类型的aHippo引用变量指向Hippo对象。
但是这样会很奇怪:
Animal anim = new Animal();
因为Animal不算是一个具体的实例,我们可以创建出Wolf对象或Hippo对象或Tiger对象,但Animal对象呢?它应该长什么样子?什么颜色、大小?这个类是不应该被初始化的。解决的办法是 我们一定要有Animal这个类来继承和产生多态。但是要限制只有它的子类才能够被初始化。我们要的是Lion、Hippo对象,而不是Animal对象。
通过将类标记为抽象类也就是让这个类不能被“new”出来,那编译器就知道不管在哪里,这个类就是不能创建任何类型的实例。但还是可以用这种抽象的类型作为引用类型,这也是为何要有抽象类型的目的。
设计抽象的类很简单----在类的声明前面加上抽象类关键词 abstract 就好。
例如
abstract class Lion extends Animal{
public void roam(){}
}
抽象类代表没人能创建出该类的实例,我们可以使用抽象类来声明为引用类型给多态使用,不用担心该类型的对象会被创建,因为编译器会保证这件事。
抽象类除了被继承过之外,是没有用途、没有值、没有目的
除了类,也可以将方法标记为 abstract 的。
抽象的类代表此类必须要被 extends,抽象的方法代表此方法一定要被覆盖。
抽象的方法没有实体!
因为编写的抽象程序代码始终会被覆盖。
public abstract void eat(); //没有方法体,直接以分号结束
如果你声明出一个抽象方法,就必须将类也标记为抽象的。因为不能在非抽象类中拥有抽象方法。(就算只有一个抽象的方法,此类也必须标记为抽象的)。
抽象方法的意义就是就算无法实现出方法的内容,但还是可以定义出一组子型共同的协议。这样做的好处就是多态!通过这个机制,你可以加入新的子型到程序中,却又不必重写或修改处理这些类型的程序,因此多态的好处就在于所有子型都会有那些抽象方法。
抽象类中的所有的方法都必须实现,实现抽象的方法就如同覆盖过方法一样,抽象的方法没有内容,它只是为了标记多态而存在。这表示在继承树结构下的及一个具体类必须要实现出所有的抽象方法。但是我们还可以通过抽象机制将实现的负担转给下层。
例如说将Animal与Feline都标记为abstract ,则Feline就无需实现出Aniaml的抽象方法。但具体的类,例如说Cat,就得实现出Animal和Feline的抽象方法。
抽象类可以带有抽象和非抽象的方法,因此Feline也可以实现Animal的抽象方法,让Dog不必实现这个部分。但是如果Feline没有对Animal的抽象类表示出任何意见,就得Cat自己实现出Animal的抽象方法。
说到 实现所有的抽象方法时,表示必须写出方法体内容,必须以相同的方法名称与参数和相容的返回类型创建出非抽象的方法。Java是很注重具体的子类有没有是实现这些方法。
Animal代码
abstract public class Animal{ //abstract 设为抽象类
protected String name;
// private String food;
// protected int weight;
void setterName(String setName) {
name = setName;
System.out.println(name);
}
String getterName() {
return name;
}
public abstract void eat();
public void sleep() {
System.out.println("趴着睡");
};
public abstract void roam();
public abstract void makeNoise();
}
Feline代码
abstract public class Feline extends Animal{
public void roam() {
System.out.println("so fast");
}
}
Lion代码
public class Lion extends Feline{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃肉");
}
@Override
public void makeNoise() {
// TODO Auto-generated method stub
System.out.println("嗷嗷嗷嗷嗷");
}
}
Tiger代码
public class Tiger extends Feline{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃肉");
}
@Override
public void makeNoise() {
// TODO Auto-generated method stub
System.out.println("呜呜呜呜呜");
}
}
Cat代码
public class Cat extends Feline{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("主吃肉,偶尔吃点草");
}
@Override
public void makeNoise() {
// TODO Auto-generated method stub
System.out.println("喵喵喵喵");
}
}
Test代码
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal aniLion = new Lion();
aniLion.setterName("lion");
aniLion.eat();
aniLion.sleep();
aniLion.roam();
aniLion.makeNoise();
System.out.println();
Animal aniTiger = new Tiger();
aniTiger.setterName("Tiger");
aniTiger.eat();
aniTiger.sleep();
aniTiger.roam();
aniTiger.makeNoise();
System.out.println();
Animal aniCat = new Cat();
aniCat.setterName("Cat");
aniCat.eat();
aniCat.sleep();
aniCat.roam();
aniCat.makeNoise();
}
}
非常粗糙的代码,但是意思到了就行 :) 。
输出:
lion
吃肉
趴着睡
so fast
嗷嗷嗷嗷嗷
Tiger
吃肉
趴着睡
so fast
呜呜呜呜呜
Cat
主吃肉,偶尔吃点草
趴着睡
so fast
喵喵喵喵
水平有限 如有不对 还望指出。
本文深入探讨了抽象类和接口的概念,解释了它们在多态和抽象编程中的作用。通过具体的代码示例,展示了如何使用抽象类和接口来定义一组子类的共同协议,以及如何实现抽象方法。
216

被折叠的 条评论
为什么被折叠?



