Java基础之面向对象(三)--继承、抽象类、接口、final修饰符、模版方法模式

[java]  view plain copy
  1. /* 
  2. 将学生和工人的共性描述提取出来,单独进行描述, 
  3. 只要让学生和工人与单独描述的这个类有关系,就可以了。 
  4.  
  5. 继承: 
  6. 1,提高了代码的复用性。 
  7. 2,让类与类之间产生了关系。有了这个关系,才有了多态的特性。 
  8.  
  9.  
  10. 注意:千万不要为了获取其他类的功能,简化代码而继承。 
  11. 必须是类与类之间有所属关系才可以继承。所属关系 is a。 
  12. class C 
  13. { 
  14.     void demo1(){} 
  15. } 
  16.  
  17.  
  18. class A extends C 
  19. { 
  20.     //void demo1(){} 
  21.     void demo2(){} 
  22. } 
  23.  
  24. class B extends C 
  25. { 
  26.     //void demo1(){} 
  27.     void demo3(){} 
  28. } 
  29.  
  30. Java语言中:java只支持单继承,不支持多继承。 
  31.  
  32. 因为多继承容易带来安全隐患:当多个父类中定义了相同功能, 
  33. 当功能内容不同时,子类对象不确定要运行哪一个。 
  34. 但是java保留这种机制。并用另一种体现形式来完成表示。多实现。 
  35.  
  36.  
  37. java支持多层继承。也就是一个继承体系 
  38.  
  39. 如何使用一个继承体系中的功能呢? 
  40.  
  41. 想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。 
  42. 通过了解共性功能,就可以知道该体系的基本功能。 
  43. 那么这个体系已经可以基本使用了。 
  44. 那么在具体调用时,要创建最子类的对象,为什么呢? 
  45. 一是因为有可能父类不能创建对象, 
  46. 二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。 
  47.  
  48.  
  49. 简单一句话:查阅父类功能,创建子类对象使用功能。 
  50.  
  51.  
  52.  
  53. class A 
  54. { 
  55.     void show() 
  56.     { 
  57.         System.out.println("a"); 
  58.     } 
  59. } 
  60. class B 
  61. { 
  62.     void show() 
  63.     { 
  64.         System.out.println("b"); 
  65.     } 
  66. } 
  67.  
  68. class C extends A,B 
  69. {} 
  70.  
  71. C c = new C(); 
  72. c.show(); 
  73.  
  74. 聚集:has a 
  75.  
  76. 聚合: 
  77.  
  78. 组合: 
  79.  
  80.  
  81.  
  82.  
  83. */  
  84.   
  85. class Person  
  86. {  
  87.     String name;  
  88.     int age;  
  89.   
  90. }  
  91. class Student extends Person  
  92. {  
  93.         void study()  
  94.     {  
  95.         System.out.println("good study");  
  96.     }  
  97. }  
  98.   
  99. class Worker extends Person  
  100. {  
  101.     void work()  
  102.     {  
  103.         System.out.println("good work");  
  104.     }  
  105. }  
  106.   
  107.   
  108.   
  109. class ExtendsDemo   
  110. {  
  111.     public static void main(String[] args)   
  112.     {  
  113.         Student s = new Student();  
  114.         s.name = "zhagnsan";  
  115.     }  
  116. }  

[java]  view plain copy
  1. /* 
  2. 子父类出现后,类成员的特点: 
  3.  
  4. 类中成员: 
  5. 1,变量。 
  6. 2,函数。 
  7. 3,构造函数。 
  8.  
  9. 1,变量 
  10. 如果子类中出现非私有的同名成员变量时, 
  11. 子类要访问本类中的变量,用this 
  12. 子类要访问父类中的同名变量,用super。 
  13.  
  14. super的使用和this的使用几乎一致。 
  15. this代表的是本类对象的引用。 
  16. super代表的是父类对象的引用。 
  17.  
  18.  
  19.  
  20.  
  21.  
  22. */  
  23.   
  24. class Fu   
  25. {  
  26.     private int num = 4;  
  27.     public void setNum(int num)  
  28.     {  
  29.         this.num =num;  
  30.     }  
  31.     public int getNum()  
  32.     {  
  33.         return this.num;  
  34.     }  
  35. }  
  36.   
  37. class Zi extends Fu  
  38. {  
  39.     //int num = 5;  
  40.     void show()  
  41.     {  
  42.         System.out.println(num);  
  43.     }  
  44. }  
  45.   
  46. class  ExtendsDemo2  
  47. {  
  48.     public static void main(String[] args)   
  49.     {  
  50.         Zi z = new Zi();  
  51.         z.show();  
  52.         //System.out.println(z.num+"...."+z.num);  
  53.     }  
  54. }  

