国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java5-8新特性的理解

Jinkey / 607人閱讀

摘要:引用特定類型的方法特定類普通方法引用構(gòu)造方法類名稱引用構(gòu)造方法內(nèi)建函數(shù)式接口方法引用操作可能出現(xiàn)的函數(shù)式接口有四類有參數(shù)有返回值有參數(shù)無(wú)返回值無(wú)參數(shù)有返回值判斷真假。

可變參數(shù)

在java程序中調(diào)用方法時(shí),必須嚴(yán)格按照方法定義的變量進(jìn)行參數(shù)傳遞。但是在開(kāi)發(fā)過(guò)程中可能會(huì)出現(xiàn)一種情況:不確定要傳遞的參數(shù)個(gè)數(shù)。解決這個(gè)問(wèn)題的思路是將多個(gè)參數(shù)封裝為數(shù)組。這是一個(gè)打折扣的方法,因?yàn)閿?shù)組并不代表任意多個(gè)數(shù)據(jù)。

在JDK1.5中,引入了可變參數(shù)的概念。可變參數(shù)的語(yǔ)法形式為:

[public/protected/private] [static/final/abstract] 返回值類型 func(參數(shù)類型 ... 變量){
    [return [返回值] ;]
} 

參數(shù)變量傳遞到方法中,以指定類型的數(shù)組進(jìn)行保存。

public class varargs{
    public static void main(String args[]){
        System.out.println(add(1,2,3));
        System.out.println(add(10,20));
    }
    public static int add(int ... data){
        int sum = 0;
        for(int i = 0; i < data.length; i++){
            sum += data[i];
        }
        return sum;
    }
}
foreach循環(huán)

java中的foreach語(yǔ)句是一種加強(qiáng)型for循環(huán)操作。for循環(huán)的輸出方式需要控制索引,過(guò)于麻煩。因此,在JDK1.5中引入foreach形式。

for(數(shù)據(jù)類型 變量:數(shù)組/集合){
    //每一次循環(huán),會(huì)將數(shù)組內(nèi)容賦值個(gè)變量
}

每次循環(huán)自動(dòng)將數(shù)組或集合的內(nèi)容取出,避免了索引問(wèn)題。

