首页 > 代码库 > java基础3

java基础3

1.二维数组
  定义:元素为一维数组的数组。
  动态初始化方式一(指定有多少个长度相同的一维数组):
       数据类型[][] 变量名 = new 数据类型[m][n];
       m表示有多少个一维数组
       n表示一维数组中有多少个元素
   动态初始化方式二(指定二维数组中有多少个一维数组,每一个一维数组的长度不固定):
       数据类型[][] 变量名 = new 数据类型[m][];
       注:m这个数据必须给出,后面的数据可以不给
  二维数组的静态初始化
         数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
  简化格式:
     数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};

public class arrayarraydemo {
//  二维数组的遍历
    public static void main(String[] args) {
//      定义一个静态数组
        int [][]arr1={{1,2},{1,2,3},{21,4,5},{23,45,5}};
//      定义一个含有三个一维数组的二维数组,一维数组有4个元素
        int [][]arr=new int[3][4];
//      定义一个含有三个一维数组的数组
        int [][]arr2=new int[3][];
        showarray(arr1);
    }    public static void showarray(int arr1[][]){        
    for (int i = 0; i < arr1.length; i++) {            
               for (int j = 0; j < arr1[i].length; j++) {
            System.out.print(arr1[i][j]+" ");
            }
        }
    }

}

2.形式参数问题
  如果形式参数是基本类型:
       形式参数的改变,不影响实际参数。
  如果形式参数是引用类型:
               形式参数的改变,直接影响实际参序。

3 .冒泡排序
   基本规则:相邻两个比较,大的放后面第一次排序完毕最大的元素在索引最大处,依此类推。
   代码实现

public class bubblesort {    public static void main(String[] args) {    
        int []a={1,223,34,532,64,8,56};
        bubbleSort(a);
        printArray(a);
    }    public static void bubbleSort(int[] a){    
    //冒泡排序方法,外层循环控制大的轮回,内层循环进行相邻两个元素比较把大的在
    //后面第一次轮回结束最大的元素在最后一位。
        for (int i = 0; i < a.length-1; i++) {           
         for (int j = 0; j < a.length-1-i; j++) {                
         if(a[j]>a[j+1]){                    
                  int temp=a[j];
                 a[j]=a[j+1];
                 [j+1]=temp;
                }               
            }
        }
    }    //构造一个遍历数组的方法
    public static void printArray(int[] a){
        System.out.print("[");        
        for (int i = 0; i < a.length; i++) {            
           if(i==a.length-1){
           System.out.print(a[i]);
            }  else{
              System.out.print(a[i]+",");
                 }
        }
        System.out.println("]");
    }
}

3.选择排序
  基本规则:从0索引处开始依次与后面的比较,第一次结束后最小的位于0索引处,依次进行
  代码实现

public class selectSort {    
       public static void main(String[] args) {        
             int []arr={1,24,5,34,6,367,434,378};
        printArray(arr);
    }    
    //选择排序
    public static void selectSort(int []arr){        
    //使用两个for循环嵌套,假设i为最小数,用它跟数组中其他元素比较,
    //如果有比他小的就交换位置
        for (int i = 0; i < arr.length-1; i++) {           
         for (int j = 0; j < arr.length; j++) {                if(arr[i]>arr[j]){                    int temp=arr[i];
             arr[i]=arr[j];
             arr[j]=arr[i];      
                }
            }
        }
    }    
    //写一个遍历数组的方法
    public static void printArray(int[] arr){
        System.out.print("[");        
        for (int i = 0; i < arr.length; i++) {            
             if(i==arr.length-1){
            System.out.print(arr[i]);
            }else{
            System.out.print(arr[i]+",");
            
        }
        System.out.print("]");
    }
}

4.Arrays数组工具类  
  针对数组进行操作的工具类。提供了排序,转换等功能。

成员方法:
    public static String toString(int[] a):把数组转成字符串
        public static void sort(int[] a):对数组进行排序(有重载)
5.继承
  extends关键字可以进行类与类之间的继承
  格式:
       class 子类名 extends 父类名 {

        } 

    父类:基类,超类
    子类:派生类

学生类:
        成员变量:name,age
        构造方法:无参,带参
        成员方法:getXxx()/setXxx(),eat(),sleep()


    老师类:
        成员变量:name,age
        构造方法:无参,带参
        成员方法:getXxx()/setXxx(),eat(),sleep()    

按照我们刚才对继承的概述,我们可以找一个父类。

    人类:
        成员变量:name,age
        构造方法:无参,带参
        成员方法:getXxx()/setXxx(),eat(),sleep()    

