黑马程序员技术交流社区

标题: 【阳哥笔记】极速秒杀Java基础之笔记系列—Day08(继承)! [打印本页]

作者: 阳哥忠粉    时间: 2015-6-4 20:58
标题: 【阳哥笔记】极速秒杀Java基础之笔记系列—Day08(继承)!




笔记总链接:http://bbs.itheima.com/thread-200600-1-1.html

3、面向对象

3.7 数组工具类

     示例:
  1. public class ArrayTool{
  2.        //该类中的方法都是静态的,所以该类是不需要创造对象的
  3.        //为了保证不让他人创建该类对象,可以将构造函数私有化
  4.        private ArrayTool(){}

  5.        //获取整型数组的最大值
  6.        public static int getMax(int[] arr){
  7.              int maxIndex = 0;
  8.              for(int x = 1; x < arr.length; x++){
  9.                    if(arr[x] > arr[maxIndex])
  10.                         maxIndex = x;
  11.              }
  12.              return arr[maxIndex];
  13.       }

  14.        //对数组进行选择排序
  15.        public static void selectSort(int[] arr){
  16.              for(int x = 0; x <arr.length -1; x++){
  17.                    for(int y = x + 1; y < arr.length; y++){
  18.                          if(arr[x] > arr[y])
  19.                                swap(arr,x,y);
  20.                    }
  21.              }
  22.        }

  23.        //用于给数组进行元素的位置置换。
  24.        private static void swap(int[] arr, int a,int b){
  25.              int temp = arr[a];
  26.             arr[a] = arr[b];
  27.             arr[b] = temp;
  28.        }

  29.        //获取指定的元素在指定数组中的索引
  30.        public static int getIndex(int[] arr, int key){
  31.              for(int x = 0; x < arr.length; x++){
  32.                    if(arr[x] == key)
  33.                          return x;
  34.             }
  35.              return -1;
  36.       }

  37.        //将int 数组转换成字符串,格式是:[e1,e2,...]
  38.        public static String arrayToString(int[] arr){
  39.             String str = "[";

  40.              for(int x = 0; x < arr.length; x++){
  41.                    if(x != arr.length - 1)
  42.                         str = str + arr[x] + ",";
  43.                    else
  44.                         str = str + arr[x] + "]";
  45.             }
  46.              return str;
  47.       }
  48. }

  49. class ArrayToolDemo{
  50.       //保证程序的独立运行
  51.        public static void main(String[] args){
  52.             int[] arr = {4,8,2,9,7,72,6};

  53.             int max = ArrayTool.getMax(arr);
  54.             System.out.println("max = " + max);
  55.             int index = ArrayTool.getIndex(arr,10);
  56.             System.out.println("index = " + index);
  57.       }
  58. }
复制代码
   运行结果:


3.10 文档注释

    示例:
  1. /**
  2. * 建立一个用于操作数组的工具类,其中包含着常见的对数组操作的函数,如:最值,排序等。
  3. * @author 张三
  4. * @version v1.0
  5. */
  6. public class ArrayTool{
  7.        private ArrayTool(){}

  8.        /**
  9.        * 获取整型数组的最大值
  10.        * @param arr 接收一个元素为int 类型的数组
  11.        * @Return 该数组的最大的元素值
  12.        */
  13.        public static int getMax(int[] arr){
  14.              int maxIndex = 0;
  15.              for(int x = 1; x < arr.length; x++){
  16.                    if(arr[x] > arr[maxIndex])
  17.                         maxIndex = x;
  18.             }
  19.              return arr[maxIndex];
  20.       }

  21.       /**
  22.        * 对数组进行选择排序
  23.        * @param arr 接收一个元素为int 的数组
  24.        */
  25.        public static void selectSort(int[] arr){
  26.              for(int x = 0; x <arr.length -1; x++){
  27.                    for(int y = x + 1; y < arr.length; y++){
  28.                          if(arr[x] > arr[y])
  29.                                swap(arr,x,y);
  30.                   }
  31.             }
  32.       }

  33.        //用于给数组进行元素的位置置换。
  34.        private static void swap(int[] arr, int a,int b){
  35.             int temp = arr[a];
  36.             arr[a] = arr[b];
  37.             arr[b] = temp;
  38.       }

  39.        /**
  40.        * 获取指定的元素在指定数组中的索引
  41.        * @param arr 接收一个元素为int 类型的数组
  42.        * @param key 要找的元素
  43.        * @return 返回该元素第一次出现的位置,如果不存在则返回 -1
  44.        */
  45.        public static int getIndex(int[] arr, int key){
  46.              for(int x = 0; x < arr.length; x++){
  47.                    if(arr[x] == key)
  48.                          return x;
  49.              }
  50.              return -1;
  51.        }

  52.        /**
  53.        * 将int数组转换成字符串,格式是:[e1,e2,...]
  54.        * @param arr 接收一个元素为int类型的数组
  55.        * @return 返回该数组的字符串表现形式           
  56.        */
  57.        public static String arrayToString(int[] arr){
  58.             String str = "[";

  59.              for(int x = 0; x < arr.length; x++){
  60.                    if(x != arr.length - 1)
  61.                         str = str + arr[x] + ",";
  62.                    else
  63.                         str = str + arr[x] + "]";
  64.             }
  65.              return str;
  66.       }
  67. }