public class foreach{
    public static void main(String args[]){
        int data[] = new int[]{1,2,3,4,5};
        for(int x : data){
            System.out.println(x + " ");
        }
    }
靜態(tài)導(dǎo)入

如果一個(gè)類中的方法全部屬于static型方法,其他類在引用此類時(shí),必須先使用import導(dǎo)入所需要的包。然后使用“類名.方法()”進(jìn)行調(diào)用。
如果在調(diào)用這些方法時(shí)不希望出現(xiàn)類的名稱,JDK1.5引入靜態(tài)導(dǎo)入功能。

import static 包.類.*;
package com.qi.demo;
public class myMath{
    public static int div(int x, int y) throws Exception{
        System.out.println("===start===");
        int result = 0;
        try{
            result = x / y;
        }catch(Exception e){
            throw e;
        }finally{
            System.out.println("===end===");
        }
        return result;
    }
    public static int add(int x, int y){
        return x + y;
    }
}
import static com.qi.demo.myMath.*;
public class static_import{
    public static void main(String args[]){
        System.out.println("Add operation:" + add(10,20));
        try{
            System.out.println("divide operation: " + div(10,2));
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }
}

靜態(tài)導(dǎo)入可以減少代碼量,但是過(guò)多的靜態(tài)導(dǎo)入會(huì)降低代碼的可讀性。

泛型

JDk5提供泛型技術(shù)。類屬性或方法的參數(shù)在定義數(shù)據(jù)類型時(shí),可以直接使用一個(gè)標(biāo)記進(jìn)行占位,再具體使用時(shí)才設(shè)置其對(duì)應(yīng)的實(shí)際數(shù)據(jù)類型。這樣當(dāng)設(shè)置的數(shù)據(jù)類型出現(xiàn)錯(cuò)誤后,就可以在程序編譯時(shí)檢測(cè)出來(lái)。使用泛型時(shí),能夠采用的類型只能是類,也就是說(shuō)不能是基本類型,只能是引用類型。例如泛型采用整型,應(yīng)用Integer,而不是int。

class Point{
    private T x;
    private T y;
    public void setX(T x){
        this.x = x;
    }
    public void setY(T y){
        this.y = y;
    }
    public T getX(){
        return x;
    }
    public T getY(){
        return y;
    }
}
public class generic{
    public static void main(String args[]){
        Point p = new Point<>();
        p.setX(10);
        p.setY(20);
        Integer x = p.getX();
        Integer y = p.getY();
        System.out.println("coordinate x: " + x + " y: " +y);
    }
}
通配符

對(duì)于同一類,由于設(shè)置泛型類型不同,其對(duì)象表示的含義也不同,因此不能夠直接進(jìn)行引用操作。例如通過(guò)泛型定義Message,Message和Message雖然都是Message類的對(duì)象,但這兩個(gè)對(duì)象不能夠直接進(jìn)行引用傳遞操作。通過(guò)使用通配符“?”解決參數(shù)傳遞問(wèn)題。通配符可以接受類對(duì)象,但是不能修改對(duì)象屬性。

class Message{
    private T msg;
    public void setMsg(T msg){
        this.msg = msg;
    }
    public T getMsg(){
        return msg;
    }
}
public class generic_wildcard{
    public static void main(String args[]){
        Message m1 = new Message<>();
        Message m2 = new Message<>();
        m1.setMsg(100);
        m2.setMsg("hello");
        fun(m1);
        fun(m2);
    }
    public static void fun(Message temp){
        System.out.println(temp.getMsg());
    }
}

在“?”通配符的基礎(chǔ)上還有兩個(gè)子通配符。

? extends 類

設(shè)置泛型上限,在聲明和方法中使用。表示可以設(shè)置該類或其子類。

? super 類

設(shè)置泛型下限,在方法中使用。表示只能設(shè)置該類或其父類。

泛型接口

泛型可以定義在接口上。使用接口必須定義相應(yīng)子類。對(duì)于使用泛型的接口,有兩種實(shí)現(xiàn)方式。一是在子類繼續(xù)設(shè)置泛型標(biāo)記。二是在子類中為父類接口明確定義一個(gè)泛型類型。

泛型方法

泛型也可以在方法中定義。在方法中定義泛型時(shí),方法不一定要在泛型類中定義,但要在方法返回值類型前明確定義泛型類型。

Annotation

JDK1.5提出并應(yīng)用了注解技術(shù)。在java SE中,最常見(jiàn)的Annotation是:

@Override

準(zhǔn)確覆寫(xiě)操作。保證子類覆寫(xiě)的方法是父類中定義過(guò)的方法。當(dāng)覆寫(xiě)方法出現(xiàn)錯(cuò)誤時(shí),可以在編譯時(shí)檢查出來(lái)。

@Deprecated

聲明過(guò)期操作。用于聲明過(guò)期不建議使用的方法。

@SuppressWarnings

壓制警告。開(kāi)發(fā)者明確知道會(huì)出現(xiàn)警告信息卻執(zhí)意按照固定方式處理,可以使用@SuppressWarnings壓制出現(xiàn)的警告信息。

class Book{
    private T title;
    public void setTitle(T title){
        this.title = title;
    }
    public T getTitle(){
        return title;
    }
}
public class annotation_suppresswarnings{
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static void main(String args[]){
        Book book = new Book();
        book.setTitle("hello");
        System.out.println(book.getTitle());
    }
}
接口定義加強(qiáng)

JDK1.8開(kāi)始,接口中可以定義普通方法與靜態(tài)方法。java增加這個(gè)特性原因如下。隨著接口的子類越來(lái)越多,如果這個(gè)接口功能不足,需要增加新的方法,則需要對(duì)所有接口子類覆寫(xiě)新增加的方法。這個(gè)設(shè)計(jì)的工作量是重復(fù)的且是巨大的,因此通過(guò)放寬接口定義,接口可以定義普通方法和靜態(tài)方法,接口的方法擴(kuò)充問(wèn)題就能得到很好的解決。
在接口中定義普通方法,該方法必須使用default來(lái)進(jìn)行定義。使用default定義的普通方法,需要利用實(shí)例化對(duì)象明確調(diào)用。在接口中定義靜態(tài)方法,該方法可以由接口名稱直接調(diào)用。

lambda表達(dá)式

JDK1.8中引入lambda表達(dá)式。lambda表達(dá)式是應(yīng)用在單一抽象方法接口環(huán)境下的一種簡(jiǎn)化定義形式,解決匿名內(nèi)部類定義復(fù)雜問(wèn)題。單一抽象方法接口使用@FunctionalInterface注解,表示此為函數(shù)式接口,里面只允許定義一個(gè)抽象方法。lambda表達(dá)式有三種形式。

(params) -> expression
(params) -> statement
(params) -> {statements}
@FunctionalInterface
interface IMessage{
    public int add(int ... args);
    static int sum(int ... args){
        int sum = 0;
        for(int temp:args){
            sum += temp;
        }
        return sum;
    }
}
public class lambda{
    public static void main(String args[]){
        //()內(nèi)是參數(shù),->后是子類覆寫(xiě)抽象方法的方法體
        fun((int ... param) -> IMessage.sum(param));
    }
    public static void fun(IMessage msg){
        System.out.println(msg.add(10,20,30));
    }
}
方法引用

JDK1.8支持方法的引用操作,相當(dāng)于為方法定義別名。java8定義了四種方法引用操作形式。

引用靜態(tài)方法

類名稱::static方法名稱

interface Imessage{
    public R change(P p);
}
public class method_reference_static{
    public static void main(String args[]){
        //將String.valueOf()方法變?yōu)镮Message接口的change()方法
        //valueOf()方法接收int型數(shù)據(jù),返回String型數(shù)據(jù)
        Imessage msg = String::valueOf;
        String str = msg.change(1000);
        System.out.println(str.replaceAll("0","9"));
    }
}

引用某個(gè)對(duì)象的方法

實(shí)例化對(duì)象::普通方法

@FunctionalInterface
interface IMessage{
    public R upper();
}
public class method_reference_common{
    public static void main(String args[]){
        //String類的toUpperCase()定義:public String toUpperCase()。
        //該方法沒(méi)有參數(shù),有返回值。
        IMessage msg = "hello"::toUpperCase;
        String str = msg.upper();
        System.out.println(str);
    }
}

引用特定類型的方法

特定類::普通方法

@FunctionalInterface
interface IMessage

{ public int compare(P p1, P p2); } public class method_reference_special{ public static void main(String args[]){ IMessage msg = String::compareTo; System.out.println(msg.compare("A","B")); } }

引用構(gòu)造方法

類名稱::new

@FunctionalInterface
interface IMessage{
    public C create(String t, double p);
}
class Book{
    private String title;
    private double price;
    public Book(String title, double price){
        this.title = title;
        this.price = price;
    }
    @Override
    public String toString(){
        return "book: " + this.title + ", price: " + this.price;
    }
}
public class metheod_reference_constructor{
    public static void main(String args[]){
        IMessage msg = Book::new; //引用構(gòu)造方法
        Book book = msg.create("JAVA", 100);
        System.out.println(book);
    }
}
內(nèi)建函數(shù)式接口

方法引用操作可能出現(xiàn)的函數(shù)式接口有四類:有參數(shù)有返回值、有參數(shù)無(wú)返回值、無(wú)參數(shù)有返回值、判斷真假。JDK1.8提供了一個(gè)新的開(kāi)發(fā)包:

java.util.function

該開(kāi)發(fā)包提供四個(gè)核心函數(shù)式接口,簡(jiǎn)化開(kāi)發(fā)者的定義,實(shí)現(xiàn)操作的統(tǒng)一。
1、功能型接口

@FunctionalInterface
public interface Function{
    public R apply(T t); //接收**一個(gè)**參數(shù),并返回一個(gè)處理結(jié)果
}
import java.util.function.Function;
public class funcifc_function{
    public static void main(String args[]){
        Function fun = "##hello"::startsWith; //利用對(duì)象調(diào)用startsWith()
        System.out.println(fun.apply("##"));
    }
}

注意引用的方法只能有一個(gè)輸入和一個(gè)返回結(jié)果。否則,引用方法不能與apply()匹配。
2、消費(fèi)型接口

@FunctionalInterface
public interface Comsumer{
    public void accept(T t); //只接收數(shù)據(jù),不返回結(jié)果
}
import java.util.function.Consumer;
public class funcifc_consumer{
    public static void main(String[] args){
        Consumer cons = System.out::print;
        cons.accept("hello world");
    }
}

3、供給型接口

@FunctionalInterface
public interface Supplier{
    public T get(); //不接收數(shù)據(jù),只返回結(jié)果   
}
import java.util.function.Supplier;
public class funcifc_supplier{
    public static void main(String args[]){
        Supplier sup = "hello"::toUpperCase;
        System.out.println(sup.get());
    }
}

4、斷言型接口

@FunctionalInterface
public intereface Predicate{
    public boolean test(T t); //判斷
}
import java.util.function.Predicate;
public class funcifc_predicate{
    public static void main(String args[]){
        Predicate pre = "hello"::equalsIgnoreCase;
        System.out.println(pre.test("HELLO"));
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76937.html

相關(guān)文章

  • 讀《javaScript高級(jí)程序設(shè)計(jì)-第6章》之理解對(duì)象

    摘要:把對(duì)象定義為無(wú)序?qū)傩缘募希鋵傩钥梢园局祵?duì)象或函數(shù)。接受兩個(gè)參數(shù)屬性所在的對(duì)象和要讀取其特性的屬性名返回的時(shí)其特性的對(duì)象例如讀高級(jí)程序設(shè)計(jì)這本書(shū)的第章面向?qū)ο蟮某绦蛟O(shè)計(jì),我做了篇筆記。這是第一篇,后面還有兩篇,分別是封裝類和繼承。 ECMA-262把對(duì)象定義為:無(wú)序?qū)傩缘募希鋵傩钥梢园局怠?duì)象或函數(shù)。所以,我們可以理解對(duì)象就是名值對(duì)的集合,名就是對(duì)象的每個(gè)屬性的名字,...

    KoreyLee 評(píng)論0 收藏0
  • Javascript面向?qū)ο?em>的程序設(shè)計(jì)_理解對(duì)象

    摘要:面向?qū)ο蟮某绦蛟O(shè)計(jì)理解對(duì)象前言最近在細(xì)讀高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書(shū)中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。總結(jié)如果英語(yǔ)水平足夠好的話,建議看英文原版書(shū)籍或者國(guó)外大師的博客。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)_理解對(duì)象 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書(shū)中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。 如有紕漏或錯(cuò)誤,會(huì)非...

    劉厚水 評(píng)論0 收藏0
  • 理解Object.defineProperty作用

    摘要:對(duì)象是由多個(gè)名值對(duì)組成的無(wú)序的集合。對(duì)象中每個(gè)屬性對(duì)應(yīng)任意類型的值。目標(biāo)屬性所擁有的特性返回值傳入函數(shù)的對(duì)象。給對(duì)象的屬性添加特性描述,目前提供兩種形式數(shù)據(jù)描述和存取器描述。兼容性在下只能在對(duì)象上使用,嘗試在原生的對(duì)象使用會(huì)報(bào)錯(cuò)。 對(duì)象是由多個(gè)名/值對(duì)組成的無(wú)序的集合。對(duì)象中每個(gè)屬性對(duì)應(yīng)任意類型的值。定義對(duì)象可以使用構(gòu)造函數(shù)或字面量的形式: var obj = new Object; ...

    yexiaobai 評(píng)論0 收藏0
  • 尋找一種易于理解一致性算法(擴(kuò)展版)

    摘要:摘要是一種為了管理復(fù)制日志的一致性算法。接下來(lái),這篇論文會(huì)介紹以下內(nèi)容復(fù)制狀態(tài)機(jī)問(wèn)題第節(jié),討論的優(yōu)點(diǎn)和缺點(diǎn)第節(jié),討論我們?yōu)榱丝衫斫庑远扇〉姆椒ǖ诠?jié),闡述一致性算法第節(jié),評(píng)價(jià)算法第節(jié),以及一些相關(guān)的工作第節(jié)。 摘要 Raft 是一種為了管理復(fù)制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法結(jié)構(gòu)和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易...

    FuisonDesign 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<