一、面向?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ì)。
static和abstract不能同時(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)
特征:
- 都不能被實(shí)例化,都位于繼承樹(shù)的頂端,用于被其他類(lèi)實(shí)現(xiàn)和繼承。
- 都可以包含抽象方法,實(shí)現(xiàn)接口和繼承抽象類(lèi)的普通子類(lèi)都必須實(shí)現(xiàn)這些抽象方法。
區(qū)別:
- 接口體現(xiàn)的是一種規(guī)范。對(duì)于接口的實(shí)現(xiàn)者,接口規(guī)定了實(shí)現(xiàn)者必須向外提供哪些服務(wù)。對(duì)于接口的調(diào)用者,接口規(guī)定了調(diào)用者可以調(diào)用哪些服務(wù),以及如何調(diào)用這些服務(wù)。
- 抽象類(lèi)體現(xiàn)的是一種模板式設(shè)計(jì)。
用法差異:
- 接口只能包含抽象方法,靜態(tài)方法和默認(rèn)方法,不能為普通方法提供方法實(shí)現(xiàn);抽象類(lèi)可以包含普通方法。
- 接口里只能定義靜態(tài)變量,不能定義普通成員變量;抽象類(lèi)都可以。
- 接口里不包含構(gòu)造器;抽象類(lèi)可以包含構(gòu)造器
- 接口里不能包含初始化塊;抽象類(lèi)可以
- 一個(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)
作用:
- 提供了更好的封裝,可以把內(nèi)部類(lèi)隱藏在外部類(lèi)之內(nèi),不允許同一個(gè)包中的其他類(lèi)訪(fǎng)問(wèn)該類(lèi)。
- 內(nèi)部類(lèi)可以訪(fǎng)問(wèn)外部類(lèi),但是外部類(lèi)不能訪(fǎng)問(wèn)內(nèi)部類(lèi)的細(xì)節(jié)。
- 匿名內(nèi)部類(lèi)適合只使用一次的類(lèi)。
內(nèi)部類(lèi)的區(qū)別:
- 比外部類(lèi)多三個(gè)修飾符:private,protected,static
- 非靜態(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):
- 在外部類(lèi)內(nèi)部使用內(nèi)部類(lèi)
- 在外部類(lèi)以外使用非靜態(tà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)簡(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è)抽象方法。
Runnable和ActionListener都是函數(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)鍵字(與class和interface地位相同),用以定義枚舉類(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)提供以下方法:
int compareTo(E o)
用于指定枚舉對(duì)象比較順序
String name()
返回枚舉實(shí)例的名稱(chēng),應(yīng)該盡可能使用
toString()方法
int ordinal()
返回枚舉值在枚舉類(lèi)中的索引值(從0開(kāi)始)。
String toString()
返回枚舉常量的名稱(chēng)
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)建
MALE和FEMALE枚舉值時(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不能被繼承)。