日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础三个排序详解_继承粗解语法关键字分析

發(fā)布時(shí)間:2024/3/12 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础三个排序详解_继承粗解语法关键字分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

集合存放數(shù)據(jù)的容器,存放的數(shù)據(jù)可以是基本類型也可以是引用類型,數(shù)據(jù)類型必須一致,存放數(shù)據(jù)的空間是連續(xù)的即地址連續(xù),長度固定
聲明數(shù)組變量
首先必須聲明數(shù)組變量,才能在程序中使用數(shù)組。下面是聲明數(shù)組變量的語法:

dataType[] arrayRefVar; // 首選的方法 dataType arrayRefVar[]; // 效果相同,但不是首選方法

注意: 建議使用 dataType[] arrayRefVar 的聲明風(fēng)格聲明數(shù)組變量。
dataType arrayRefVar[] 風(fēng)格是來自 C/C++ 語言 ,在Java中采用是為了讓 C/C++ 程序員能夠快速理解java語言。
創(chuàng)建數(shù)組
Java語言使用new操作符來創(chuàng)建數(shù)組,語法如下:
arrayRefVar = new dataType[arraySize];
上面的語法語句做了兩件事:
一、使用 dataType[arraySize] 創(chuàng)建了一個(gè)數(shù)組。
二、把新創(chuàng)建的數(shù)組的引用賦值給變量 arrayRefVar。
數(shù)組變量的聲明,和創(chuàng)建數(shù)組可以用一條語句完成,如下所示:
dataType[] arrayRefVar = new dataType[arraySize];
另外,你還可以使用如下的方式創(chuàng)建數(shù)組。
dataType[] arrayRefVar = {value0, value1, …, valuek};
數(shù)組的元素是通過索引訪問的。數(shù)組索引從 0 開始,所以索引值從 0 到 arrayRefVar.length-1。

例一:

