黑马程序员Java__集合(数组)和类

------- android培训java培训、期待与您交流! --------

java中数组的定义

 一维数组

       1)一维数组的声明;

   格式一 :数组的元素类型  数组名[]

                            int  a[];

   格式二 :数组的元素类型[]  数组名  ;开发中常用此格式     

                            int[] a;

   2)数组的创建:

   格式一:数组名=new 数组元素类型[数组的长度]    

                          a=new int[5];

   格式二:数组元素类型 数组名[]=new 数组元素类型[数组长度]

       int a[]=new int[5] ;

       3)数组的初始化:

   格式:数组元素类型 数组名[]={元素1,元素2,……}

            inta[]={1,3,4,7,8}

 数组的应用

  1)遍历数组元素常用二种方法:

   1.public static void printArray(int[] a)

             {          //把x当作数组的一个元素号

     for(int x=0;x<a.length-1;x++){

                   //   if(x!=a.length-1)                    

                        system.out.print(a[x]+'');

                             else

                           system.out.print(a[x]) ;                      

                            }

                  }

             2. public static void printArray(int a[])

               {        / /把x当作数组中的元素值,(:)可以读作in,也就是for e ach in a

                  for(int x:a) {

                         if(x!=a[a.length-1])

                            system.out.print(x+",");

                             else

                               system.out.print(x);      

                        }       

               }

     总结:可以通过a.length属性获取数组的长度,记住数组只有length属性,字符串有length()方法

 2 获取数组中的最大值与最小值

          /*思路:

   1、定义一个变量来接收数组中两元素中最大值

   2、遍历数组中的每个元素与这个变量比较,再返回最大值给该变量

           3、既然是遍历,同上有两种方法

   返回值类型:int

          所需参数:int  a[]

              */

  1public static void int(int a[])

        {

           int temp=0;

    for(int x:a)

               {

                     if(x>temp)

                       temp=x;

                          }

                      return temp;

                  }

        2   public static void int(int a[])

             {

                    int temp=0;

                   for(int x=0;x>a.length;x++)

                      {

                            if(a[x]>temp)

                               temp=a[x];             

                                  }

                                  return temp;

                            }

    最小值把符号改了就行了,这里就不用多写了

 3 数组元素排序

  1)选择排序法

     * 功能:对数组进行排序

  * 思路:

  * 1.将数组中的第一个元素与第二个元素相比,然后再与第三个比较;以此类推;循环第一个元素

  * 再循环第二个,所以会产生一个倒三角形,此时用到for循环

  * 2,定义判断条件,定义一个变量来临时储存最大值,

  * 3.通过变量来交换数组中元素的顺序

  * 步骤:

  * 返回值:没有

  * 未知参数:数组*/

 public static void sort(int[] a){

  for(int x=0;x<a.length-1;x++){//a.length-1:最后 一个不用比较

   for(int y=x+1;y<a.length;y++){//x+1:只比较相邻的元素

    if(a[x]>a[y]){

     swap(a, x, y);

    }

   }

  }

  

  }

 

    2)冒泡排序法    

 * 功能:冒泡排序

     * 思路:

     * 1.将数组中第一元素与第二元素的值比较,得到的最大值又与第三个元素的比较;以此类推

     * 每完成一轮都会减少一个最大值,由些得知用for循环数组元素

     * 2.定义判断条件,定义一下变量来存储最大值

     * 3.通过变量来交换数组中元素的顺序

     * 返回值:没有

     * 未知参数:数组*/

 public static void selectSort(int[] a){

  for(int x=0;x<a.length-1;x++){

   for(int y=0;y<a.length-x-1;y++){//-x:让每次的比较的元素减少,-1:避免元素下标越界

    if(a[y]>a[y+1]){

    swap(a, y, y+1);

    }

   }

  }

  

 }

 /*功能:数组元素置换

  * 思路:

  * 1,定义一个变量

  * 2.将数组中的任意元素赋给该变量*/

 public static void swap(int[] a,int x,int y){

  int temp=a[x];

  a[x]=a[y];

  a[y]=temp;

 }

