国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

JavaSE學(xué)習(xí)筆記基礎(chǔ)加強(1)

2019-11-14 23:10:25
字體:
供稿:網(wǎng)友
javaSE學(xué)習(xí)筆記基礎(chǔ)加強(1)

(1) 靜態(tài)導(dǎo)入

導(dǎo)入技術(shù)其實在java中是為了方便的使用其他人寫好的類。

import java.lang.*|類名

在原來的導(dǎo)包語句中發(fā)現(xiàn)只能導(dǎo)入類。如果需要導(dǎo)入的是一些靜態(tài)的方法或者屬性那么就無能為力。

舉例1:求一個任意半徑的圓形的面積?

// 求一個任意半徑的圓形的面積

public static void getArea(){

// 1. 求一個隨機的半徑

double r = Math.ceil(Math.random()*10);

// 2. 計算面積

double area = 0.0;

area = Math.PI*r*r;

// 3. 打印面積

System.out.

}

發(fā)現(xiàn)以上的代碼中大量的出現(xiàn)了一些靜態(tài)的成員。

那么可以使用靜態(tài)導(dǎo)入的方式簡化代碼的書寫。

語法:

import static java.lang.*|靜態(tài)成員

實戰(zhàn):

importstatic java.lang.Math.PI;

importstatic java.lang.System.out;

importstatic java.lang.Math.random;

importstatic java.lang.Math.ceil;

public class Demo4 {

// 求一個任意半徑的圓形的面積

public static void getArea(){

// 1. 求一個隨機的半徑

double r = ceil(random()*10);

// 2. 計算面積

double area = 0.0;

area = PI*r*r;

// 3. 打印面積

out.println("半徑是"+r+"的圓形的面積是:"+area);

}

}

如果代碼中使用到了一個類的多個靜態(tài)成員那么可以直接使用* 進行全部的導(dǎo)入。

import static java.lang.Math.*;

(2) 可變參數(shù)

思考:如果開發(fā)者現(xiàn)在要定義一個函數(shù)(方法),那么不知道參數(shù)的個數(shù)的時候應(yīng)該如何指定形參。

語法:定義函數(shù)的語法

修飾符 返回值類型 方法名(參數(shù)類型… 變量名 ) 異常的聲明{

// 函數(shù)體

return;

}

注:學(xué)習(xí)可變參數(shù)的本質(zhì)

  1. 可變參數(shù)其實是一個可變的數(shù)組
  2. 可變參數(shù)在方法的聲明中只能出現(xiàn)在參數(shù)列表的最后一個位置
  3. 可變參數(shù)只能在參數(shù)列表中出現(xiàn)一次

舉例1:求任意個整數(shù)的累加和?

// 求任意個整數(shù)的累加和?

public static long getSum(int... is){

long sum = 0;

for (int i = 0; i < is.length; i++) {

sum +=is[i];

}

return sum;

}

舉例2:SUN的API中用的可變參數(shù)。

static <T> List<T> asList(T... a) 返回一個受指定數(shù)組支持的固定大小的列表。

u 包裝類

其實在java中有四型八種的基本數(shù)據(jù)類型。如果所有的基本數(shù)據(jù)類型不是對象的話那么java

語言就不是正真的OOP語言。

Wrapper Class即包裝類。在包裝類中SUN封轉(zhuǎn)了開發(fā)者常用的一些屬性和方法,可以進行快速的編程。

包裝類

基本數(shù)據(jù)類型

Byte

byte

Short

short

Integer

int

Long

long

Boolean

boolean

Character

char

Float

float

Double

double

舉例1:體驗Integer類提供的屬性。

// 體驗Integr類的屬性

public static void getField() {

System.out.println(Integer.MIN_VALUE); // -2147483648

System.out.println(Integer.MAX_VALUE); // 2147483647

}

閱讀以下的代碼,分析代碼的錯誤原因:

long date = 12345678910; // 報錯

12345678910

2147483647

舉例2:體驗Integer類提供的方法。

主要學(xué)習(xí)的是整數(shù)到字符串之間的轉(zhuǎn)換的方法。

// 體驗Integr類的方法

public static void getMethod() {

// 創(chuàng)建類對象

Integer in1 = new Integer(123);

int i1 = in1.intValue();

System.out.println(i1+1);

// 轉(zhuǎn)換為字符串

String str1 = in1.toString();

System.out.println(str1+1);

}

