Java基础笔记-抽象,继承,多态

抽象类: abstract修饰

抽象方法必须定义在抽象类中,抽象类不能创建对象.

在抽象方法中可以不定义抽象方法,作用是:让该类不能建立对象.

特点是:

1.定义在抽象类中

2.方法和类都用abstract修饰,在抽象类中的方法不写abstract也默认的是抽象方法.

3.不能用new来创建对象,调用抽象方法没意义.

4.抽象类中的方法被使用,必须由子类覆写其所有的抽象方法后,才能建立子类对象进行调用.

 如果子类只覆盖了部分的抽象方法.那么该子类还是一个抽象类.

5.抽象类不可以被实例化.

 

继承:(extends)

关键字:extends,一般用于类与类之间的所属关系.java中是单继承,多实现(implements).

让类与类之间产生关系,从而才有了多态的特性.

当两个类有了继承关系以后.就可以在子类中调用父类的方法和属性,一般使用 super 关键字.

其用法和this关键字类似.super调用的是父类的,而this是调用的方法本身的.

 

 1 abstract class Employee

 2 {

 3     private String name;

 4     private String id;

 5     private double pay;

 6     //构造函数

 7     Employee(String name,String id,double pay)

 8     {

 9         this.name = name;

10         this.id = id;

11         this.pay = pay;

12     }

13     public abstract void work(); //抽象类.

14     

15 }

16 

17 class NormalWorker extends Employee

18 {    

19     NormalWorker(String name,String id,double pay)

20     {

21         super(name,id,pay);

22     }

23     

24     public void work()

25     {

26         System.out.println("NormalWorker Work");

27     }

28     

29 }

30 

31 class Manager extends Employee

32 {

33     private double bonus;

34     

35     Manager(String name,String id,double pay,double bonus)

36     {

37         super(name,id,pay);

38         this.bonus = bonus;

39     }

40     public void work()

41     {

42         System.out.println("Manager Work");

43     }

44     

45 }

46 class AbstractTest

47 {

48     public static void main(String args[])

49     {

50         Manager M = new Manager("lisi","0910",10000,5000);

51         M.work();

52         

53     }

54 }
View Code

多态:
向上转型:将子类的对象转给父类的引用.

向下转向;将父类转换成子类类型.

一般使用的是向上转型,向下转型会出现不安全的问题,例如,猫是动物,但是我们不能说动物就是猫.

 1 /*

 2 多态:

 3 人:男人,女人

 4 动物:猫,狗

 5 猫 m =new 猫();

 6 动物 m = new 猫();

 7 特点:提高代码的拓展.

 8 */

 9 abstract class Animal

10 {

11     abstract void eat();

12 }

13 

14 class Cat extends Animal

15 {

16     public void eat()

17     {

18         System.out.println("吃鱼");

19     }

20     public void catchMouse()

21     {

22         System.out.println("抓老鼠");

23     }

24 }

25 

26 class Dog extends Animal

27 {

28     public void eat()

29     {

30         System.out.println("啃骨头");

31     }

32     public void kanJia()

33     {

34         System.out.println("看家");

35     }

36 }

37 

38 class Pig extends Animal

39 {

40     public void eat()

41     {

42         System.out.println("饲料");

43     }

44     public void swim()

45     {

46         System.out.println("游泳");

47     }

48 }

49 

50 

51 

52 class DuoTaiDemo

53 {

54     public static void  main(String args[])

55     {

56         /*

57         Cat c = new Cat();

58         c.eat();

59         Dog d = new Dog();

60         d.eat();

61         Pig p = new Pig();

62         p.eat();

63         */

64         /*

65         function(new Cat());

66         function(new Dog());

67         function(new Pig());

68         */

69         //Animal c = new Cat(); //向上转型 

70         function(new Cat());

71         function(new Dog());

72         function(new Pig());

73     }

74     /*

75     public static void function(Cat c)

76     {

77         c.eat();

78     }

79     public static void function(Dog d)

80     {

81         d.eat();

82     }

83     public static void function(Pig p)

84     {

85         p.eat();

86     }

87     */

88     public static void function(Animal a)

89     {

90         a.eat();

91     }

92 }
View Code
 1 abstract class Animal

 2 {

 3     abstract void eat();

 4 }

 5 

 6 class Cat extends Animal

 7 {

 8     public void eat()

 9     {

10         System.out.println("吃鱼");

11     }

12     public void catchMouse()

13     {

14         System.out.println("抓老鼠");

15     }

16 }

17 

18 class Dog extends Animal

19 {

20     public void eat()

21     {

22         System.out.println("啃骨头");

23     }

24     public void kanJia()

25     {

26         System.out.println("看家");

27     }

28 }

29 

30 class Pig extends Animal

31 {

32     public void eat()

33     {

34         System.out.println("饲料");

35     }

36     public void swim()

37     {

38         System.out.println("游泳");

39     }

40 }

41 

42 

43 

44 class DuoTaiDemo2

45 {

46     public static void  main(String args[])

47     {

48         /*

49         Animal a = new Cat(); //向上转型 

50         a.eat();

51         Cat c = (Cat)a; //向下转型,将父类的引用转成子类类型.

52         c.catchMouse();

53         */

54         function(new Cat());

55         function(new Dog());

56         function(new Pig());

57     }

58     

59     public static void function(Animal a)

60     {

61         a.eat();

62         if(a instanceof Cat)

63         {

64             Cat c = (Cat)a;

65             c.catchMouse();

66         }

67         else if(a instanceof Dog)

68         {

69             Dog d = (Dog)a;

70             d.kanJia();

71         }

72         else if(a instanceof Pig)

73         {

74             Pig p = (Pig)a;

75             p.swim();

76         }

77         

78     }

79 }
View Code
 1 /*

 2 练习: 

 3 基础班学生:学习,睡觉.

 4 高级班学生:学习,睡觉.

 5 */

 6 abstract class Student

 7 {

 8     public abstract void study();

 9     public void sleep()

10     {

11         System.out.println("躺着睡.");

12     }

13     

14 }

15 

16 class DoStudent

17 {

18     public void doSomething(Student stu)

19     {

20         stu.study();

21         stu.sleep();

22     }

23 }

24 

25 class BaseStudent extends Student

26 {

27     public void study()

28     {

29         System.out.println("base study");

30     }

31     public void sleep()

32     {

33         System.out.println("站着睡");

34     }

35 }

36 

37 class AdvStudent extends Student

38 {

39     public void study()

40     {

41         System.out.println("adv study");

42     }

43 }

44 

45 

46 

47 

48 

49 class DuoTaiTest

50 {

51     public static void main(String args[])

52     {

53         /*

54         BaseStudent bs = new BaseStudent();

55         bs.study();

56         bs.sleep();

57         AdvStudent as = new AdvStudent();

58         as.study();

59         as.sleep();

60         */

61         DoStudent ds = new DoStudent();

62         ds.doSomething(new BaseStudent());

63         ds.doSomething(new AdvStudent());

64     }

65 }
View Code

多态中成员的特点:
1.成员函数的特点; 在编译时,参阅引用型变量所属的类中是否有调用方法,有的话编译会通过,没有的话会编译失败

         在运行时,参阅对象所属的类中属否有调用方法.

面试中可能遇见的问题.问调用显示结果.

   成员函数(非静态的)在多态调用时,编译看左边,运行看右边.

   静态函数,无论编译还是运行,都看左边

 

看了一下之前写的那篇笔记,感觉都没什么能写的了,不知道写些什么,越往后学感觉都是得理解的,越学越难的说,最近又没什么状态,只好慢慢来,慢慢学习了.

你可能感兴趣的:(java基础)