從0開(kāi)始復(fù)習(xí)java(3)

一、面向?qū)ο?/h3>

1、包裝類(lèi)

java5之后有自動(dòng)裝箱和自動(dòng)拆箱功能。

包裝類(lèi)可以實(shí)現(xiàn)基本類(lèi)型變量和字符串之間的轉(zhuǎn)換。

字符串轉(zhuǎn)基本數(shù)據(jù)類(lèi)型:

  • 包裝類(lèi)的靜態(tài)方法parseType(String s)
  • 利用包裝類(lèi)提供的type(String s)構(gòu)造器。(如int a = Integer.int("123")

基本數(shù)據(jù)類(lèi)型轉(zhuǎn)字符串:

  • String.valueOf(Type t)
  • "" + t

Integer-128~127直接用的是cache數(shù)組中的內(nèi)容:

static final Integer[] cache = new Integer[-(-128)+127+1];
static {
    for(int i=0; i <= cache.length; i++){
        cache[i] = new Integer(i-128);
    }
}

java7為所有的包裝類(lèi)提供了compare(Type a, Type b)靜態(tài)方法。

java8增加了無(wú)符號(hào)算術(shù)運(yùn)算。

2、toString方法

Java對(duì)象都是Object類(lèi)的實(shí)例,可以直接調(diào)用該類(lèi)的方法,這些方法提供了處理Java對(duì)象的通用方法。

3、equals方法

Object類(lèi)中,equals==沒(méi)有區(qū)別。

public boolean equals(Object obj){
    if (this==obj){
        return true;
    }
    if (obj != null && obj.getClass() == Person.Class){
        Person personObj = (Person)obj;
        if (this.getIdStr().equals(personObj.getIdStr())){
            return true;
        }
    }
    return false;
}

4、類(lèi)成員

static修飾的就是類(lèi)成員。包括類(lèi)變量、類(lèi)方法、靜態(tài)初始化塊。

類(lèi)成員不能訪(fǎng)問(wèn)實(shí)例變量。

Java類(lèi)里面有:

  • 成員變量
  • 成員函數(shù)
  • 構(gòu)造器
  • 初始化塊
  • 內(nèi)部類(lèi)(接口、枚舉等)

5、單例類(lèi)

class Singleton{
    private static Singleton instance;
    private Singleton(){}
    public static Singleton getInstace(){
        if(isntance==null){
            instance = new Singleton();
        }
        return instance;
    }
}

6、final修飾符

final修飾的變量不可被修改。可以修飾成員變量、局部變量、形參等。

沒(méi)有定義初始值,也沒(méi)有在初始化塊、構(gòu)造器中指定初始值,則這些變量將是系統(tǒng)分配的默認(rèn)值0,'\u0000',false,null,其失去意義。因此Java規(guī)定:final修飾的成員變量必須由程序員顯示的指定初始值。

final修飾類(lèi)變量和實(shí)例變量的位置:

  • 類(lèi)變量:靜態(tài)初始化塊或者聲明的地方
  • 實(shí)例變量: 非靜態(tài)初始化塊或聲明的地方或構(gòu)造器

7、可執(zhí)行“宏替換”的final變量

只要滿(mǎn)足三個(gè)條件,即變成直接量,而非變量。

  • 使用final修飾
  • 定義是指定初始值
  • 改初始值可以在編譯時(shí)確定下來(lái)

8、final方法和final類(lèi)

final定義的方法不可以被重寫(xiě)。

Object類(lèi)里面有一個(gè)final類(lèi)getClass()。

final類(lèi)不可以有子類(lèi)。java.lang.Math

9、抽象類(lèi)

抽象方法是只有方法簽名,沒(méi)有方法實(shí)現(xiàn)的方法。

有抽象方法的類(lèi)只能是抽象類(lèi),抽象類(lèi)中可以沒(méi)有抽象方法。

  • 抽象類(lèi)必須使用abstract修飾符,抽象方法也要使用abstract修飾符,抽象方法不能有方法體。
  • 抽象類(lèi)不能被實(shí)例化。
  • 抽象類(lèi)可以有成員變量、方法、構(gòu)造器、初始化塊、內(nèi)部類(lèi)。抽象類(lèi)的構(gòu)造器主要用于子類(lèi)調(diào)用,不能用于創(chuàng)建實(shí)例。
  • 含有抽象方法的類(lèi)只能被定義為抽象類(lèi)。

利用抽象類(lèi)和抽象方法可以更好的發(fā)揮多態(tài)的優(yōu)勢(shì)。

staticabstract不能同時(shí)修飾某個(gè)方法。沒(méi)有類(lèi)抽象方法。

static 和 abstract 可以同時(shí)修飾內(nèi)部類(lèi)。

抽象類(lèi)體現(xiàn)了模板模式的設(shè)計(jì)。

10、接口

接口里的所有方法都是抽象方法,Java8對(duì)接口進(jìn)行了改進(jìn),允許定義默認(rèn)方法,默認(rèn)方法可以提供方法實(shí)現(xiàn)。

[修飾符] interface Name extends Name1, Name2{
    0個(gè)到多個(gè)常數(shù)定義;
    0個(gè)到多個(gè)抽象方法;
    0個(gè)到多個(gè)內(nèi)部類(lèi)、接口、枚舉;
    0個(gè)到多個(gè)默認(rèn)方法或類(lèi)方法定義;
}

修飾符可以是public或者省略
接口只能繼承接口,不能繼承類(lèi)

接口里面可以包含靜態(tài)常量、抽象實(shí)例方法、類(lèi)方法或默認(rèn)方法、內(nèi)部類(lèi)。

只能使用public訪(fǎng)問(wèn)權(quán)限,可以省略。

int MAX_SIZE = 50;
public static final int MAX_SIZE = 50;

普通方法使用public abstract修飾,可以省略。

類(lèi)方法和默認(rèn)方法必須實(shí)現(xiàn)。

默認(rèn)方法必須使用default修飾,該方法不能使用static修飾,默認(rèn)添加public修飾符。需要調(diào)用接口的實(shí)現(xiàn)類(lèi)的實(shí)例來(lái)調(diào)用這些默認(rèn)方法。

類(lèi)方法必須用static修飾,不能使用default修飾,默認(rèn)添加public修飾符。類(lèi)方法可以通過(guò)接口訪(fǎng)問(wèn)。

一個(gè)java源文件離只能有一個(gè)public接口。

public interface Output{
    int MAX_CACHE_LINE = 50;
    void getData();
    void out();
    default void print(String... msgs){
        for (String s : msgs){
            System.out.println(s);
        }
    }
    static String staticTest(){
        return "123";
    }
}

接口支持多繼承。

接口的主要用途:

  • 定義變量,也可用于進(jìn)行類(lèi)型轉(zhuǎn)換
  • 調(diào)用接口中定義的常量
  • 被其他類(lèi)實(shí)現(xiàn)

讓類(lèi)實(shí)現(xiàn)接口需要類(lèi)定義后增加implements部分。一個(gè)類(lèi)可以繼承一個(gè)父類(lèi),并同時(shí)實(shí)現(xiàn)多個(gè)接口,implements部分必須放在extends部分之后。

11、接口和抽象類(lèi)

特征:

  1. 都不能被實(shí)例化,都位于繼承樹(shù)的頂端,用于被其他類(lèi)實(shí)現(xiàn)和繼承。
  2. 都可以包含抽象方法,實(shí)現(xiàn)接口和繼承抽象類(lèi)的普通子類(lèi)都必須實(shí)現(xiàn)這些抽象方法。

區(qū)別:

  1. 接口體現(xiàn)的是一種規(guī)范。對(duì)于接口的實(shí)現(xiàn)者,接口規(guī)定了實(shí)現(xiàn)者必須向外提供哪些服務(wù)。對(duì)于接口的調(diào)用者,接口規(guī)定了調(diào)用者可以調(diào)用哪些服務(wù),以及如何調(diào)用這些服務(wù)。
  2. 抽象類(lèi)體現(xiàn)的是一種模板式設(shè)計(jì)。

用法差異:

  1. 接口只能包含抽象方法,靜態(tài)方法和默認(rèn)方法,不能為普通方法提供方法實(shí)現(xiàn);抽象類(lèi)可以包含普通方法。
  2. 接口里只能定義靜態(tài)變量,不能定義普通成員變量;抽象類(lèi)都可以。
  3. 接口里不包含構(gòu)造器;抽象類(lèi)可以包含構(gòu)造器
  4. 接口里不能包含初始化塊;抽象類(lèi)可以
  5. 一個(gè)類(lèi)最多只能有一個(gè)直接父類(lèi),包括抽象類(lèi);一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,通過(guò)實(shí)現(xiàn)多個(gè)接口可以彌補(bǔ)Java單繼承的不足。

12、內(nèi)部類(lèi)

作用:

  1. 提供了更好的封裝,可以把內(nèi)部類(lèi)隱藏在外部類(lèi)之內(nèi),不允許同一個(gè)包中的其他類(lèi)訪(fǎng)問(wèn)該類(lèi)。
  2. 內(nèi)部類(lèi)可以訪(fǎng)問(wèn)外部類(lèi),但是外部類(lèi)不能訪(fǎng)問(wèn)內(nèi)部類(lèi)的細(xì)節(jié)。
  3. 匿名內(nèi)部類(lèi)適合只使用一次的類(lèi)。

內(nèi)部類(lèi)的區(qū)別:

  1. 比外部類(lèi)多三個(gè)修飾符:private,protected,static
  2. 非靜態(tài)內(nèi)部類(lèi)不能擁有靜態(tài)成員

成員內(nèi)部類(lèi)和局部?jī)?nèi)部類(lèi)

  • 成員內(nèi)部類(lèi)是和成員變量、成員函數(shù)、構(gòu)造器、初始化塊相似的類(lèi)成員,分為靜態(tài)內(nèi)部類(lèi)和非靜態(tài)內(nèi)部類(lèi)
  • 局部?jī)?nèi)部類(lèi)和匿名內(nèi)部類(lèi)不是類(lèi)成員