其實在這里沒有必要轉(zhuǎn)型為String的時候進行基本的toString()調(diào)用。

簡化以上的代碼:

// 體驗Integr類的方法

public static void getMethod2() {

// 創(chuàng)建類對象

Integer in1 = new Integer(123);

int i1 = in1; // 自動拆箱

System.out.println(i1+1);

// 轉(zhuǎn)換為字符串

System.out.println(in1+""+1);

}

(3)什么是自動拆箱和自動裝箱?

自動裝箱: 如果將基本類型傳遞給包裝類型。 Integer in1 = 12;

自動拆箱: 如果將包裝類型傳遞給基本類型。 int i1 = in1

在泛型的時候比較有用:

集合:主要的用途是進行對象的存儲。

list.add(1); //自動裝箱

思考:String str = “hello”;

u 增強for循環(huán)

如果要遍歷一個指定的數(shù),那么我們一般要使用傳統(tǒng)的的for循環(huán)。

語法:

for( 條件的初始化語句; 條件表達式; 循環(huán)的增量 ){

// 循環(huán)體 break或continue

}

這樣寫的話每次都會遇到一個下標越界的一個異常。

因此可以使用增強for循環(huán)進行快速的遍歷(數(shù)組、集合以及實現(xiàn)了Iterable接口的類)。

語法:

for(數(shù)據(jù)類型 變量名:需要遍歷的集合){

// 循環(huán)體

}

舉例1:遍歷一個普通的數(shù)組。

// 遍歷一個數(shù)組

public static void printArray(int [] a){

for(int temp:a){

System.out.println(temp);

}

}

舉例2:遍歷一個List集合。

// 遍歷一個list

public static void printList(List<String> list){

for (String string : list) {

System.out.println(string);

}

}

舉例3:遍歷一個Map集合。

// 遍歷一個Map集合

public static void printMap(Map<Integer,String> map){

// 想將其轉(zhuǎn)換為實現(xiàn)了Iterable接口的Set類

Set<Map.Entry<Integer, String>> set = map.entrySet();

// 遍歷set集合

for(Map.Entry<Integer, String> entry:set){

// 獲取entry對象的key和value值

Integer key = entry.getKey();

String value = entry.getValue();

System.out.println(key+"="+value+",");

}

}

思考:如果以上的集合沒有使用泛型,那么在使用for循環(huán)的時候應(yīng)該使用什么類型接收集合數(shù)據(jù)? Object

問題1:使用增強for循環(huán)是否可以改變集合中數(shù)據(jù)?

因為for循環(huán)在遍歷的時候使用的是將值拷貝一份給臨時變量。因此改變臨時變量不會改變集合中的數(shù)據(jù)值。

問題2:使用增強for循環(huán)遍歷集合的時候操作集合的問題?

// 遍歷一個list

public static void printList(List<String> list){

for (String string : list) {

list.add("eeee"); // 運行錯誤

System.out.println(string);

}

System.out.println("遍歷中: "+list);

}

異常信息如下:

Exception in thread "main" java.util.ConcurrentModificationException

模擬基礎(chǔ)班看過的場景:

public static void main(String[] args) {

List<String> list = new ArrayList<String>();

list.add("aaaa");

list.add("bbbb");

list.add("cccc");

list.add("dddd");

Iterator<String> it = list.iterator();

while(it.hasNext()){

list.add("yyyy");

String str = it.next();

System.out.println(str);

}

}

運行異常:

Exception in thread "main" java.util.ConcurrentModificationException

總結(jié);

在使用增強for循環(huán)進行集合的迭代的時候其實默認使用的是迭代器,因此在循環(huán)中不能使用集合的引用變量直接操作集合,避免導(dǎo)致多線程并發(fā)訪問的安全性異常。

u 安全的枚舉類

在實際的項目的開發(fā)中我們經(jīng)常需要一類數(shù)據(jù),這一類數(shù)據(jù)的值是特定范圍的一組值。如:

性別:[男、女]

交通燈:[紅、黃、綠]

星期幾:[一~七]

以上的一組值可以定義為枚舉數(shù)據(jù)類型。

語法:

修飾符 enum 枚舉類名{

// 定義枚舉的一組值,多個值之間使用逗號進行分隔

}

實現(xiàn):

public enum Gender {

MALE,FEMALE;

}