public class ArrayDf{public static void main(String[] args){String[] stringArray; //主方法棧幀中創(chuàng)建一個(gè)String[]類型變量,存放一個(gè)String[]類型的變量,里面包含若干元素,引用類型//String[]是一種類型,不能有下標(biāo)//數(shù)組變量存儲的位置看定義的位置,比如static——靜態(tài)數(shù)據(jù)區(qū)stringArray = new String[10]; //創(chuàng)建對象在堆區(qū),開辟10個(gè)String[]類型的空間相當(dāng)于創(chuàng)建了10個(gè)連續(xù)的變量,初值一樣stringArray[1]="two"; //把two賦給stringArray[]所指數(shù)組對象的第二個(gè)元素 //數(shù)組名對應(yīng)數(shù)組元素空間地址,數(shù)組對象每一個(gè)元素的空間 //元素名和變量名類似,尋址方式不同,導(dǎo)致叫法不同 //變量——直接尋址 //元素——間接尋址 //元素名:元素空間首地址+下標(biāo) //有確切的初值null //一個(gè)new String一次創(chuàng)建兩個(gè)對象,分別儲存在堆中和方法區(qū)的常量池 //元素個(gè)數(shù)已經(jīng)定義,是final不可分割,不可改變的System.out.println("元素默認(rèn)初始化值是:"+stringArray[2]); //輸出String[]類型System.out.println("元素默認(rèn)初始化值是:"+stringArray);} }

例二:

public class StaticInitArray{public static void main(String[] args){int[]a = {1,3,5,7,9,11};//這種初始化只能在聲明時(shí)使用 主方法棧幀中開辟空間,創(chuàng)建變量a,int[]類型,不會默認(rèn)初始化 在類中定義的實(shí)例變量(堆)和靜態(tài)全局變量(方法區(qū)靜態(tài)數(shù)據(jù)區(qū))會默認(rèn)初始化,在棧楨中不會默認(rèn)初始化//int[] a;//a= {1,3,5,7,9,11}; 錯誤這屬于賦值不是初始化//初始化有默認(rèn)初始化,顯式初始化 //顯示初始化是在定義變量的時(shí)候//賦值可以多次,初始化只能有一次int[]k=new int[0];//System.out.println(k[0]);//int[]m=new int[-10];int[]num;num=new int[]{1, 2, 3, 4, 5};既可以初始化,也可以賦值,比較靈活int[]b = new int[3]; //指定元素個(gè)數(shù)3,默認(rèn)為0b=num;b原來所指的數(shù)組對象地址丟失,游離,內(nèi)存泄露 //b,num都是首元素地址a,b,num類型相同,可以相互賦值b[2]=100;for (int i = 0;i<b.length;i++){System.out.println(num[i]);} System.out.println("--------------------");for (int i:b){ //拿出數(shù)組元素賦給iSystem.out.println(i);}集合可以存放不同類型對象的地址,數(shù)組也可以,但必須是object[]類型} }

多維數(shù)組
多維數(shù)組可以看成是數(shù)組的數(shù)組,比如二維數(shù)組就是一個(gè)特殊的一維數(shù)組,其每一個(gè)元素都是一個(gè)一維數(shù)組,例如:

String str[][] = new String[3][4];

多維數(shù)組的動態(tài)初始化(以二維數(shù)組為例)
1. 直接為每一維分配空間,格式如下:

type[][] typeName = new type[typeLength1][typeLength2];

type 可以為基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型,arraylength1 和 arraylength2 必須為正整數(shù),arraylength1 為行數(shù),arraylength2 為列數(shù)。
例如:

int a[][] = new int[2][3];

解析:
二維數(shù)組 a 可以看成一個(gè)兩行三列的數(shù)組。
2. 從最高維開始,分別為每一維分配空間,例如:

String s[][] = new String[2][]; s[0] = new String[2]; s[1] = new String[3]; s[0][0] = new String("Good"); s[0][1] = new String("Luck"); s[1][0] = new String("to"); s[1][1] = new String("you"); s[1][2] = new String("!");

解析:
s[0]=new String[2] 和 s[1]=new String[3] 是為最高維分配引用空間,也就是為最高維限制其能保存數(shù)據(jù)的最長的長度,然后再為其每個(gè)數(shù)組元素單獨(dú)分配空間 s0=new String(“Good”) 等操作。
多維數(shù)組的引用(以二維數(shù)組為例)
對二維數(shù)組中的每個(gè)元素,引用方式為 arrayName[index1][index2],例如:

num[1][0];

Arrays 類
java.util.Arrays 類能方便地操作數(shù)組,它提供的所有方法都是靜態(tài)的。
具有以下功能:
? 給數(shù)組賦值:通過 fill 方法。
? 對數(shù)組排序:通過 sort 方法,按升序。
? 比較數(shù)組:通過 equals 方法比較數(shù)組中元素值是否相等。
? 查找數(shù)組元素:通過 binarySearch 方法能對排序好的數(shù)組進(jìn)行二分查找法操作。
具體說明請查看下表:
序號 方法和說明

1 public static int binarySearch(Object[] a, Object key)

用二分查找算法在給定數(shù)組中搜索給定值的對象(Byte,Int,double等)。數(shù)組在調(diào)用前必須排序好的。如果查找值包含在數(shù)組中,則返回搜索鍵的索引;否則返回 (-(插入點(diǎn)) - 1)。

2 public static boolean equals(long[] a, long[] a2)

如果兩個(gè)指定的 long 型數(shù)組彼此相等,則返回 true。如果兩個(gè)數(shù)組包含相同數(shù)量的元素,并且兩個(gè)數(shù)組中的所有相應(yīng)元素對都是相等的,則認(rèn)為這兩個(gè)數(shù)組是相等的。換句話說,如果兩個(gè)數(shù)組以相同順序包含相同的元素,則兩個(gè)數(shù)組是相等的。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte,short,Int等)。

3 public static void fill(int[] a, int val)

將指定的 int 值分配給指定 int 型數(shù)組指定范圍中的每個(gè)元素。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte,short,Int等)。

4 public static void sort(Object[] a)

對指定對象數(shù)組根據(jù)其元素的自然順序進(jìn)行升序排列。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte,short,Int等)。

length屬性,length()方法和size()的方法的區(qū)別
1.length屬性是針對Java中的數(shù)組來說的,要求數(shù)組的長度可以用其length屬性;
2.length()方法是針對字符串來說的,要求一個(gè)字符串的長度就要用到它的length()方法;
3.java中的size()方法是針對泛型集合說的,如果想看這個(gè)泛型有多少個(gè)元素,就調(diào)用此方法來查看!

public static void main(String[] args) {String []list={"ma","cao","yuan"};String a="macaoyuan";System.out.println(list.length);System.out.println(a.length());List array=new ArrayList();array.add(a);System.out.println(array.size()); }

冒泡法排序的基本思想:
從前向后(或從后向前)依次比較相鄰兩個(gè)元素的大小,如果逆序(與題意要求的順序相反)就進(jìn)行交換,使最小(最大)的元素上浮(下沉)到本次排序的最前面(最后面),從而完成一趟(pass)排序。下一趟排序時(shí),已經(jīng)有序的元素不再參與。這樣的話,n個(gè)元素需要進(jìn)行n-1趟排序
冒泡排序的關(guān)鍵點(diǎn):
(1)采用雙層循環(huán):時(shí)間復(fù)雜度為O(n的平方)
外層循環(huán)表示的是排序的趟數(shù),n個(gè)數(shù)字需要n-1趟,因此,外層循環(huán)的次數(shù)是n-1次;
內(nèi)層循環(huán)表示的是每一趟排序的數(shù)字。根據(jù)冒泡排序的思想,第i趟排序后,就會有i個(gè)數(shù)屬于有序的元素,它們不參與第i+1趟的排序。因此,用一個(gè)循環(huán)來控制,只是不同的方式的寫法不一樣,望學(xué)者理解掌握。
(2)相鄰兩個(gè)數(shù)只要屬于逆序,就實(shí)行交換。正序就不交換,因此,是穩(wěn)定排序;也就是說,即使序列中出現(xiàn)相同的兩個(gè)數(shù)字,它們不會實(shí)施交換,相同數(shù)字的相對順序不會發(fā)生變化!

選擇排序的基本思想:
找到當(dāng)前數(shù)字序列中最大(最小)的數(shù),記錄其所在位置,將其和最前面(最后面)的數(shù)進(jìn)行交換,使最小(最大)的元素上浮(下沉)到本次排序的最前面(最后面),從而完成一趟(pass)排序。下一趟排序時(shí),已經(jīng)有序的元素不再參與。這樣的話,n個(gè)元素需要進(jìn)行n-1趟排序
選擇排序的關(guān)鍵點(diǎn):
(1)采用雙層循環(huán):時(shí)間復(fù)雜度也是O(n的平方)
外層循環(huán)表示的是排序的趟數(shù),n個(gè)數(shù)字需要n-1趟,因此,外層循環(huán)的次數(shù)是n-1次;同時(shí)也代表數(shù)的位置。
內(nèi)層循環(huán)表示的是每一趟排序的數(shù)字。根據(jù)選擇排序的思想,第i趟排序時(shí),最前面的位置就是i,用一個(gè)循環(huán)來不斷更新。
(2)找到最值數(shù)的位置,將該位置的數(shù)和當(dāng)前序列最前面(最后面)位置的數(shù)進(jìn)行交換;。(穩(wěn)定排序)

插入排序的基本思想是:
將數(shù)組的第一個(gè)數(shù)認(rèn)為是有序數(shù)組,從后往前(從前往后)掃描該有序數(shù)組,把數(shù)組中其余n-1個(gè)數(shù),根據(jù)數(shù)值的大小,插入到有序數(shù)組中,直至數(shù)組中的所有數(shù)有序排列為止。這樣的話,n個(gè)元素需要進(jìn)行n-1趟排序
插入排序的關(guān)鍵點(diǎn):
? 采用雙層循環(huán):時(shí)間復(fù)雜度也是O(n的平方)
(1)外層循環(huán)表示的是排序的趟數(shù),n個(gè)數(shù)字需要n-1趟,因此,外層循環(huán) 的次數(shù)是n-1次;同時(shí)也代表數(shù)的位置。
(2)內(nèi)層循環(huán)表示的是每一趟排序的數(shù)字。根據(jù)插入排序的思想,第i趟排 序時(shí),有序數(shù)組中的數(shù)字就有i個(gè),就需要進(jìn)行i次比較,因此循環(huán)i次。注 意采用的是從后往前進(jìn)行比較。
? 從后往前掃描的時(shí)候,如果必須插入的數(shù)大于有序數(shù)組中當(dāng)前位置的數(shù),則有序數(shù)組中的數(shù)和它之后的數(shù)均往后移一個(gè)位置,否則,把插入的數(shù)插入到有序數(shù)組中。(穩(wěn)定排序)

繼承類型
需要注意的是 Java 不支持多繼承,但支持多重繼承。

繼承的特性

