day7抽象类接口多态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day7抽象类接口多态相关的知识,希望对你有一定的参考价值。

抽象类

为什么使用抽象类

    1:定义Dog类

       有颜色属性和叫的方法

    2:定义Bird类

       有颜色属性和叫的方法

    3:定义其父类Animal

       1:抽取共性颜色属性和叫的方法

           1:颜色的属性可以使用默认初始化值。

           2:叫的方法在父类中如何定义?

              1:狗是旺旺

              2:鸟是叽叽喳喳

              3:可以将父类的方法定义为狗叫让鸟继承父类重写叫的方法

                  1:鸟怎么确定是否要重写父类方法。

       2:不重写,编译和运行都没有问题,只是执行鸟叫的方法就会出现狗叫

              4:父类的方法很难确定。

4:抽象类

    1:当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。

5:抽象类的实现方式

           1:定义animal类

                  1:定义叫的方法,无法确定方法体,不写方法体

                     1:public void shout (); 编译失败  

                  2:根据提示在shout的方法加入abstract修饰

                     1:编译失败,有新的提示

                  3:根据提示将类加入abstract修饰

                     1:编译通过

技术分享
 1 abstract class Animal {
 2     String color;
 3 
 4     abstract void shout();
 5 }
 6 
 7 class Dog extends Animal {
 8 
 9     void shout() {
10         System.out.println("旺旺");
11     }
12 
13 }
14 
15 class Bird extends Animal {
16 
17     void shout() {
18         System.out.println("叽叽喳喳");
19     }
20 }
View Code

6:抽象类的特点

           1:有抽象函数的类,该类一定是抽象类。

           2:抽象类中不一定要有抽象函数。

           3:抽象类不能使用new创建对象

              1:创建对象,使用对象的功能,抽象类的方法,没有方法体。

           4:抽象类主要为了提高代码的复用性,让子类继承来使用。

           5:编译器强制子类实现抽象类父类的未实现的方法。

              1:可以不实现,前提是子类的也要声明为抽象的。

7:抽象的优点

           1:提高代码复用性

              2:强制子类实现父类中没有实现的功能

           2:提高代码的扩展性,便于后期的代码维护

       8:抽象类不能创建对象,那么抽象类中是否有构造函数?

      1:抽象类中一定有构造函数。主要为了初始化抽象类中的属性。通常由子类实现。

       9:final和abstract是否可以同时修饰一个类? 

           一定不能同时修饰。

技术分享
 1 abstract class Animal {
 2 
 3     String name;
 4 
 5     // 抽象类可以有构造函数
 6     Animal() {
 7 
 8     }
 9 
10     Animal(String name) {
11         this.name = name;
12     }
13 
14     abstract void shout();
15 
16 }
17 
18 class Dog extends Animal {
19     Dog() {
20 
21     }
22 
23     Dog(String name) {
24         super(name);
25     }
26 
27     void shout() {
28         System.out.println("旺旺");
29 
30     }
31 }
32 
33 class Demo3 {
34 
35     public static void main(String[] args) {
36         // 抽象类不能创建对象
37         // Animal a=new Animal();
38         Dog d = new Dog("旺财");
39 
40         System.out.println();
41     }
42 }
View Code

2:抽象练习

1:定义抽象类MyShape(图形)

       1:定义抽象方法获取图形的长度和面积

2:定义子类Rect继承父类MyShape  

       1:定义自身特有的长和宽(成员变量)  width height;

       2:实现父类未实现的函数。

    3:定义子类 Circle实现父类MyShape

       1:定义自身特有的半径和圆周率(使用常量)

       2:实现父类为实现的方法。

技术分享
 1 /*
 2  }
 3  2:抽象练习 
 4  1:定义抽象类MyShape(图形)
 5  1:定义抽象方法获取图形的长度和面积
 6  2:定义子类Rect继承父类MyShape   
 7  1:定义自身特有的长和宽(成员变量)  width height;
 8  2:实现父类未实现的函数。
 9  3:定义子类 Circle实现父类MyShape
10  1:定义自身特有的半径和圆周率(使用常量)
11  2:实现父类为实现的方法。
12  */
13 abstract class MyShape {
14 
15     abstract double getLen();
16 
17     abstract double getArea();
18 
19 }
20 
21 class Rect extends MyShape {
22     double width;
23     double height;
24 
25     Rect() {
26 
27     }
28 
29     Rect(double width, double height) {
30         this.width = width;
31         this.height = height;
32     }
33 
34     double getLen() {
35         return 2 * (width + height);
36     }
37 
38     double getArea() {
39         return width * height;
40     }
41 }
42 
43 class Circle extends MyShape {
44     double r;
45     public static final double PI = 3.14;
46 
47     Circle() {
48 
49     }
50 
51     Circle(double r) {
52         this.r = r;
53     }
54 
55     double getLen() {
56         return 2 * PI * r;
57     }
58 
59     double getArea() {
60         return PI * r * r;
61     }
62 }
63 
64 class Demo4 {
65 
66     public static void main(String[] args) {
67         Rect r = new Rect(5, 5);
68         System.out.println(r.getLen());
69         System.out.println(r.getArea());
70         System.out.println();
71 
72         Circle c = new Circle(5);
73         System.out.println(c.getLen());
74         System.out.println(c.getArea());
75 
76     }
77 }
View Code

 抽象类注意细节

抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的)。

抽象类可以继承普通类与抽象类。

抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化。

抽象类一定有构造方法。

abstract与其他修饰符的关系:

       final与abstract不能共存:

              final:它的作用  修饰类代表不可以继承  修饰方法不可重写

              abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。

       static static修饰的方法可以用类名调用,

               对于abstract修饰的方法没有具体的方法实现,所有不能直接调用,

              也就是说不可以与static共存。

       private

              private修饰的只能在本类中使用,

              abstract方法是用来被子类进行重写的,有矛盾

              所有不能共存.

练习:使用抽象类计算一个矩形与圆形的面积。

以上是关于day7抽象类接口多态的主要内容,如果未能解决你的问题,请参考以下文章

java中封装,继承,多态,接口学习总结

多态抽象类魔术方法

接口与抽象类 多态

面向对象_多态_抽象类_接口

抽象类,接口类,封装,多态

多态抽象类与接口