    学生类:继承人类就可以了。
    老师类:继承人类就可以了。

继承的好处:
    A:提高了代码的复用性
        多个类相同的成员可以放到同一个类中
    B:提高了代码的维护性
        如果功能的代码需要修改,修改一处即可
    C:让类与类之间产生了关系,是多态的前提
方法重写(子类的方法名,参数和父类完全一样,将父类方法覆盖):
1.必须存在继承关系
2.父类的方法满足不了你的需求,此时你就需要重写父类的方法,实现自己想要实现的功能
继承的特点:(代码演示)
    A:Java只支持单继承,不支持多继承。
    B:Java支持多层(重)继承(继承体系)。

什么时候使用继承呢?
    继承中类之间体现的是:”is a”的关系。就是子类必须是父类的对象。
    举例:水果,香蕉
    举例:水杯,水果 (不能采用继承。)
    举例:动物,狗

6.类的组成:
       成员变量
       构造方法
       成员方法

继承间的成员变量关系:
    A:名字不同,非常简单。
    B:名字相同
        首先在子类局部范围找
        然后在子类成员范围找
        最后在父类成员范围找(肯定不能访问到父类局部范围)
        如果还是没有就报错。(仅能在父类找)
        就近原则。

super
关键字

      可以调用父类的方法
   super:
       super代表父类存储空间的标识(可以理解为父类对象)

this和super的使用区别:
    A:成员变量
        this.成员变量   本类的成员变量
        super.成员变量  父类的成员变量
    B:成员方法
        this.成员方法() 本类的成员方法
        super.成员方法()父类的成员方法 
继承间构造方法的关系:
    子类中所有的构造方法默认都会访问父类中空参数的构造方法(super())


    因为子类会继承父类中的数据,可能还会使用父类的数据。
    所以,子类初始化之前,一定要先完成父类数据的初始化。
    每个子类的构造方法的第一行,有一条默认的语句:
        super();

    注意:仅仅是完成数据的初始化,创建对象目前必须用new申请空间。

假如父类没有无参构造方法,该怎么办呢?
    A:调用父类的其他构造方法。带参构造。
        怎么访问呢?
            super(...)

注意:
    super(…)或者this(….)必须出现在第一条语句上。
    因为如果可以放后面的话,就会对父类的数据进程多次初始化。所以,只能放在第一条语句上。

建议:
    永远给出无参构造方法。

7.final关键字
   在实际开发的时候,有些方法的内容一旦写定后,就不允许被改动。
即使是子类,也不允许。
Java为了解决这样的问题就提供了一个关键字:final
       最终的意思。它可以修饰类,方法,变量。
   特点:
       修饰方法,方法不能被重写。
       修饰类,类不能被继承。
       修饰变量,变量的值不能再改动。其实这个时候变量已经变成了常量。

常量:
    A:字面值常量
        ‘a‘,12,"hello"
    B:自定义常量
        就是把变量用final修饰。
        定义一个常量。
        final 数据类型 变量名;

8.多态         
  定义:同一个对象,在不同时刻表现出来的不同状态。        
  多态的前提:
       A:有继承关系  
       B:有方法重写(不是必要条件,但是只有有了方法重写多态才有意义)
       C:有父类引用指向子类对象
  成员访问特点
       A:成员变量
           编译看左边,运行看左边
       B:构造方法
           子类构造默认访问父类的无参构造
       C:成员方法(重点理解)
           编译看左边,运行看右边

        为什么变量和方法不一样呢?
            方法重写。
    D:静态成员方法
        编译看左边,运行看左边
        因为静态的内容是和类相关的,与对象无关。

9.抽象类
   抽象类特点:
       A:抽象类和抽象方法必须用abstract关键字修饰
       B:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
       C:抽象类不能实例化
       实例化并使用
           按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
       D:抽象类的子类
           要么是抽象类
,要么重写抽象类中的所有抽象方法

抽象类的作用:
    强制要求子类必须要重写某些方法。    
类的组成:
    成员变量:
    构造方法:
    成员方法:
抽象类的成员:
    成员变量:可以是变量,也可以是常量。
    构造方法:有构造方法
      构造方法作用:用于子类访问父类数据的初始化。
    成员方法:既可以是抽象的,也可以是非抽象的。

    抽象类练习
   以后我们在写代码的时候,有这样的分析过程。
   分析:
       从具体到抽象。
   实现:
       从抽象到具体。
   使用:
                
       使用具体的类。 


java基础3