  • 子類擁有父類非 private 的屬性、方法。
  • 子類可以擁有自己的屬性和方法,即子類可以對父類進(jìn)行擴(kuò)展。
  • 子類可以用自己的方式實(shí)現(xiàn)父類的方法。
  • Java 的繼承是單繼承,但是可以多重繼承,單繼承就是一個(gè)子類只能繼承一個(gè)父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關(guān)系就是C類是B類的父類,B類是A類的父類,這是Java繼承區(qū)別于C++繼承的一個(gè)特性。提高了類之間的耦合性(繼承的缺點(diǎn),耦合度高就會造成代碼之間的聯(lián)系越緊密,代碼獨(dú)立性越差)。

    繼承關(guān)鍵字
    繼承可以使用extends和implements這兩個(gè)關(guān)鍵字來實(shí)現(xiàn)繼承,而且所有的類都是繼承于java.lang.Object,當(dāng)一個(gè)類沒有繼承的兩個(gè)關(guān)鍵字,則默認(rèn)繼承object(這個(gè)類在 java.lang 包中,所以不需要 import)祖先類。
    extends關(guān)鍵字
    在Java中,類的繼承是單一繼承,也就是說,一個(gè)子類只能擁有一個(gè)父類,所以extends只能繼承一個(gè)類。
    implements關(guān)鍵字
    使用implements關(guān)鍵字可以變相的使java具有多繼承的特性,使用范圍為類繼承接口的情況,可以同時(shí)繼承多個(gè)接口(接口跟接口之間采用逗號分隔)。
    super 與 this 關(guān)鍵字
    **super關(guān)鍵字:**我們可以通過super關(guān)鍵字來實(shí)現(xiàn)對父類成員的訪問,用來引用當(dāng)前對象的父類。
    **this關(guān)鍵字:**指向自己的引用。
    final關(guān)鍵字 final 關(guān)鍵字聲明類可以把類定義為不能繼承的,即最終類;或者用于修飾方法,該方法不能被子類重寫:

    聲明類:
    final class 類名 {//類體}
    聲明方法:

    修飾符(public/private/default/protected) final 返回值類型 方法名(){//方法體}

    **注:**實(shí)例變量也可以被定義為 final,被定義為 final 的變量不能被修改。被聲明為 final 類的方法自動地聲明為 final,但是實(shí)例變量并不是 final

    構(gòu)造器
    子類是不繼承父類的構(gòu)造器(構(gòu)造方法或者構(gòu)造函數(shù))的,它只是調(diào)用(隱式或顯式)。如果父類的構(gòu)造器帶有參數(shù),則必須在子類的構(gòu)造器中顯式地通過 super 關(guān)鍵字調(diào)用父類的構(gòu)造器并配以適當(dāng)?shù)膮?shù)列表。
    如果父類構(gòu)造器沒有參數(shù),則在子類的構(gòu)造器中不需要使用 super 關(guān)鍵字調(diào)用父類構(gòu)造器,系統(tǒng)會自動調(diào)用父類的無參構(gòu)造器。

    代碼分析
    只創(chuàng)建了一個(gè)子類對象,父類對象沒有創(chuàng)建
    不會創(chuàng)建父類對象,但是會為父類的私有屬性在堆中開辟空間,四個(gè)字節(jié),會默認(rèn)初始化為0
    但這個(gè)空間不屬于父類對象,也不屬于子類對象,而是和定義這個(gè)屬性的父類做動態(tài)綁定

