1. 程式人生 > >JAVA高階語言隨著JDK升級新增特性

JAVA高階語言隨著JDK升級新增特性

JAVA語言是使用率比較高的一種程式語言,有一些隨著JDK升級,後來增加的重要的特性需要記錄下來,便於學習和使用。

1、可變引數使用

對於一個方法中的引數,一般情況下是固定的格式,但是JDK1.5之後,JAVA語言引入了可變引數,基本語法就是:(型別 ... 引數),如下面程式碼所示:

/**
 * Copyright (C), 2015-2018, XXX有限公司
 * FileName: ChangedParameter
 * Author:   gysh
 * Date:     2018/11/19 15:12
 * Description: 可變引數的演示
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改時間           版本號              描述
 */

/**
 * 〈一句話功能簡述〉<br> 
 * 〈可變引數的演示〉
 *
 * @author gysh
 * @create 2018/11/19
 * @since 1.0.0
 */
public class ChangedParameter {
    public static void main(String[] args) {
      test(1,2,3,4,5,6,7);
      test(3,4,5,6,7);
    }

    public static  void test(int ... data){
        int sum = 0;
       /* for (int i = 0; i <data.length ; i++) {
            sum += data[i];
        }*/
        for (int i : data
        ){
            sum += i;
        }
        
        System.out.println(sum);
    }
}

2、foreach用法

foreach的語法結構如下:

for(型別 變數:陣列或集合){

}如下 程式碼:

    public static  void test(int ... data){
        int sum = 0;
       /* for (int i = 0; i <data.length ; i++) {
            sum += data[i];
        }*/
        for (int i : data
        ){
            sum += i;
        }

        System.out.println(sum);
    }

3、靜態匯入(方法)

一般情況下我們對於靜態方法的呼叫都是通過類名.方法的形式去操作,IDE會自動匯入對就的jar包,但是,在jdk 1.5之後,可以直接匯入方法,並在程式中直接使用,建議這種方法最好不用(程式可讀性變差),如下程式碼:

/**
 * Copyright (C), 2015-2018, XXX有限公司
 * FileName: StaticTest
 * Author:   gysh
 * Date:     2018/11/19 15:59
 * Description: 靜態匯入方法的使用
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改時間           版本號              描述
 */

/**
 * 〈一句話功能簡述〉<br> 
 * 〈靜態匯入方法的使用〉
 *
 * @author gysh
 * @create 2018/11/19
 * @since 1.0.0
 */
import  static java.lang.Math.*;
public class StaticTest {
   /* public static void main(String[] args) {
//        System.out.println(Math.subtractExact(20,18));
        sy
    }*/

    public static void main(String[] args) {
        System.out.println(subtractExact(20,18));

    }
}

4、泛型技術使用

在jdk 1.5之後開始增加了泛型技術,泛型技術的核心意義在於:類在定義的時候,通過一個識別符號,此識別符號可以標記類中屬性或者方法引數的資料型別,在使用的時候,系統能夠動態的設定型別,如下 程式碼:

public class XYPoint <T>{//T也可以換成其它標記都可以
    private T x;
    private T y;

    public T getX() {
        return x;
    }

    public void setX(T x) {
        this.x = x;
    }

    public T getY() {
        return y;
    }

    public void setY(T y) {
        this.y = y;
    }
}

如何使用,程式碼如下:

public class XYPointTest {
    public static void main(String[] args) {
        XYPoint<String> xy = new XYPoint();
        xy.setX("wq");
        xy.setY("wq");
        System.out.println(xy.getX()+xy.getY());
    }
}

注意:

1、泛型最好設定型別,如果不設定的情況下,系統會預設使用Object類,同時在編譯的時候會有警告

2、泛型中的型別設定都要是類,基本資料型別不可以,對於整形能用:Integer等

4.1、泛型萬用字元:?,對於?萬用字元基礎之上還有兩個子萬用字元:

  •     ?extends 類:設定泛型上限,可以在宣告上和方法引數上使用,比如:?extends Number:意味著萬用字元代表Number類以及它的子類:Integer、Long等

  • ? super 類:設定泛型的下限,方法引數上使用,比如:? Super:String :意味著只能設定String以及它的父類:Object

4.2、介面泛型的實用

對於JAVA的介面中的方法都是Public許可權!!

如果介面是泛型介面,對於子類來實現介面有兩種形式:

1、在子類中直接使用泛型

