9 abstract类和abstract方法

比喻:画家在外面看到事物,先速写一下,画个大概,然后回到画室再具体画细节。

   写论文时,先摘要,写摘要也很需要水平,然后再根据摘要写论文,补充论文的具体内容。

而abstract类就像摘要和速写一样。

1.abstract类中可以有abstract方法

abstract class A{

  abstract int min(int x,int y);  //没有方法体

}

当然,abstract类也可以不写abstract方法,只是这样做,就浪费了abstract,白写了

2.abstract类不能用new运算符创建对象

A a;可以用abstract类声明对象

newA();但是不可以new它 (声明对象可以但不能new这个类)

3. abstract类的子类

我的理解:abstract类必须有子类,就像速写一样,必须要把它的细节画具体,才能是一副完整美丽的画;就像写论文一样,光写摘要,不写论文的内容,那就不是一篇论文了,那摘要写了也没什么意义了。

     所以abstract类必须要有子类,才有意义(这也就是为什么不能用final关键字修饰abstract类和abstract方法的原因,abstract类必须要有子类,不然就没意义了)

书上:如果一个非abstract类是abstract类的子类,它必须重写父类的abstract方法,即去掉abstract方法的abstract修饰,并给出方法体。如果一个abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法。

           不允许使用final和abstract类同时修饰一个方法或类,也不允许使用static修饰abstract方法,即abstract方法必须是实例方法。

class B extends A{

 int min(int x,int y){

}

abstract类的子类必须重写abstract类的abstract方法(就是去掉abstract关键字,剩下的抄一遍都可以,方法体不写也行),比如这个例子:我必须要方法min能求最小值,所以重写了A类中的min方法。

特殊情况:如果abstract类的子类也是个abstract类,那么无所谓,你愿意重写就重写,要不愿意重写就啥也不写,老老实实继承;

    如果子类不是abstract类,也就不会让你老老实实继承,要求你必须得重写。(所以一定不能用final修饰抽象方法 ,因为一定会重写)

4.abstract类的对象作上转型对象

我只要用A a;(用A声明一个对象a就可以了),我也不需要去newA,而且也不能够new抽象类A;

但我可以直接a =new B();,不用去newA,因为对象的上转型对象也能够去调用重写的方法。

5.理解abstract类

注重行为标准,而不是细节,细节留给子类

两个程序理解abstract类:

package P128继承与多态抽象类的改写;
abstract class 动物{
abstract void cry();
}
class 狗 extends 动物{

void cry() {
System.out.println("汪汪....");
}
}
class 猫 extends 动物{
void cry(){
System.out.println("喵喵....");
}
}
public class Example5_111 {
public static void main(String[] args) {
动物 a;
a=new 狗();
a.cry();
a=new 猫();
a.cry();

}

}




abstract  class GirlFriend{ //抽象类,封装了两个行为标准
abstract void speak();
abstract void cooking();
}
class ChinaGirlFriend extends GirlFriend{
void speak(){
System.out.println("你好");
}
void cooking(){
System.out.println("水煮鱼");
}
}
class AmericanGirlFriend extends GirlFriend{
void speak(){
System.out.println("hello");
}
void cooking() {
System.out.println("roast beef");
}
}


class Boy{
GirlFriend friend;
void setGirlFriend(GirlFriend f){
friend = f;
}
void showGirlFriend(){
friend.speak();
friend.cooking();
}

}

public class Example5_12 {
public static void main(String[] args) {
GirlFriend girl=new ChinaGirlFriend();
Boy b1=new Boy();
b1.setGirlFriend(girl);
b1.showGirlFriend();
girl =new AmericanGirlFriend();
b1.setGirlFriend(girl);
b1.showGirlFriend();
}

}
posted @ 2022-07-03 23:16  馅饼丶  阅读(384)  评论(0)    收藏  举报