問題:枚舉的本質(zhì)是什么?

  1. 枚舉本質(zhì)是一個類
  2. 默認繼承自Enum類
  3. 枚舉值本質(zhì)是枚舉類的靜態(tài)常量值
  4. 枚舉值都在靜態(tài)代碼塊中進行初始化
  5. 枚舉類的默認構(gòu)造函數(shù)式有參數(shù)的且只能私有
  6. 枚舉是單例模式
  7. 既然枚舉是一個普通類,那么我們開發(fā)人員就可以在類中定義類的成員(屬性、構(gòu)造函數(shù)、函數(shù))。

    舉例1:在枚舉中定義屬性。

    public enum TrafficLight {

    // 定義枚舉值

    RED,GREEN,YELLOW;

    // 定義成員屬性

    public String info = "交通燈信息";

    public static void main(String[] args) {

    System.out.println(TrafficLight.GREEN.info);

    }

    }

    舉例2::在枚舉中定義構(gòu)造函數(shù)。

    public enum TrafficLight {

    // 定義枚舉值

    RED("紅燈"),GREEN("綠燈"),YELLOW("黃燈");

    // 定義成員屬性

    public String info = "交通燈信息";

    // 提供構(gòu)造函數(shù)進行屬性的初始化

    private TrafficLight(String info){

    this.info = info;

    }

    public static void main(String[] args) {

    System.out.println(TrafficLight.GREEN.info);

    System.out.println(TrafficLight.RED.info);

    System.out.println(TrafficLight.YELLOW.info);

    }

    }

    切記的是為了保證枚舉是單例的那么構(gòu)造函數(shù)全部要私有。

    舉例3:在枚舉中定義函數(shù)。

    public enum TrafficLight {

    // 定義枚舉值

    RED("紅燈") {

    @Override

    public void showMessage() {

    System.out.println("紅燈停!");

    }

    },

    GREEN("綠燈") {

    @Override

    public void showMessage() {

    System.out.println("綠燈行!");

    }

    },

    YELLOW("黃燈") {

    @Override

    public void showMessage() {

    System.out.println("你自己看著辦!");

    }

    };

    // 定義成員屬性

    public String info = "交通燈信息";

    // 提供構(gòu)造函數(shù)進行屬性的初始化

    private TrafficLight(String info) {

    this.info = info;

    }

    // 提供一個表明燈的信息的方法

    public abstract void showMessage();

    public static void main(String[] args) {

    System.out.println(TrafficLight.GREEN.info);

    System.out.println(TrafficLight.RED.info);

    System.out.println(TrafficLight.YELLOW.info);

    TrafficLight.RED.showMessage();

    }

    }

    以上的代碼可見在枚舉類中可以定義抽象方法,但是不能將枚舉類聲明為抽象類,只能在聲明枚舉值的時候?qū)崿F(xiàn)所有的抽象方法即(匿名內(nèi)部類)。

    在實際的枚舉中其實自定義的枚舉類默認繼承Enum類,那么我們的枚舉類中就會有Enum類中的定義好的屬性和方法。

    常用方法

    方法的描述

    String name()

    獲取枚舉值的名稱

    int ordinal()

    返回枚舉值定義的序號

    valueOf(Class<T> enumType, String name)

    通過反射查找指定的類中的指定名的枚舉值

    values()

    該方法在API中不可見但是可用

    舉例3:使用Enum類中常用的方法。

    // 常用的方法體驗

    System.out.println(TrafficLight.YELLOW.name()); // YELLOW

    System.out.println(TrafficLight.RED.ordinal()); // 0

    System.out.println(TrafficLight.valueOf(TrafficLight.class,"GREEN"));

    以上的方法都是在API中可見的方法,但是有一些方法是API中不可見但是內(nèi)部其實定義了的方法。

    舉例4:遍歷枚舉值。

    // 遍歷枚舉值

    TrafficLight [] trans = TrafficLight.values();

    for(TrafficLight temp:trans){

    System.out.println(temp);

    }


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 根河市| 昭苏县| 临邑县| 凤台县| 夏津县| 石渠县| 株洲市| 朝阳区| 铅山县| 香港| 巴中市| 贺兰县| 虎林市| 冀州市| 南和县| 晋宁县| 梁山县| 定西市| 江北区| 阳城县| 高安市| 景泰县| 合江县| 新乐市| 麻城市| 桃江县| 华池县| 白河县| 周至县| 张家川| 修文县| 涟源市| 滕州市| 海南省| 阳春市| 炉霍县| 德钦县| 温泉县| 九江县| 南平市| 竹溪县|