2、在子類中不設定泛型,而是在介面中明確一個型別

對於上面兩種實現,請看下面程式碼:



import java.awt.image.ImageConsumer;

/**
 * 〈一句話功能簡述〉<br> 
 * 〈泛型介面使用測試〉
 *
 * @author gysh
 * @create 2018/11/19
 * @since 1.0.0
 */
interface IMessage<T>{
    public void print(T s);

}

/**
 * 對於介面泛型子類的實現形式:在子類中定義泛型的型別(這個是經常使用的)
 */
class Message implements IMessage<String>{
    @Override
    public void print(String s) {
        System.out.println(s);
    }
}

/**
 * 對於介面泛型子類的實現形式:在子類中直接設定泛型
 * @param <T>
 */
class MessageImpl<T> implements IMessage<T>{
    @Override
    public void print(T s) {
        System.out.println(s.toString());
    }
}
public class GenericTypeTest {
    public static void main(String[] args) {
        IMessage im = new Message();
        im.print("你好!!");
        IMessage im2 = new MessageImpl();
        im2.print("wq");
    }
}

4.3 泛型方法使用

泛型方法就是在方法的返回值和引數上面增加泛型,這樣的方法就是泛型方法,如下程式碼:

/**
 * 〈一句話功能簡述〉<br> 
 * 〈泛型方法使用測試〉
 *
 * @author gysh
 * @create 2018/11/19
 * @since 1.0.0
 */
public class GenericMethodTest {
    public static void main(String[] args) {
    print("你好!中國");
    }
    public static <T> T print(T m){
        System.out.println(m);
        return m;
    }
}

泛型技術總結:

1、泛型技術主要解決的是向下轉型所帶來的隱患,其核心就是在宣告類或介面的時候,不設定引數或者屬性的型別,而是動態的執行型別。

2、“?”可以接受任意型別的泛型,只能夠取出,不能進行修改。

5、Annotation使用

Annotation技術,是JAVA在JDK1.5之後,變化比較大的一項,就是利用註解的形式來實現程式的不同功能的實現。並且支援自定義Annotation的開發,還提供了三個常用的註解:@Override、@Deprecated、@SuppressWarnings。

  • @Overide是方法覆寫,就是繼承或者實現類和介面的時候,一般會重寫對應的方法。
  • @Deprecated 是宣告過期操作,宣告對應的方法是過期的
  • @SuppressWarnings是用來壓制警告

6、介面方法的增強

對於JAVA 1.8之後,在介面中增加了普通方法,對於原先介面中只有全域性變數和抽象方法的定義進行了調整,不過我們會一直認為所謂的介面只有全域性變數和抽象方法,至於在介面中增加普通方法和靜態方法的目的是方便在於介面被成千上萬的類實現之後,增加一個方法,如下面程式碼所示:

interface IMessage1{
    public void print();
    default void  fun(){
        System.out.println("增加的普通方法!");
    }
    static void get(){
        System.out.println("介面中增加靜態方法!!");
    }
}
class MessageImpl1 implements IMessage1{

    public void print() {
        System.out.println("正常方法!");
    }
}
public class InterfaceTest {
    public static void main(String[] args) {
        IMessage1 im = new MessageImpl1();
        im.print();
        im.fun();
        IMessage1.get();
    }
}

7、Lamda表示式

lamda表示式其實就是代替JAVA中的匿名類的操作(匿名類是在抽象類和介面上發展起來的),比較簡單語法如下:

  • (引數)->單行語句;
  • (引數)->{單行語句};
  • (引數)->表示式
interface IMessage2{
    public void print();
}

public class LamdaClass {
    public static void main(String[] args) {
        //內部匿名類的使用
     printTest(new IMessage2() {
         @Override
         public void print() {
             System.out.println("內部匿名類的使用!!");
         }
     });
     //Lamda表示式的使用
     printTest(()-> System.out.println("Lamda表示式的使用!!"));
    }
    public static void printTest(IMessage2 message){
        message.print();
    }
}

Lamda表達是用來避免匿名內部類中過多無用的東西。

8、方法引用

在JAVA 8之中,方法一共有四種形式:

  • 引用靜態方法:類名稱 :: static 方法名稱;
  • 引用某個物件的方法:例項化物件::普通方法;
  • 引用特定型別的方法:特定類::普通方法;
  • 引用構造方法:類名稱::new.