非靜態(tài)內(nèi)部類(lèi)

靜態(tài)內(nèi)部類(lèi)

靜態(tài)內(nèi)部類(lèi)里面可以有靜態(tài)成員,也可以有非靜態(tài)成員。

接口里的內(nèi)部類(lèi)默認(rèn)使用public static修飾,接口內(nèi)部類(lèi)只能是靜態(tài)內(nèi)部類(lèi)。

使用內(nèi)部類(lèi):

  1. 在外部類(lèi)內(nèi)部使用內(nèi)部類(lèi)
  2. 在外部類(lèi)以外使用非靜態(tài)內(nèi)部類(lèi)
  3. 在外部類(lèi)以外使用靜態(tài)內(nèi)部類(lèi)

使用靜態(tài)內(nèi)部類(lèi)比使用非靜態(tài)內(nèi)部類(lèi)簡(jiǎn)單得多,當(dāng)程序需要時(shí),應(yīng)該優(yōu)先考慮使用靜態(tài)內(nèi)部類(lèi)

局部?jī)?nèi)部類(lèi):定義在方法里面的類(lèi)。

實(shí)際開(kāi)發(fā)中很少定義局部?jī)?nèi)部類(lèi)

匿名內(nèi)部類(lèi):只需使用一次,創(chuàng)建匿名類(lèi)會(huì)立即創(chuàng)建這個(gè)類(lèi)的實(shí)例,類(lèi)定義立即消失。