4 java类的定义

 1 )类的定义

     格式如下:

           〈类声明〉

           {

             〈类主体〉

                   }

  2 )类的声明

     格式如下:

         [〈修饰符〉] class〈类名〉[extends〈父类〉] [implenments〈接口名〉]

  3 ) 类的定义修饰符

    类的说明性修饰符说明了类的性质和权限,包括public、默认修饰符、abstract、final

  4 )类主体

      格式如下:

           〈类声明〉

            {

              〈成员变量的声明〉

               〈成员方法的声明及实现〉

                }

  5 )成员变量

       格式如下:

           [变量修饰符]〈变量类型〉〈变量名〉

       1)变量的修饰访问权限

        public:说明该变量是公有变量,允许任何程序包中的类的方法访问,其作用域最广。

        protected:说明该变量为保护变量,允许类自身,子类及同一包中的所有类的变量访问。

        private:说明该变量是私有变量,只能被定义在它类中的方法访问。

        默认修饰符:也称隐含修饰符,允许类自身及同一个包中的所有类的变量访问。

      2)用static修饰的变量是一个静态变量,称为类变量或者全局变量,无static说明的变量为实例变量(成员变量)

          静态变量与实例变量的区别:

        1)访问方法

            实例变量必须通过类的对象访问:

                        <类名>    〈对象名〉=new  <类名>();

                         〈对象名〉.〈变量名〉

            静态变量可以通过类名访问:

                             〈类名〉.〈变量名〉

        2)存放位置:

                实例变量:随着对象的建立而存在于堆内存中。

                静态变量:随着类的加载而存在于方法区当中

        3)生命同期:

               实例变量:随着对象的消失而消失。

               静态变量:随着类的消失而消失,比实例变量长。

          局部变量与成员变量之间的区别:

        1)作用范围:

          局部变量:定义在方法内部的变量,或者语句中。

          成员变量:定义在整个类中。

        2)内存中的位置

           局部变量:存在于栈内存中。

          成员变量:在椎内存中,因为对象的存在而存在

        3 )作用范围:

          局部变量:使用之前必须被初始化。

          成员变量:默认的初始化值为null。

         常见面试题:

             final 是否可以配合static 使用?

            可以的,static final int age=10;

   6)成员方法

        格式如下:

                        [方法修饰符]〈方法返回值类型〉〈方法名〉([〈参数列表〉])

                                        {

                                                 方法体

                                                    }

    成员方法修饰方法有public,private,protected,final,static,abstract,synchronized

   final:此方法为最终方法,不能被其所在类的子类所重载.

   static:说明为静态方法,此方法不能被它的子类所重载.

  abstract:说明为抽象方法,只有方法说明,没有方法体;在其子类中被具体实现

  synchronized:此方法为同步方法,用于多线程程序设计,保证在同一时刻只有一个线程访问该方法,以实现线程之间的同步

7)返回值

无返回值:用void表示。

有返回值:用return+参数(必须与定义方法的参数类型一致)