引用靜態方法,用String中的valueOf方法:public static String valueOf(int x);通過引用實現如下:

interface IMessage4<P,R>{
    public R zhuanHuan(P p);
}
public class QuotoTest {
    public static void main(String[] args) {
        IMessage4<Integer,String> msg = String ::valueOf;
        //msg.zhuanHuan(2000);
        System.out.println(msg.zhuanHuan(30000));
    }
}

引用某個物件的方法:

interface IMessage4<R>{
    public R upper();
}
public class QuotoTest {
    public static void main(String[] args) {
        IMessage4<String> msg = "hello" ::toUpperCase;
        //msg.zhuanHuan(2000);
        System.out.println(msg.upper());
    }
}

說明:對於引用方法中的介面必須定義 一個方法,如果有兩個方法就會報錯,為了防止有兩個方法,可以直接加上一個註解:

@FunctionalInterface 這個表明是一個函式式的介面,只能有一個方法

特定型別的引用:採用String的compareTo方法,如下程式碼:

@FunctionalInterface
interface IMessage4<P>{
    public int compare(P p1,P p2);
}
public class QuotoTest {
    public static void main(String[] args) {
        IMessage4<String> msg = String ::compareTo;
        //msg.zhuanHuan(2000);
        System.out.println(msg.compare("A","B"));
    }
}

構造方法引用:如下程式碼:

interface IMessage4<C>{
    public C create(String st1,double d);
}
class Book{
    private String titel;
    private double price;
    public Book(String titel,double price){
    this.titel =titel;
    this.price = price;
    }

    public String getTitel() {
        return titel;
    }

    public void setTitel(String titel) {
        this.titel = titel;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "本書的書名是:"+this.titel+"-----本書的價格是:"+this.price;
    }
}
public class QuotoTest {
    public static void main(String[] args) {
        IMessage4<Book> msg = Book :: new;

        System.out.println(msg.create("A",23.2));
    }
}

對於上面的方法引用都是JDK 1.8版本之上才能使用,一般情況下我們看別人的程式碼的時候只要能看的懂,不需要刻意去使用它。

9、內建函式式介面

JDK 1.8之後,產生了內建函式式介面,一共有四種介面,分別是:

功能性介面(Function):public interface Function<T,R>{public R apply(T t );}程式碼如下:

消費性介面(Consumer): public interface Consumer<T> {public void accept(T t);}

供給性介面(Supplier):public interface Supplier<T> {public T get();}

斷言型介面:就是判斷的使用:

總結說明:這些介面都包含所有可能出現的方法引用。

相關推薦

JAVA高階語言隨著JDK升級新增特性

JAVA語言是使用率比較高的一種程式語言,有一些隨著JDK升級,後來增加的重要的特性需要記錄下來,便於學習和使用。 1、可變引數使用 對於一個方法中的引數,一般情況下是固定的格式,但是JDK1.5之後,JAVA語言引入了可變引數,基本語法就是:(型別 ... 引數),如下

java語言的11個關鍵特性

webserver 結合 解釋執行 是把 做的 自己 不同 個性 類繼承 (1)easy:java的語法比c++的相對簡單,另一個方面就是java能使軟件在很小的機器上運行,基礎解釋其和類庫的支持的大小約為40kb,增加基本的標準庫和線程支持的內存需要增加125kb。 (2

Java高階特性—鎖

1).synchronized   加同步格式:     synchronized( 需要一個任意的物件(鎖) ){       程式碼塊中放操作共享資料的程式碼。     }   synchronized的缺陷    synchronized是java中的一個關鍵字,也就是說是Java語言內建的特性。   

Java高階特性—反射和動態代理

1).反射   通過反射的方式可以獲取class物件中的屬性、方法、建構函式等,一下是例項: 2).動態代理   使用場景:       在之前的程式碼呼叫階段,我們用action呼叫service的方法實現業務即可。     由於之前在service中實現的業務可能不能夠滿足當先客戶的要求,需要我們重

(Java)jdk-8 - 新特性 - 介面