語(yǔ)法:

new 實(shí)現(xiàn)接口() | 父類(lèi)構(gòu)造器(參數(shù)名稱(chēng)){
    //類(lèi)體
}

匿名內(nèi)部類(lèi)必須繼承一個(gè)父類(lèi)或?qū)崿F(xiàn)一個(gè)接口,最多只能實(shí)現(xiàn)一個(gè)接口或者繼承一個(gè)父類(lèi)

規(guī)則:

  • 匿名內(nèi)部類(lèi)不能是抽象類(lèi)
  • 不能定義構(gòu)造器,但是可以定義初始化塊

最常用的創(chuàng)建匿名類(lèi)的方式是需要?jiǎng)?chuàng)建某個(gè)接口類(lèi)型的對(duì)象。

interface Product{
    double b=5;
    double getPrice();
    String getName();
}

public class Test{
    public void test(Product p){
        System.out.println(p.getName()+p.getPrice());
    }
    public static void main(String[] args) {
        Test t = new Test();
        t.test(new Product(){
            public String getName(){
                return "JAVA:";
            }
            public double getPrice(){
                return b;
            }
        });
    }
}

當(dāng)使用接口創(chuàng)建內(nèi)部類(lèi)時(shí),匿名內(nèi)部類(lèi)不能顯式創(chuàng)建構(gòu)造器,只有一個(gè)隱式的無(wú)參構(gòu)造器,new接口之后的括號(hào)不能傳入?yún)?shù)值。