[java]  view plain copy
  1. /* 
  2. 2,子父类中的函数。 
  3.  
  4. 当子类出现和父类一模一样的函数时, 
  5. 当子类对象调用该函数,会运行子类函数的内容。 
  6. 如同父类的函数被覆盖一样。 
  7.  
  8. 这种情况是函数的另一个特性:重写(覆盖) 
  9.  
  10.  
  11. 当子类继承父类,沿袭了父类的功能,到子类中, 
  12. 但是子类虽具备该功能,但是功能的内容却和父类不一致, 
  13. 这时,没有必要定义新功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容。 
  14.  
  15.  
  16. 覆盖: 
  17. 1,子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。 
  18.  
  19. 2,静态只能覆盖静态。 
  20.  
  21.  
  22. 记住大家: 
  23. 重载:只看同名函数的参数列表。 
  24. 重写:子父类方法要一模一样。 
  25. */  
  26.   
  27. class Fu  
  28. {  
  29.     void show()  
  30.     {  
  31.         System.out.println("fu show");  
  32.     }  
  33.     void speak()  
  34.     {  
  35.         System.out.println("vb");  
  36.     }  
  37. }  
  38.   
  39. class Zi extends Fu  
  40. {  
  41.     void speak()  
  42.     {  
  43.         System.out.println("java");  
  44.     }  
  45.     void show()  
  46.     {  
  47.         System.out.println("zi show");  
  48.     }  
  49. }  
  50.   
  51.   
  52. class ExtendsDemo3   
  53. {  
  54.     public static void main(String[] args)   
  55.     {  
  56.         Zi z = new Zi();  
  57.         z.speak();  
  58.   
  59.     }  
  60. }  
  61.   
  62.   
  63. class Tel  
  64. {  
  65.     void show()  
  66.     {  
  67.         System.out.println("number");  
  68.     }  
  69.       
  70. }  
  71.   
  72. class NewTel extends Tel  
  73. {  
  74.     void show()  
  75.     {  
  76.         //System.out.println("number");  
  77.         super.show();  
  78.         System.out.println("name");  
  79.         System.out.println("pic");  
  80.     }  
  81. }  

[java]  view plain copy
  1. /* 
  2. 3,子父类中的构造函数。 
  3.  
  4. 在对子类对象进行初始化时,父类的构造函数也会运行, 
  5. 那是因为子类的构造函数默认第一行有一条隐式的语句 super(); 
  6. super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super(); 
  7.  
  8. 为什么子类一定要访问父类中的构造函数。 
  9.  
  10. 因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。 
  11. 所以子类在对象初始化时,要先访问一下父类中的构造函数。 
  12. 如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。 
  13.  
  14. 注意:super语句一定定义在子类构造函数的第一行。 
  15.  
  16.  
  17.  
  18. 子类的实例化过程。 
  19.  
  20. 结论: 
  21. 子类的所有的构造函数,默认都会访问父类中空参数的构造函数。 
  22. 因为子类每一个构造函数内的第一行都有一句隐式super(); 
  23.  
  24. 当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。 
  25.  
  26. 当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。 
  27. 子类中至少会有一个构造函数会访问父类中的构造函数。 
  28. */  
  29. class Fu //extends Object  
  30. {  
  31.     int num ;  
  32.     Fu()  
  33.     {  
  34.         //super();  
  35.         num= 60;  
  36.         System.out.println("fu run");  
  37.     }  
  38.     Fu(int  x)  
  39.     {  
  40.         System.out.println("fu ...."+x);  
  41.     }  
  42.       
  43. }  
  44.   
  45. class Zi extends Fu  
  46. {  
  47.     Zi()  
  48.     {  
  49.           
  50.         super();    
  51.         //super(4);  
  52.         System.out.println("zi run");  
  53.     }  
  54.     Zi(int x)  
  55.     {  
  56.         this();  
  57.         //super();  
  58.         //super(3);  
  59.         System.out.println("zi..."+x);  
  60.     }  
  61. }  
  62.   
  63. class  ExtendsDemo4  
  64. {  
  65.     public static void main(String[] args)   
  66.     {  
  67.         Zi z = new Zi(0);  
  68.         System.out.println(z.num);  
  69.     }  
  70. }  
  71.   
  72. /* 
  73. class Person 
  74. { 
  75.     private  String name; 
  76.     Person(String name) 
  77.     { 
  78.         this.name = name; 
  79.     } 
  80.  
  81.     void show(){} 
  82. } 
  83. class Student extends Person 
  84. { 
  85.     Student(String name) 
  86.     { 
  87.         super(name); 
  88.     } 
  89.     void method() 
  90.     { 
  91.         super.show(); 
  92.     } 
  93. } 
  94. */  