8)构造方法

    0)作用:用于给对应对象进行初始化。

    1)语法:

        public      类名    ([参数列表]){     [语句序列;]      }

   2) 特点:

       1.方法名与类名相同

       2. 不用定义返回值类型,只能由public ,private,protected.中的任一个修饰,如果用 private 修饰构造函数,该类将不能建立对象。

       3.不可以从父类继承,可以重载;一个类中可以有N多个构造方法

       4.不能直接通过方法名引用,必须通过new运算符。

       5.调用当前类或者是父类的另一个构造方法,使用当前的构造方法用this来引用,使用其父类的构造方法用super来引用,

          且是方法体的第一条语句。

      3)什么时候使用定义构造函数?

         当分析事物时,该事物存在具备一些特性或者行为;那么将这些内容定义在构造函数中。

      4)构造代码块:{.................}

      5)构造函数与构造代码块的别:

         构造函数:给对应的对象进行初始化。

        构造代码块:给所有对象统一进行初始化,对象一建立就运行;而且忧先于构造函数执行。

  5 类的使用

    1)对象创建:

         语法格式: type  对象名=new type([参数列表])

    2)对象使用:

        1)引用对象中的变量:

                                <对象名>.<变量名>

       2)引用对象中的方法:

                                〈对象名〉. [方法名](〈参数列表〉)

             

      3)继承:

                 java只支持单继承

           语法格式:

           class A  [extends 父类 B][ implements〈接口名〉]{

                                      〈成员变量的声明〉

                                            〈成员方法的声明及实现〉

                                   }

   4)super 与 this

            super:代表父类对象的引用。

        1) super有三种情况下可以使用:

              1.用来访问父类中被覆盖的方法。

              2.用来访问父类中的构造方法。

              3.用来访问父类中被隐藏的成员变量。

             this:体表子类对象的引用。

       2)this:代表它所在函数所属对象的引用.。

                  1)  可以用于区分局部变量和成员变量重名的情况。            

             例如:class Person{

                     private String name;

                     private String sex;

                     Person(String name){

                         this.name=name;           

                                   } 

                      Person(String name,String sex){

                         this(name);    //person(name) 必须定义在第一行,因为初始化要先执行。

                         this.sex=sex;

                                  }

                          }

   5)抽象类

               语法格式:

                 abstract class  类名{

                   声明数据成员;

                 返回值的数据类型       方法名称(参数列表){   ........     }            //普通方法的定义

                 abstract  返回值的数据类型    方法名称(参数列表);      //定义抽象方法                                                 }    

    6)  抽象类的特点:

       1.抽象方法一定在抽象类中。

       2.抽象方法、抽象类必须用abstract来修饰。

       3.抽象方法不可以用new产生对象,因为抽象方法没有方法体;是可以有构造函数的,一般私有化!

       4.抽象类中的方法要被使用,必须由子类覆盖父类所有的抽象方法后,建立子类对象调用。

          如果子类只覆盖了父类部分的抽象方法,那么子类也是抽象类。

       5.何时使用抽象类?

          当多个类中出现相同功能,但是功能主体不同,这是可以向上进行抽取,这是可以只抽取功能定义,而不抽取功能主体

          例如:普通班学习与高级班学员有共有的学习方法,但是学习的内容不一样。

   6)非访问控制符  static

             作用:用于修饰成员(成员变量,成员方法)。

              1)语法格式:

                   static   类型     变量名;

                   static  返回值类型    方法名([参数列表]){    ..........     } 

              2)调用方式:〈对象名〉.〈静态成员〉 或者    〈类名〉.〈静态成员〉

               特点:

                     1.随着类的加载而加载。

                     2.优先于对象存在。

                     3.被所有对象所共享。

                     4.可以直接被类名所调用。

               3)静态使用注意事项:

                     1.静态方法只能访问静态成员,非静态方既可以访问静态成员也可以访问非静态成员。

                     2.静态方法中不可以定义this,super 关键字,因为静态优先于对象存在。      

                4)静态的利与弊:

                    利处:对对象的共享数据进行单独空间存储,节省空间,没有必要为每个对象存一份,可以直接被类名所调用。

                   弊处:生命期过长,访问出现局限性(静态只能访问静态)。 

                5)使用方法:

                    1)什么时候使用静态变量(类变量)呢?

                        当对象中出现共享数据时,该数据就被定义成静态,对象中的特有数据被定义成非静态在于于堆内存中。  

                    2)什么时候使用静态函数?

                       当该方法功能内部没有访问到非静态数据(对象的特有数据),那么该方法就可以定义成静态的。

                       例如:

                                     class Person{

                                               private String name;

                                                static void show(){

                                                   system.out.println("hahaah......");                                                                                                                    }                     

                                                                     }

                       3)静态代码块:

                                1. 语法格式:

                                           static {

                                                           ............

                                                                             }    

 特点:随着类的加载而执行,只执行一次,并优先于主函数(main);用于给类进行初始化。                      

  7)final :最终。作为一个修饰符

             语法格式:  final 返回值类型 方法名([参数列表]){...........} 

            作用:

                 1.可以修饰类,方法,变量

                 2.被修饰的类,不能被继承;为了避免子类继承,覆盖(复写)该功能。

                 3.被修饰的方法,不能被覆盖(复写),

                 4.被修饰的变量是一个常量,只能赋值一次。

  7  接口

 1)接口的声明,是一种特殊的抽象类

      语法格式:

             [接口修饰符] interface〈接口名〉[extends〈父类接口列表〉]{

               .....  //接口体         

                 }

 2)接口修饰符

   接口修饰符有public和默认两种状态。

   1.public:任意类均可以使用这个接口。

   2.默认状态:同一包的类才能使用该接口,其他包的类无法访问。   

 3)接口格式的特点:

  1.接口中常见的定义:常量,抽象方法。

  2.接口的成员都有固定的修饰符。

     常量:public static final 

     抽象方法:public abstract

  3.接口与接口可以实现多继承

  4.接口不能创建对象,因为有抽象方法。

 4)接口的实现

  1.语法格式:

     [修饰符] class 类名 implements 接口列表(){

              ..........//实现接口中所有的抽象方法

                    }

 