如果通過(guò)繼承父類(lèi)創(chuàng)建匿名內(nèi)部類(lèi)時(shí),匿名內(nèi)部類(lèi)將擁有和父類(lèi)相似的構(gòu)造器,相似指的是擁有相同的形參列表。


abstract class Device{
    private String name;
    public String getName(){
        return "java";
    }
    public abstract double getPrice();
    public Device(){}
    public Device(String name){
        this.name = name;
    }
}
public class Test{
    public void test(Device d){
        System.out.println(d.getPrice()+d.getName());
    }
    public static void main(String[] args) {
        Test t = new Test();
        t.test(new Device("Java"){
            public double getPrice(){
                return 5;
            }
        });
        Device d = new Device(){
            //初始化塊
            {
                System.out.println("匿名內(nèi)部類(lèi)的初始化塊");
            }
            //實(shí)現(xiàn)抽象方法
            public double getPrice(){
                return 5;
            }
            //重寫(xiě)父類(lèi)方法
            public String getName(){
                return "Java2";
            }
        };
        t.test(d);
    }
}

被局部?jī)?nèi)部類(lèi)、匿名內(nèi)部類(lèi)訪(fǎng)問(wèn)的局部變量必須使用final修飾,Java8更加智能:

如果局部變量被匿名內(nèi)部類(lèi)訪(fǎng)問(wèn),那么該局部變量相當(dāng)于自動(dòng)使用了final修飾符。Java8將這個(gè)功能成為effectively final

interface A {
    public static final int a = 1;
    public abstract void test();
}
public class ATest{
    public static void main(String[] args){
        int age = 10;
        A a = new A(){
            public void test(){
                System.out.println(age);
            }
        };
    }
}

以上的程序中age將會(huì)用final修飾。

13、lambda表達(dá)式

lambda表達(dá)式支持將代碼塊作為方法參數(shù),lambda表達(dá)式允許使用更簡(jiǎn)潔的代碼來(lái)創(chuàng)建只有一個(gè)抽象方法的接口(函數(shù)式接口)的實(shí)例。

主要作用是代替匿名內(nèi)部類(lèi)的繁瑣語(yǔ)法。它由三部分構(gòu)成:

  • 形參列表:只有一個(gè)參數(shù),可以省略括號(hào)
  • 箭頭
  • 代碼塊:只有一條語(yǔ)句,則可以省略花括號(hào),也可以省略return