fianl关键字:

[java]  view plain copy
  1. /* 
  2. final : 最终。作为一个修饰符, 
  3. 1,可以修饰类,函数,变量。 
  4. 2,被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。 
  5. 3,被final修饰的方法不可以被复写。 
  6. 4,被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,有可以修饰局部变量。 
  7.     当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读。 
  8.     而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。 
  9.     单词间通过_连接。 
  10. 5,内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。 
  11.  
  12. */  
  13.   
  14. class Demo  
  15. {  
  16.     final int x = 3;  
  17.     public static final double PI = 3.14;  
  18.     final void show1()  
  19.     {}  
  20.     void show2()  
  21.     {  
  22.         final int y = 4;  
  23.         System.out.println(3.14);  
  24.     }  
  25. }  
  26. class SubDemo extends Demo  
  27. {  
  28.     //void show1(){}  
  29. }  
  30. class FinalDemo   
  31. {  
  32.     public static void main(String[] args)   
  33.     {  
  34.         System.out.println("Hello World!");  
  35.     }  
  36. }  

抽象类:

[java]  view plain copy
  1. /* 
  2. 当多个类中出现相同功能,但是功能主体不同, 
  3. 这是可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。 
  4.  
  5. 抽象:看不懂。 
  6.  
  7. 抽象类的特点: 
  8. 1,抽象方法一定在抽象类中。 
  9. 2,抽象方法和抽象类都必须被abstract关键字修饰。 
  10. 3,抽象类不可以用new创建对象。因为调用抽象方法没意义。 
  11. 4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。 
  12.     如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。 
  13.  
  14.  
  15. 抽象类和一般类没有太大的不同。 
  16. 该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。 
  17. 这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体。 
  18. 通过抽象方法来表示。 
  19.  
  20. 抽象类比一般类多个了抽象函数。就是在类中可以定义抽象方法。 
  21. 抽象类不可以实例化。 
  22.  
  23.  
  24. 特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。 
  25.  
  26.  
  27. 练习: 
  28.  
  29. abstract 关键字,和哪些关键字不能共存。 
  30. final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。 
  31. private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。 
  32.         而抽象方法出现的就是需要被复写。 
  33. static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。 
  34.         可是抽象方法运行没意义。 
  35.  
  36.  
  37.  
  38. 抽象类中是否有构造函数? 
  39. 有,抽象类是一个父类,要给子类提供实例的初始化。 
  40.  
  41. */  
  42.   
  43. abstract class Student  
  44. {  
  45.     abstract final void study();  
  46.     //abstract void study1();  
  47.     void sleep()  
  48.     {  
  49.         System.out.println("躺着");  
  50.     }  
  51. }  
  52. /* 
  53.  
  54. class ChongCiStudent extends Student 
  55. { 
  56.     void study() 
  57.     { 
  58.         System.out.println("chongci study"); 
  59.     } 
  60. } 
  61.  
  62. class BaseStudent extends Student 
  63. { 
  64.     void study() 
  65.     { 
  66.         System.out.println("base study"); 
  67.     } 
  68. } 
  69.  
  70. class AdvStudent extends Student 
  71. { 
  72.     void study() 
  73.     { 
  74.         System.out.println("adv study"); 
  75.     } 
  76. } 
  77. */  
  78. class AbstractDemo   
  79. {  
  80.     public static void main(String[] args)   
  81.     {  
  82.         //new Student();  
  83.         //new BaseStudent().study();  
  84.     }  
  85. }  