8  多态

   1)含义:可以理解为事物存在的多种体现形态。

         面向对象的多态性主要指两方面;

      

        1.方法重载(override):在同一个类中定义多个同名不同参数的方法

               特点:参数个数或者参数类型,顺序必须不同,与返回值没有关系。

        2.方法覆盖(overload):子类应与父类具有完全相同的方法名,返回值,参数列表

        

   2)多态的体现 :  动物  x=new 猫();

         父类的引用指向了自己的子类对象。

        父类的引用也可以接收自己的子类对象。

   3)多态的前提:   

        必须是与类有关系,要么继承,要么实现。

        通常还有一个前提:覆盖。

   4)多态的好处

         多态的出现大大的提高了程序的拓展性。

   5)多态的弊端

        提高了拓展性,但是只能使用父类的引用访问父类中的成员。

   6) 多态的应用

   7)多态中成员方法的特点:

       1.编译时期:参阅引用变量所属的类是否有调用的方法,如果有,编译通过,如果没有,编译失败。

        2.运行时期:参阅对象所属的类中是否有调用的方法。

        简单总结:成员方法在多态调用时,编译看左边,运行看右边。

   8)在多态中,成员变量的特点:无论编译或运行,都参考左边

    9  封装(encapsulation)

       1 封装的基本原则:将你的成员变量标记为private,并入入提供public的getter与setter来控制存取动作。

   

   10 内部类

        含义:将一个类定义在另一个类里面,里面的类称为内部类(内置类,嵌套类)。

   1)访问的特点:

      内部类可以直接访问外部类的成员,包括私有成员。

      之所以能够访问外部类成员,因为内部类持有一个外部类的引用:外部类.this

      外部类要访问内部类的成员,必有建立内部类的对象。

   2)访问格式:

       外部类名.内部类名   对象名=new 外部类对象.new 内部类()对象;

   3)当内部类定义在局部时

      1.不可以被成员修饰符修饰,除了final修饰。

      2.可以直接访问外部类的成员,因为还有外部类中的引用。

      3.但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量或者在内部类中用“类名.this.局部变量名”

   4)匿名内部类

      1.匿名内部类其实就是内部类的简写形式。

      2.定义匿名内部类的前提:内部类必有是继承或者是实现一个接口。

      3.匿名内部类的格式;new 父类或者是接口(){定义子类的内容(局部变量,局部方法)}.子类的方法

      4.其实匿名内部类就是一个匿名子类对象。

  **  思维拓展:单例设计模式:解决一个类在内存只存在一个对象。

    如何保证对象的唯一

    思路:

    1. 为了避免其他程序过多的建立该类的对象,先禁止其他程序建立该类的对象(将构造函数私有化)。

    2.为了其他程序访问到该类的对象,在本类中自定义一个类的对象(在类中建立一个本类对象)。

    3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式(提供一个方法可以获取到该对象)。

    第一方法:先初始化对象--饿汉式(定义单例,优先使用)

         class Singleton{

               private Singleton(){};

               private  static Singleton  single=new Singleton();

               private static Singleton getSingleton(){

                                 return single;

                                   }

                       }

      第二方法:对象被调用后才初始化--懒汉式

            class Singleton{

                 private Singleton(){}

                 private static  Singleton single=null;

                 prviate static synchronized Singleton getSingleton(){

                  if(single==null){

                            if(single==null)

                                       single=new Singleton();

                                                             }

                                       }

                               return single;

                              }


--------- android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值