复制代码
   运行结果:






    P.S.
    1、如果想把一个类进行文档化,该类必须是public的。
    2、私有的方法在文档中不会体现,例如ArrayTool类中的swap方法。

3.11 单例设计模式

    设计模式:对问题行之有效的解决方式,其实,它是一种思想。

    单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
    比如多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

    如何保证对象唯一性呢?
    1、不允许其他程序用new创建该类对象。
    2、在该类创建一个本类实例。
    3、对外提供一个方法让其他程序可以获取该对象。

    步骤:
    1、私有化该类构造函数。
    2、通过new在本类中创建一个本类对象。
    3、定义一个公有的方法,将创建的对象返回。


    示例(饿汉式):
  1. class Single{
  2.        //类已加载,对象就已经存在了
  3.        private static Single s = new Single();

  4.        private Single(){}

  5.        public static Single getInstance(){
  6.              return s ;
  7.       }
  8. }

  9. class SingleDemo{
  10.        public static void main(String[] args){
  11.             Single s1 = Single.getInstance();
  12.             Single s2 = Single. getInstance();
  13.             System.out.println(s1 == s2);
  14.       }
  15. }
复制代码
    运行结果:


    P.S.
    之所以不用Single.s;的方式获取Single对象,而采用getInstance获取是因为在getInstance方法中我们可以做一些判断来决定是否返回Single的对象,也就是实现了对单例对象的可控。所以,给Single的构造方法加上了private限制,禁止使用者直接采用Single.s;的方式获取。

    示例(懒汉式):
  1. class Single{
  2.        //类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象
  3.        //延迟加载形式
  4.        private static Single s = null;

  5.        private Single(){}

  6.        public static Single getInstance(){
  7.              if(s == null)
  8.                    s = new Single();
  9.              return s ;
  10.       }
  11. }

  12. class SingleDemo{
  13.        public static void main(String[] args){
  14.             Single s1 = Single. getInstance();
  15.             Single s2 = Single. getInstance();
  16.             System.out.println(s1 == s2);
  17.       }
  18. }
复制代码
    运行结果:


4、继承

4.1 继承的描述

    通过 extends 关键字让类与类之间产生继承关系。
    多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。多个类可以称为子类,单独这个类称为父类或者超类。

    P.S.
    1、子类可以直接访问父类中的非私有的属性和行为。
    2、子类无法继承父类中私有的内容。
    3、父类怎么来的?共性不断向上抽取而来的。


    示例:
  1. class Person{
  2.       String name;
  3.       int age ;
  4. }

  5. class Student extends Person{
  6.        void study(){
  7.             System.out.println("student study..." + age);
  8.       }
  9. }

  10. class Worker extends Person{
  11.        void work(){
  12.             System.out.println("worker work..." + age);
  13.       }
  14. }

  15. class ExtendDemo{
  16.        public static void main(String[] args){
  17.             Student s = new Student();
  18.             s. name = "zhangsan" ;
  19.             s. age = 20;
  20.             s.study();

  21.             Worker w = new Worker();
  22.             w. name = "lisi" ;
  23.             w. age = 30;
  24.             w.work();
  25.       }
  26. }