Lambda表達(dá)式實(shí)際上可以被當(dāng)成“任意類(lèi)型”的對(duì)象,取決于運(yùn)行環(huán)境的需要。

14、lambda表達(dá)式與函數(shù)式接口

Lambda表達(dá)式的目標(biāo)類(lèi)型必須是“函數(shù)式接口”,即只有一個(gè)抽象方法的接口。函數(shù)式接口可以包含多個(gè)默認(rèn)方法,類(lèi)方法,但只能聲明一個(gè)抽象方法。

RunnableActionListener都是函數(shù)式接口。

java8專(zhuān)門(mén)為函數(shù)式接口提供了@FunctionalInterface注解,該注解通常放在接口定義前面,該注解對(duì)程序功能沒(méi)有任何作用,用于告訴編譯器--檢查該接口必須是函數(shù)式接口,否則編譯器會(huì)出錯(cuò)。

//Runnable接口只包含一個(gè)無(wú)參的方法
Runnable r = () -> {
    for(int i=0; i<100; i++){
        System.out.println(i);
    }
};

為了保證lambda表達(dá)式的目標(biāo)類(lèi)型是一個(gè)明確的函數(shù)式接口,可以有如下三種常見(jiàn)方式:

  • 將lambda表達(dá)式賦值給函數(shù)式接口的變量
  • 將lambda表達(dá)式作為函數(shù)式接口類(lèi)型的參數(shù)傳給某個(gè)方法
  • 使用函數(shù)式接口對(duì)lambda表達(dá)式進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
Object obj = (Runnable)()->{
    for (int i=0; i<100; i++){
        System.out.println(i);
    }
};

定義一個(gè)函數(shù)式接口

@FunctionalInterface
interface FkTest{
    void run();
}

java8在java.util.function包下預(yù)定義了大量函數(shù)式接口,典型的有如下4類(lèi):

  • XxxFunction:這類(lèi)接口通常包含一個(gè)apply()抽象方法。用于對(duì)指定數(shù)據(jù)進(jìn)行轉(zhuǎn)換處理。
  • XxxConsumer:通常包含一個(gè)accept()抽象方法。用于對(duì)參數(shù)進(jìn)行處理,但是沒(méi)有返回值。
  • XxxPredicate:通常包含一個(gè)test()抽象方法。用來(lái)對(duì)參數(shù)進(jìn)行某種判斷,判斷是否滿(mǎn)足特定條件,用于進(jìn)行篩濾數(shù)據(jù),返回boolean值。
  • XxxSupplier:通常包含一個(gè)getAsXxx()抽象方法,不需要輸入?yún)?shù),按某種邏輯返回一個(gè)數(shù)據(jù)。

15、方法引用和構(gòu)造器引用

如果lambda表達(dá)式的代碼塊只有一條代碼,還可以在代碼塊中使用方法引用和構(gòu)造器引用。

種類(lèi) 示例 說(shuō)明 對(duì)應(yīng)的lambda表達(dá)式
引用類(lèi)方法 類(lèi)名::類(lèi)方法 函數(shù)式接口中被實(shí)現(xiàn)方法的所有參數(shù)傳遞給該類(lèi)方法作為參數(shù) (a,b..)->類(lèi)名.類(lèi)方法(a,b...)
引用特定對(duì)象的實(shí)例方法 特定對(duì)象::實(shí)例方法 函數(shù)式接口中被實(shí)現(xiàn)方法的所有參數(shù)傳遞給該方法作為參數(shù) (a,b..)->特定對(duì)象.實(shí)例方法(a,b...)
引用某類(lèi)對(duì)象的實(shí)例方法 類(lèi)名::實(shí)例方法 函數(shù)式接口中被實(shí)現(xiàn)方法的第一個(gè)參數(shù)作為調(diào)用者,后面的所有參數(shù)傳遞給該方法作為參數(shù) (a,b..)->a.實(shí)例方法(b...)
引用構(gòu)造器 類(lèi)名::new 函數(shù)式接口中被實(shí)現(xiàn)方法的所有參數(shù)傳給該構(gòu)造器作為參數(shù) (a,b..)->new 類(lèi)名(a,b...)