    class Animal{ private int weight; Boolean sex; //可以被繼承//父類構(gòu)造方法public Animal(){System.out.println("Animal(): "+this);this.weight=20; //根據(jù)this.weight,拿到this地址優(yōu)先在子類中找weight屬性,沒有就會到構(gòu)造方法動態(tài)綁定的Animal類動態(tài)綁定的屬性weight,進(jìn)行初始化設(shè)值。this.sex=true; //調(diào)用父類構(gòu)造方法(也和父類進(jìn)行的動態(tài)綁定),父類的私有屬性只能用父類的構(gòu)造方法初始化,this.sex傳過去的對象地址是子類對象Dog的地址 //先回在子類中尋找sex屬性,找到了設(shè)置為true//this.age=10; //父類的方法里看不到子類新增的屬性和方法 //只能看的子類繼承的或者繼承和重寫的屬性和方法} public int getWeight(){ //可被子類繼承return this.weight;} public void setWeight(int w){ //可被子類繼承this.weight=w;this.sex=false;//this.age=10;//父類看不到子類新增的屬性,不能給子類屬性進(jìn)行初始化 } } class Dog extends Animal{ int age; //子類新增屬性,父類看不到public Dog(){ //子類構(gòu)造方法與子類綁定System.out.println("Dog(): "+this);this.age=10; //調(diào)用子類的構(gòu)造方法為子類對象的屬性初始化this.sex=false;//上轉(zhuǎn)型 //雖然是父類屬性,但是被子類繼承,且傳入的是子類對象的地址,優(yōu)先在子類中尋找,這里可以為sex進(jìn)行初始化false//this.weight=20; //子類構(gòu)造方法不能給父類私有屬性初始化 //1、weight是父類的私有屬性,子類沒有繼承 //2、在子類對象尋找weight,子類的構(gòu)造方法和子類綁定,子類沒有綁定weight}

    構(gòu)造方法執(zhí)行結(jié)束后,對象也就創(chuàng)建結(jié)束了

    /**子類新增方法*/public void Bark(){ //方法空間//this.weight=20;this.sex=false;System.out.println("Wang~~Wang~~~"); } }

    //測試類

    public class MyDog{ //加載到方法區(qū)的類代碼區(qū)private static Animal myAnimal; //靜態(tài)綁定,加載Animal字節(jié)碼文件//方法區(qū)的靜態(tài)數(shù)據(jù)區(qū)創(chuàng)建Animal類的靜態(tài)變量,默認(rèn)初始化nullpublic static void main(String args[]){ myAnimal=new Dog(); //對象的上轉(zhuǎn)型 //Dog對象父類Animal類的變量,父類不知道子類有新增的屬性和方法 //有在方法區(qū)的靜態(tài)數(shù)據(jù)區(qū)myAnimal.setWeight(50); ///調(diào)用myAnimal所指對象的setWeight方法,現(xiàn)在子類中尋址沒有,再到綁定的Animal類中綁定的setWeight方法System.out.println("My Dog's Weight is"+myAnimal.getWeight());//myAnimal.weight=100;// myAnimal.Bark();//Dog dog=new Dog();//dog.Bark();} }

    總結(jié):
    創(chuàng)建子類對象時(shí)
    1、先為父類中被子類繼承的sex屬性開辟空間,默認(rèn)初始化false
    2、再為子類新增的屬性age開辟空間,4個(gè)字節(jié),初始化為0
    3、為父類定義的被子類繼承的方法getWeight(),setWeight(int)開辟空間
    4、為子類新增的方法Bark()開辟空間
    此使就有了一個(gè)dog類型的this指針
    ? 只要屬性和方法在父類中定義,即使能被子類繼承或者不被繼承,都要和父類做動態(tài)綁定,方法getWeight(),setWeight(int),屬性sex,weight都和父類做了動態(tài)綁定

    總結(jié)

    以上是生活随笔為你收集整理的Java基础三个排序详解_继承粗解语法关键字分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。