复制代码
    运行结果:


    好处:
    继承的出现提高了代码的复用性。
    继承的出现让类与类之间产生了关系,提供了多态的前提。


4.2 继承的特点

    Java只支持单继承,不支持多继承。
    一个类只能有一个父类,不可以有多个父类。

    原因:
    因为多继承容易出现问题。两个父类中有相同的方法,子类到底要执行哪一个是不确定的。

    示例:

  1. class A{
  2.        void show(){
  3.             System.out.println("a" );
  4.       }
  5. }

  6. class B{
  7.        void show(){
  8.             System.out.println("b" );
  9.       }
  10. }

  11. class C extends B,A{

  12. }
复制代码

    那么创建类C的对象,调用show方法就不知道调用类A中的show方法还是类B中的show方法。所以java不支持多继承,但将这种机制换了另一个安全的方式来体现,也就是多实现(后面会详细说明)。

    Java支持多层继承(继承体系):
    C继承B,B继承A,就会出现继承体系。
    多层继承出现的继承体系中,通常看父类中的功能,了解该体系的基本功能,建立子类对象,即可使用该体系功能。

    定义继承需要注意:
    不要仅为了获取其他类中某个功能而去继承,类与类之间要有所属( "is a")关系。


4.3 super关键字&函数覆盖

    在子父类中,成员的特点体现:

    1. 成员变量

        this和super的用法很相似。
        this代表本类对象的引用。
        super代表父类的内存空间的标识。

        当本类的成员和局部变量同名用this区分。
        当子父类中的成员变量同名用super区分父类。


    示例:
  1. class Fu{
  2.        private int num = 4;

  3.        public int getNum(){
  4.              return num ;
  5.       }
  6. }

  7. class Zi extends Fu{
  8.        private int num = 5;
  9.    
  10.        void show(){
  11.             System.out.println(this.num + "..." + super.getNum());
  12.       }
  13. }

  14. class ExtendDemo{
  15.        public static void main(String[] args){
  16.             Zi z = new Zi();
  17.             z.show();
  18.       }
  19. }
复制代码
   运行结果:


    2. 成员函数
        当子父类中出现成员函数一模一样的情况,会运行子类的函数。
        这种现象,称为覆盖操作,这是函数在子父类中的特性。

        在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。

    函数两个特性:
    1. 重载,同一个类中。
    2. 覆盖,子类中,覆盖也称为重写,覆写,override。

    示例:
  1. class Fu{
  2.        public void show(){
  3.             System.out.println("fu show run" );
  4.       }
  5. }

  6. class Zi extends Fu{
  7.        public void show(){
  8.             System.out.println("zi show run" );
  9.       }
  10. }

  11. class ExtendDemo{
  12.        public static void main(String[] args){
  13.             Zi z = new Zi();
  14.             z.show();
  15.       }
  16. }
复制代码
    运行结果:


    什么时候使用覆盖操作?
    当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。

    示例:
  1. class Phone{
  2.        void call(){}
  3.        void show(){
  4.             System.out.println("number" );
  5.       }
  6. }

  7. class NewPhone extends Phone{
  8.        void show(){
  9.             System.out.println("name" );
  10.             System.out.println("pic" );
  11.             super.show();
  12.       }
  13. }

  14. class ExtendDemo{
  15.        public static void main(String[] args){
  16.             NewPhone p = new NewPhone();
  17.             p.show();
  18.       }
  19. }
复制代码
    运行结果:


    P.S.
    1、父类中的私有方法不可以被覆盖。
    2、父类为static的方法无法覆盖。
    3、覆盖时,子类方法权限一定要大于等于父类方法权限。

    示例:
  1. class Fu{
  2.        public void show(){
  3.             System.out.println("fu show run" );
  4.       }
  5. }

  6. class Zi extends Fu{
  7.        private void show(){
  8.             System.out.println("zi show run" );
  9.       }
  10. }

  11. class ExtendDemo{
  12.        public static void main(String[] args){
  13.             Zi z = new Zi();
  14.             z.show();
  15.       }
  16. }