引用類(lèi)方法

@FunctionalInterface
interface Converter{
    Integer convert(String from);
}
Converter c = from -> Integer.valueOf(from);
Integer val = c.convert("99");
Converter c = Integer::valueOf;

引用特定對(duì)象的實(shí)例方法

Converter c = from -> "fkit.org".indexOf(from);
Integer val = c.convert("it");
Converter c = from -> "fkit.org"::indexOf;

引用某類(lèi)對(duì)象的實(shí)例方法

@FunctionalInterface
interface MyTest{
    String test(String a, int b, int c)
}
Mytest t = (a, b, c) -> a.substring(b,c);
String str = t.test("I love java", 2, 5);
Mytest t = String::substring;

引用構(gòu)造器

@FunctionalInterface
interface MyTest{
    JFrame win(String title);
}
Mytest t = str -> new JFrame(str);
JFrame f = t.win("I love java");
Mytest t = JFrame::new;

16、lambda表達(dá)式與匿名內(nèi)部類(lèi)的聯(lián)系和區(qū)別

相同:

  • 都可以訪(fǎng)問(wèn)effectively final的局部變量,以及外部類(lèi)的成員變量
  • 都可以直接調(diào)用從接口中繼承的默認(rèn)方法

區(qū)別:

  • 匿名內(nèi)部類(lèi)可以為任意接口創(chuàng)建實(shí)例;lambda表達(dá)式只能為函數(shù)式接口創(chuàng)建實(shí)例。
  • 匿名內(nèi)部類(lèi)可以為抽象類(lèi)甚至是普通類(lèi)創(chuàng)建實(shí)例
  • 匿名內(nèi)部類(lèi)實(shí)現(xiàn)的抽象方法體允許調(diào)用接口中定義的默認(rèn)方法;lambda表達(dá)式不允許。

17、枚舉類(lèi)

實(shí)例有限而且固定的類(lèi)

java5新增了一個(gè)enum關(guān)鍵字(與classinterface地位相同),用以定義枚舉類(lèi)。

枚舉類(lèi)與普通類(lèi)的區(qū)別:

  • 枚舉類(lèi)可以實(shí)現(xiàn)一個(gè)或者多個(gè)接口,使用enum定義的枚舉類(lèi)默認(rèn)繼承了java.lang.Enum類(lèi),因此枚舉類(lèi)不能顯示繼承其他父類(lèi)(單繼承)。
  • 使用enum定義、非抽象的枚舉類(lèi)默認(rèn)使用final修飾,不能派生子類(lèi)。
  • 構(gòu)造器只能使用privte訪(fǎng)問(wèn)控制符。
  • 所有實(shí)例必須在枚舉類(lèi)的第一行顯式列出,否則這個(gè)枚舉類(lèi)永遠(yuǎn)不會(huì)產(chǎn)生實(shí)例。系統(tǒng)會(huì)自動(dòng)添加public static final修飾符。

枚舉類(lèi)默認(rèn)提供了values方法,可以遍歷所有的枚舉值。

public enum SeasonEnum{
    SPRING, SUMMER, FALL, WINTER;
}

這些枚舉值代表了枚舉類(lèi)所有可能的實(shí)例。

public class EnumTest{
    public void judge(SeasonEnum s){
        switch (s){
            case SPRING:
                System.out.println("Spring");
                break;
            case SUMMER:
                System.out.println("Summer");
                break;
            case FALL:
                System.out.println("Fall");
                break;
            case WINTER:
                System.out.println("WINTER");
                break;
            default:
                System.out.println("Not exist");
        }
    }
    public static void main(String[] args) {
        for(SeasonEnum s: SeasonEnum.values()){
            System.out.println(s);
        }
        new EnumTest().judge(SeasonEnum.SPRING);
    }
}