介面: Java 8允許我們給介面新增一個非抽象的方法實現,只需要使用default關鍵字即可,這個又叫做擴充套件方法 注意:現在介面還可以【存在靜態方法】,可以使用 介面名.靜態方法名 的形式直接呼叫。 例子: public class Test{ public static

java高階特性 (繼承)

繼承   繼承是面向物件的三大特徵之一,也是實現軟體複用的一個手段。java的繼承具有單繼承的特點(簡單理解一個兒子只能有一個爸爸),每個子類只有一個直接父類,但是一類可以有多個子類(除final型別的類)。      繼承的特點:     java的繼承通過extends 關鍵字來實現,實現繼承的類

JAVA高階特性--內部類

內部類概念 public class Outer{ class inner{ } }  特點     可以很好的實現隱藏,可以使用procted,private       可以直接訪問外部類的所有成員 ,包括私有成員.     外部內不

JAVA高階特性--自動拆箱-裝箱,列舉型別

基本資料型別轉換為引用型別物件 一個自動裝箱的例子 Integer i=10; 相當於 Integer i=new Integer(10);   一個自動拆箱的例子 Integer m=10; int n=m; 相當於n=m.intValue();  

JAVA高階特性--String/StringBuffer/Builder

String  String物件一旦建立就不能改變 是常量 需要進行大量字串操作應採用StringBuffer/StringBuilder  最終結果轉換成String物件 StringBuffer 執行緒安全的  可變字元序列 一個類似於String的字串緩衝區(字元

Java EE平臺新增特性

java 7  新技術,包括 面向Java EE 平臺的批處理應用 面向Java EE 的併發工具 用於JSON處理的Java API WebSocket Java API EJB元件新特性 s

Java動態語言特性之MethodHandle MethodHandles MethodType的簡單使用

對於子類呼叫父類的方法我們用super.Method()即可,但是倘若我們想呼叫其祖先類,並且在不改變其繼承關係以及祖先和父類的程式碼的時候,該怎麼辦呢,程式碼樣列如下:給大家三個類,可以先去了解再來熟悉下面的程式碼 MethodHandle 它是可對直接執行的方法或者欄位或

Java/JDK 8 新特性1.8對於1.7做了哪些優化/改進

Java 8 新特性 Java 8 (又稱為 jdk 1.8) 是 Java 語言開發的一個主要版本。 Oracle 公司於 2014 年 3 月 18 日釋出 Java 8 ,它支援函數語言程式設計,新的 JavaScript 引擎,新的日期 API,新的Str

JDK/JAVA 1.5到1.9版本特性對比

update:2017/9/25 JDK發展歷史:     96年SUN JDK 1.0 class VMWare、Visual     97年JDK 1.1:具有AWT、內部類、JDBC、RMI、反射     98年JDK 1.2:有JIT解析器

Java高階特性之new一個內部類

package three.day.newcharacter; class Outer {public static final int height = 20;public static int weight = 20;private int num = 100;//內建

Java高階特性之內部類

 1.   什麼是內部類(InnerClass)?         一個類中巢狀著另一個類,這樣的類就叫內部類.        語法: class outClass{ public class innerClass{ } } 2.   內部類的

Java高階特性(一)

一、static   static關鍵字經常以修飾變數、程式碼等形式和構造器、父類構造器一起出現在筆試題中,首先了解static能修飾哪些東西。   1.static變數   static變數既是在例項變數的前面加個static,一般稱為靜態變數。   靜態變數和例項變數的區別在於給類建立例項時,靜態

詳解 Java 11 新特性, Java高階程式設計師必備

Java 11新特性的詳細解釋。JDK 11已經於 2018年9月25日正式釋出,那麼Java 11主要包含哪些新特性呢? JDK 11是Java SE 11平臺版本11的開源參考實現,由JSR 384在Java Community Process中指定。阿里巴巴是中國唯一的JCP委員會成員公司,參與Jav

JAVA高階特性——二進位制儲存圖片

import java.io.*; /** * 將圖片轉為陣列,輸出成檔案,再讀取這個檔案,獲得這個陣列,還原成圖片 * @author Administrator * * */ public class Text3 { public static void main(String[

JAVA高階特性——迷你圖書管理系統(DOM4J操作儲存集合中的物件)

  要求:使用XML儲存圖書資訊,使用DOM4J操作XML,進行圖書的增刪改查。 使用技術:XML/DOM4j/集合/物件     部分實現效果如果下:  實現思路   首先需要建立一個圖書類(Book類),儲存圖書的屬性(屬性和XML檔案一致,因

安裝Java語言jdk,配置java環境變數

一.windows 安裝jdk    win7   下載jdk:   地址   https://www.oracle.com/technetwork/java/javase/downloads/index.html      點選 java se 8u191 進入下載頁