复制代码
    运行结果:


    3. 构造函数

        子父类中构造函数的特点:
        在子类构造函数执行时,发现父类构造函数也运行了。
        原因:在子类的构造函数中,第一行有一个默认的隐式语句:super();。

        注意:如果使用super(4);语句调用父类的其他构造函数,那么默认的父类构造函数将不会再被调用。

    示例:
  1. class Fu{
  2.       int num ;
  3.       Fu(){
  4.             num = 10;
  5.             System.out.println("A fu run" );
  6.       }
  7.       Fu(int x){
  8.             System.out.println("B fu run..." + x);
  9.       }
  10. }

  11. class Zi extends Fu{
  12.       Zi(){
  13.             //super();//默认调用的就是父类中的空参数的构造函数
  14.             System.out.println("C zi run " + num);
  15.       }
  16.       Zi(int x){
  17.             super(4);
  18.             System.out.println("D zi run " + x);
  19.       }
  20. }

  21. class ExtendDemo{
  22.        public static void main(String[] args){
  23.             new Zi();
  24.             System.out.println("-------------------" );
  25.             new Zi(6);
  26.       }
  27. }
复制代码
    运行结果:


~END~



~爱上海,爱黑马~




作者: 小车车    时间: 2015-6-4 21:34
支持一下,顶。
作者: wx_d9b6mRbI    时间: 2015-6-5 08:35
支持!我能下载下来吗,想收藏
作者: tougboy    时间: 2015-6-5 11:12
谢谢辛苦了
作者: 乌卡卡    时间: 2015-6-5 16:03
wx_d9b6mRbI 发表于 2015-6-5 08:35
支持!我能下载下来吗,想收藏

复制粘贴
作者: 熊乾坤    时间: 2015-6-5 19:04
笔记记录的很详细!顶一下!
作者: wx_d9b6mRbI    时间: 2015-6-6 11:38
很实用,赞一个
作者: javazhang    时间: 2015-6-6 17:39
最后一个示例经典,子类带参数的构造函数会默认执行父类中空参数构造函数,如果子类没有调用父类其他构造函数的话。
作者: canyellwang    时间: 2015-6-6 17:43
nbnb                                   
作者: 麦兜是个猪    时间: 2015-6-6 18:12
这笔记给力啊
作者: 307323665    时间: 2015-6-6 22:11
阳哥,给力
作者: wx_iAuO26mH    时间: 2015-6-7 09:47
学习中 加油
作者: 有艺术的刺客    时间: 2015-6-7 16:34
帖子里代码是可选的,很好,很强大:D
作者: li520    时间: 2015-6-7 17:03
一直在努力
作者: 那一世的苍白    时间: 2015-6-9 17:38
还在坚持!!
作者: wx_iAuO26mH    时间: 2015-6-10 11:05
一直都在
作者: 那一世的苍白    时间: 2015-6-10 20:59
学习了,加油
作者: 15383016390    时间: 2015-6-11 06:25
又看了两篇,好资源让学习变得很轻松。
作者: canyellwang    时间: 2015-6-14 16:35
支持杨哥。                           
作者: libin159028    时间: 2015-6-15 10:56
好详细   
作者: Jackie7    时间: 2015-6-16 21:59
今天将的就是继承,拿走,练习!
作者: 铃铃铃铃铃锋    时间: 2015-6-19 19:02
谢谢分享

作者: 繁星中的白矮星    时间: 2015-6-20 20:56
支持支持
作者: 魏海洲    时间: 2015-6-21 22:47