java.lang.Enum默認(rèn)提供以下方法:

  1. int compareTo(E o)

用于指定枚舉對(duì)象比較順序

  1. String name()

返回枚舉實(shí)例的名稱(chēng),應(yīng)該盡可能使用toString()方法

  1. int ordinal()

返回枚舉值在枚舉類(lèi)中的索引值(從0開(kāi)始)。

  1. String toString()

返回枚舉常量的名稱(chēng)

  1. public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)

返回指定枚舉類(lèi)中指定名稱(chēng)的枚舉值。

18、枚舉類(lèi)的成員變量、方法和構(gòu)造器

枚舉類(lèi)通常應(yīng)該設(shè)計(jì)成不可變的,建議將枚舉類(lèi)的成員變量用private final修飾。

必須在構(gòu)造器里為這些成員變量指定初始值(也可以在初始化塊或者定義成員變量時(shí)指定,但是不常用)。

public enum Gender{
    MALE("男"), FEMALE("女");
    private final String name;
    private Gender(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

MALE("男")相當(dāng)于public static fianl Gender MALE = new Gender("男")

19、枚舉類(lèi)實(shí)現(xiàn)接口

public interface GenderDesc{
    public abstract void info();
}
public enum Gender implements GenderDesc{
    MALE("男"){
        public void info(){
            //sth
        }
    },
    FEMALE("女") {
        public void info(){
            //sth else
        }
    }
}
//constructor and instance method

這種情況下,創(chuàng)建MALEFEMALE枚舉值時(shí),并不是直接創(chuàng)建Gender枚舉類(lèi)的實(shí)例,而是相當(dāng)于創(chuàng)建Gender的匿名子類(lèi)的實(shí)例。


并不是所有的枚舉類(lèi)都使用了final修飾,非抽象類(lèi)的枚舉類(lèi)才使用final修飾。


枚舉類(lèi)里定義抽象方法時(shí)不能使用abstract修飾枚舉類(lèi)(系統(tǒng)自動(dòng)添加),但是由于枚舉類(lèi)需要顯式創(chuàng)建枚舉值,而不是作為父類(lèi),因此定義每個(gè)枚舉值時(shí)都要為抽象方法提供實(shí)現(xiàn),否則講出現(xiàn)編譯出錯(cuò)。

20、修飾符的適用范圍

修飾符適用范圍
修飾符適用范圍

strictfp即(FP-strict),精確浮點(diǎn)的意思。一旦使用該關(guān)鍵字修飾類(lèi)、接口或者方法,所修飾范圍內(nèi)java的編譯器和運(yùn)行環(huán)境會(huì)完全依照浮點(diǎn)規(guī)范IEEE-754來(lái)執(zhí)行。


native關(guān)鍵字用來(lái)修飾一個(gè)方法,用該關(guān)鍵字修飾的方法類(lèi)似于抽象方法。不同點(diǎn)在于native方法通常采用c實(shí)現(xiàn)。如果某個(gè)方法需要利用平臺(tái)相關(guān)特性或者訪(fǎng)問(wèn)硬件等可以用該關(guān)鍵字。一旦使用則改程序失去跨平臺(tái)的特性。


4個(gè)訪(fǎng)問(wèn)控制符是互斥的,最多只能出現(xiàn)一個(gè)。abstract和final不能同時(shí)使用;abstract和static不能同時(shí)修飾方法,可以同時(shí)修飾內(nèi)部類(lèi);abstract和private不能同時(shí)修飾方法,可以同時(shí)修飾內(nèi)部類(lèi);private和final同時(shí)修飾方法可以同時(shí)修飾方法,但是沒(méi)有意義(private不能被繼承)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容