模版方法设计模式:

[java]  view plain copy
  1. /* 
  2. 需求:获取一段程序运行的时间。 
  3. 原理:获取程序开始和结束的时间并相减即可。 
  4.  
  5. 获取时间:System.currentTimeMillis(); 
  6.  
  7. 当代码完成优化后,就可以解决这类问题。 
  8.  
  9. 这种方式,模版方法设计模式。 
  10.  
  11. 什么是模版方法呢? 
  12. 在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分, 
  13. 那么这时就将不确定的部分暴露出去。由该类的子类去完成。 
  14.  
  15.  
  16. */  
  17.   
  18. abstract class GetTime  
  19. {  
  20.     public final void getTime()  
  21.     {  
  22.         long start = System.currentTimeMillis();  
  23.   
  24.         runcode();  
  25.   
  26.         long end = System.currentTimeMillis();  
  27.   
  28.         System.out.println("毫秒:"+(end-start));  
  29.     }  
  30.     public abstract void runcode();  
  31.   
  32. }  
  33.   
  34.   
  35. class SubTime extends GetTime  
  36. {  
  37.   
  38.     public void runcode()  
  39.     {  
  40.           
  41.         for(int x=0; x<4000; x++)  
  42.         {  
  43.             System.out.print(x);  
  44.         }  
  45.     }  
  46. }  
  47.   
  48.   
  49. class  TemplateDemo  
  50. {  
  51.     public static void main(String[] args)   
  52.     {  
  53.         //GetTime gt = new GetTime();  
  54.         SubTime gt = new SubTime();  
  55.         gt.getTime();  
  56.     }  
  57. }  

接口:

[java]  view plain copy
  1. /* 
  2. 接口:初期理解,可以认为是一个特殊的抽象类 
  3.     当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。 
  4. class用于定义类 
  5. interface 用于定义接口。 
  6.  
  7. 接口定义时,格式特点: 
  8. 1,接口中常见定义:常量,抽象方法。 
  9. 2,接口中的成员都有固定修饰符。 
  10.     常量:public static final 
  11.     方法:public abstract  
  12. 记住:接口中的成员都是public的。 
  13.  
  14.  
  15. 接口:是不可以创建对象的,因为有抽象方法。 
  16. 需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。 
  17. 否则子类是一个抽象类。 
  18.  
  19. 接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。 
  20.  
  21.  
  22. */  
  23.   
  24.   
  25. interface Inter  
  26. {  
  27.     public static final int NUM = 3;  
  28.     public abstract void show();  
  29. }  
  30.   
  31. interface InterA  
  32. {  
  33.     public abstract void show();  
  34. }  
  35.   
  36. class Demo  
  37. {  
  38.     public void function(){}  
  39. }  
  40.   
  41. class Test extends Demo implements Inter,InterA  
  42. {  
  43.     public void show(){}  
  44. }  
  45.   
  46.   
  47. interface A  
  48. {  
  49.     void methodA();  
  50. }  
  51. interface B //extends A  
  52. {  
  53.     void methodB();  
  54. }  
  55.   
  56. interface C extends B,A  
  57. {  
  58.     void methodC();  
  59. }  
  60.   
  61. class D implements C  
  62. {  
  63.     public void methodA(){}  
  64.     public void methodC(){}  
  65.     public void methodB(){}  
  66. }  
  67.   
  68.   
  69. class InterfaceDemo   
  70. {  
  71.     public static void main(String[] args)   
  72.     {  
  73.         Test t = new Test();  
  74.         System.out.println(t.NUM);  
  75.         System.out.println(Test.NUM);  
  76.         System.out.println(Inter.NUM);  
  77.   
  78.     }  
  79. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值