支持一下,顶。
作者: 小龙编程世界    时间: 2015-6-22 08:10
阳哥总结java很不错。。。
作者: 青皮核桃    时间: 2015-6-22 22:20
又解决疑问了,顶
作者: heisedelangzi    时间: 2015-6-30 22:31
真的有用。
作者: twa42    时间: 2015-7-1 11:17
支持支持支持,赞一下
作者: 汪磊の    时间: 2015-7-1 11:35
总结的太全面太好了
作者: nixing    时间: 2015-7-4 22:26
很好很强大,非常感谢
作者: nixing    时间: 2015-7-5 21:36
很有用,不错感谢
作者: RichardM    时间: 2015-7-7 00:21
越努力,越幸运!!!
作者: Sboy    时间: 2015-7-16 12:13
面向对象三大特征之一,整理很不错,必须赞
作者: 王勋亮    时间: 2015-7-25 09:04
继承的重点总结的很好!
作者: 醉翁之意不在酒    时间: 2015-7-25 09:40
笔记很详细,但是觉得不想看下去
作者: 王勋亮    时间: 2015-7-25 11:48
顶!!!!!!
作者: DreamStart    时间: 2015-7-28 09:33
好流鼻啊,最后一个案例看懂了但是还有点模糊呢~~求大神详解
作者: 19856167    时间: 2015-8-11 14:39
大爱阳哥!需要的就是这个,做得太好了!
作者: 王竹根    时间: 2015-8-16 01:59
支持,讲的不错。。好好学习下。。。。。。。。。。。。。
作者: 路宪帅    时间: 2015-8-16 09:52
赞一个!!
作者: 樱花飘过    时间: 2015-8-16 10:10
很棒,很有用,赞一个
作者: 风华正茂    时间: 2015-8-16 12:32
阳哥笔记,大力支持
作者: 放心飞    时间: 2015-8-26 17:13
又学习完一节,加油!
作者: alogol    时间: 2015-8-26 21:09
复习复习
作者: 王小吉    时间: 2015-8-31 00:09
已经收藏谢谢
作者: chunjiang    时间: 2015-8-31 00:20
支持,很给力
作者: spruce    时间: 2015-9-1 09:05
学习了 留下以备练习
作者: 董兴朋    时间: 2015-9-1 16:48
看视频时候提到了,挺好的!
作者: 放心飞    时间: 2015-9-6 14:27
呵呵,又看完一节了,继续加油。
作者: yangxuqiang    时间: 2015-9-27 11:13
很详细呀
作者: 许玉飞嵩    时间: 2015-10-23 23:11
默默的赞一下
作者: 307117758    时间: 2015-10-23 23:38
阳哥屌啊!
作者: 1975532882    时间: 2015-10-24 09:13
牛叉,,,,,,,,,
作者: 石三伢子1    时间: 2015-11-3 17:40
笔记,简洁干练,几乎涵盖了全部易错点和重点,流程过度舒缓,逻辑顺畅;顶!
作者: czcjyqm    时间: 2015-11-3 21:31
看了之后收获好多
作者: 毕静存    时间: 2015-11-3 21:37
顶起!!!!!!!!!!!!!!!
作者: yqlbd    时间: 2015-11-4 14:39
再次复习笔记,加深映像。
作者: wx_URVMBbXs    时间: 2015-11-4 21:57
收益了   谢谢分享
作者: 梁名扬    时间: 2015-11-4 22:22

这笔记给力啊
作者: liying    时间: 2015-11-4 22:54
阳哥威武

作者: 1277886228    时间: 2015-11-6 01:10
支持!
作者: 马永飞    时间: 2015-11-6 23:40
黑马越办越好
作者: liuyang10908126    时间: 2015-11-7 16:05
总结的很到位!
作者: 胡薇健    时间: 2015-11-7 17:50
好笔记,楼主威武
作者: 再续啸傲    时间: 2015-12-5 21:38
get and look look
作者: tanker    时间: 2015-12-5 21:58
加油加油,顶
作者: szb    时间: 2015-12-6 13:27
学习中 加油
作者: lixy    时间: 2015-12-29 11:42
这些笔记应该都是按上课的节奏总结的吧
作者: 青春young    时间: 2016-7-25 20:06
笔记很给力,一直看强哥的笔记在学习
作者: houzhiming    时间: 2016-7-25 23:29
谢谢楼主分享。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2