A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始






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~



~爱上海,爱黑马~



点评

笔记做的太好了,学习了  发表于 2016-5-3 23:58

70 个回复

倒序浏览
支持一下,顶。
回复 使用道具 举报
支持!我能下载下来吗,想收藏
回复 使用道具 举报
谢谢辛苦了
回复 使用道具 举报
wx_d9b6mRbI 发表于 2015-6-5 08:35
支持!我能下载下来吗,想收藏

复制粘贴
回复 使用道具 举报
笔记记录的很详细!顶一下!
回复 使用道具 举报
很实用,赞一个
回复 使用道具 举报
最后一个示例经典,子类带参数的构造函数会默认执行父类中空参数构造函数,如果子类没有调用父类其他构造函数的话。
回复 使用道具 举报
nbnb                                   
回复 使用道具 举报
这笔记给力啊
回复 使用道具 举报
阳哥,给力
回复 使用道具 举报
学习中 加油
回复 使用道具 举报
帖子里代码是可选的,很好,很强大:D
回复 使用道具 举报
一直在努力
回复 使用道具 举报
还在坚持!!
回复 使用道具 举报
一直都在
回复 使用道具 举报
学习了,加油
回复 使用道具 举报
又看了两篇,好资源让学习变得很轻松。
回复 使用道具 举报
支持杨哥。                           
回复 使用道具 举报
好详细   
回复 使用道具 举报
1234下一页
您需要登录后才可以回帖 登录 | 加入黑马