java開發注解大全


目錄

1、最基礎注解(spring-context包下的org.springframework.stereotype)

1.1、@Controller @Service @Repository @Configuration @Component

(1)解釋

用於標注各個層級的注解,注入到spring容器管理
@Controller @Service @Repository @Configuration 都是@Component組合注解只是區分層級關系

注解 層級
@Controller 標注於控制層
@Service 標注於業務層
@Repository 標注於dao持久層
@Configuration 標注於配置層
@Component 泛指組件,當組件不好歸類時可用
(2)示例
@Controller
public class UserController {

}

1.2、 @Bean

(1)解釋

@Bean等價於< Bean >< /Bean >,添加的bean的id為方法名。

(2)例子

@Configuration
public class AppConfig {
	//@bean 也可以依賴其他任意數量的bean,如果TransferService 依賴 AccountRepository,我們可以通過方法參數實現這個依賴
    @Bean
    public TransferService transferService(AccountRepository accountRepository) {
        return new TransferServiceImpl(accountRepository);
    }
}

這個配置就等同於之前在xml里的配置:
@Configuration可理解為用spring的時候xml里面的< beans >標簽
@Bean可理解為用spring的時候xml里面的< bean >標簽

<beans>
    <bean id="transferService" class="com.acme.TransferServiceImpl"  depends-on="accountRepository"/>
</beans>

2、最基礎注解(spring-web包下的org.springframework.web.bind.annotation)

2.1、@ResponseBody

(1)解釋

該方法的返回的結果直接寫入 HTTP 響應正文(ResponseBody)中。
一般在異步獲取數據時使用,通常是在使用 @RequestMapping 后,返回值通常解析為跳轉路徑,加上 @Responsebody 后返回結果不會被解析為跳轉路徑,而是直接寫入HTTP 響應正文中。

(2)例子

/***********************例子一*******************************/
@RequestMapping(value="user/login")
@ResponseBody
//將ajax(datas)發出的請求寫入User對象中,返回json對象響應回去
public User login(User user) {
    User user = new User();
    user.setUserid(1);
    user.setUsername("MrF");
    user.setStatus("1");    
    return user ;
}
/***********************例子二*******************************/
@Controller 
public class UserController {
	@GetMapping("/hello") 
	@ResponseBody public String hello() {
		return "hello spring"; 
	} 
}

2.2、@RequestBody

(1)解釋

將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。換句話就是:用於接收前端請求的Json參數,並且封裝到對應的JavaBean

(2)例子

@RequestMapping(value = "user/login")
@ResponseBody
// 將ajax(datas)發出的請求寫入User對象中
public User login(@RequestBody User user) {   
// 這樣就不會再被解析為跳轉路徑,而是直接將user對象寫入 HTTP 響應正文中
    return user;    
}

(3)使用時機

A) GET、POST方式提時, 根據request header Content-Type的值來判斷:

application/x-www-form-urlencoded,可選(即非必須,因為這種情況的數據@RequestParam,@ModelAttribute也可以處理,當然@RequestBody也能處理);
multipart/form-data,不能處理(即使用@RequestBody不能處理這種格式的數據);
其他格式,必須(其他格式包括application/json,application/xml等。這些格式的數據,必須使用@RequestBody來處理);

B) PUT方式提交時, 根據request header Content-Type的值來判斷:

application/x-www-form-urlencoded,必須;multipart/form-data,不能處理;其他格式,必須;

2.3、@RequestMapping

(1)解釋

用來處理請求地址映射的注解

(2)例子

/**
* 用於類上,可以沒有
*/
@RequestMapping(value = "/controllerDemo")
public class ControllerDemo {
    // 用於方法上,必須有
    @RequestMapping(value = "/methodDemo")    
    public String methodDemo() {
        return "helloWorld";
    }
}

(3)注解參數

RequestMapping注解有六個屬性,下面我們把她分成三類進行說明。
1、value, method
value: 指定請求的實際地址,指定的地址可以是URI Template 模式(后面將會說明)
method:指定請求的method類型,GET、POST、PUT、DELETE等
2、consumes,produces
consumes: 指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
produces: 指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
3、params,headers
params:指定request中必須包含某些參數值是,才讓該方法處理。
headers:指定request中必須包含某些指定的header值,才能讓該方法處理請求。

2.4、@PostMapping

(1)解釋

一個組合注解,是@RequestMapping(method = RequestMethod.POST)的縮寫。

(2)例子

	@PostMapping("/pay")
	public JsonResponse pay(HttpServletRequest request){}

2.5、@GetMapping

(1)解釋

一個組合注解,是@RequestMapping(method = RequestMethod.GET)的縮寫。

(2)例子

@GetMapping("/getAll/{companyName}")
public ReturnModel getAllBusByCompany(@PathVariable(value="companyName",required=false)String companyName){}

2.6、@PathVariable

(1)解釋

用於接受前端url路徑參數,通過路徑參數作為接口接受的參數,Result風格
區分:
使用@RequestParam時,URL是這樣的:http://host:port/path?參數名=參數值
使用@PathVariable時,URL是這樣的:http://host:port/path/參數值

(2)例子

訪問路徑:localhost:8080/hello/1

    @GetMapping("/hello/{id}")
    public String func(@PathVariable String id) {
        return id;
    }

(3)參數

返回值 參數 作用
String value name別名
String name url參數的綁定值

2.7、@RequestParam

(1)解釋

用於接受前端提交的參數

(2)參數

返回值 參數 作用
String value name別名
String name 請求參數對應的屬性
boolean required 是否必傳
Stirng defaultValue 默認值

(2)例子

訪問方式:localhost:8080/hello?name=張三

    @GetMapping("/hello")
    public String func(@RequestParam(name = "name", required = false, defaultValue = "張三") String name) {
        return "OK";
    }

2.8、@RestController

(1)解釋

相當於@ResponseBody + @Controller,Controller中的方法無法返回jsp頁面,
返回的內容就是Return 里的內容。

3、persistence注解(javax.persistence包下的javax.persistence)

3.1、@Entity,@Table,@Id,@GeneratedValue, @Column,@Temporal,@Generated

(1)解釋

  • @Entity表明該類是實體類,並且使用默認的orm規則,即class名即數據庫表中表名,class字段名即表中的字段名。如果class名和數據庫表中名字不一致就用@Table,如果class字段名和表中的字段名不一直就用@Column
  • @Column用來標識實體類中屬性與數據表中字段的對應關系

name定義了被標注字段在數據庫表中所對應字段的名稱;
unique表示該字段是否為唯一標識,默認為false。如果表中有一個字段需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。
nullable表示該字段是否可以為null值,默認為true。
insertable表示在使用“INSERT”腳本插入數據時,是否需要插入該字段的值。
updatable表示在使用“UPDATE”腳本插入數據時,是否需要更新該字段的值。insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外鍵等。這些字段的值通常是自動生成的。
columnDefinition表示創建表時,該字段創建的SQL語句,一般用於通過Entity生成表定義時使用。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。)
table表示當映射多個表時,指定表的表中的字段。默認值為主表的表名。
length表示字段的長度,當字段的類型為varchar時,該屬性才有效,默認為255個字符。
precision和scaleprecision屬性和scale屬性表示精度,當字段類型為double時,precision表示數值的總長度,scale表示小數點所占的位數。

  • @Id表名該字段是主鍵,如果要開啟自增主鍵就用@GeneratedValue
  • @Temporal幫Java的Date類型進行格式化,一共有三種注解值

第一種:@Temporal(TemporalType.DATE)——>實體類會封裝成日期“yyyy-MM-dd”的 Date類型。
第二種:@Temporal(TemporalType.TIME)——>實體類會封裝成時間“hh-MM-ss”的 Date類型。
第三種:@Temporal(TemporalType.TIMESTAMP)——>實體類會封裝成完整的時間“yyyy-MM-dd hh:MM:ss”的 Date類型。

  • @Generated自動生成

generated= never 標明此屬性值不是從數據庫中生成。
generated默認值是never。
generated= insert 標明此屬性值在insert的時候生成,但是不會在隨后的update時重新生成。
generated= always 標明此屬性值在insert和update時都會被生成

(2)例子

import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;
import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "batch")
public class Batch{

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Integer id;
	
	//在插入的時候自動賦值當前時間
    @Column(insertable = false)
    @Temporal(TemporalType.TIMESTAMP)   
    @Generated(GenerationTime.INSERT)   
    private Date createdTime;

    //自動變化更新時間
    @Temporal(TemporalType.TIMESTAMP)
    @Column(insertable = false, updatable = false)
    @Generated(GenerationTime.ALWAYS)
    private Date updatedTime;
    
	//在插入的時候自動賦值1
    @Column(insertable = false ,columnDefinition="Short default 1")
    @Generated(GenerationTime.INSERT)
    private Short status;

4、resteasy注解(jaxrs-api包下的javax.ws.rs)

resteasy 是java體系中比較成熟的rest框架,也是jax-rs規范的實現之一,dubbox的REST服務框架,就是采用的resteasy實現。
默認情況下,resteasy使用jackson和jaxb來實現json及xml格式的序列化。應用啟動時,會自動掃描帶@Provider的包,找到最合適的provider。
這個可以用來做分布式,可以通過okhttp3協議來進行交互

4.1、@Path、@POST、@Produces、@Consumes、@Context

(1)例子

import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
import com.tdpay.dubbo.common.response.JsonResponse;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;

@Path("/td")
public interface PayIntegrationService {

	@Path("/pay")
	@POST
	@Produces({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
	@Consumes({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
	public JsonResponse pay(@Context HttpServletRequest request);
}

5、validation注解(validation-api包下的javax.validation)

5.1、@Valid 和 @屬性校驗注解

(1)解釋

用於前端請求參數校驗,@Valid需要配合BindingResult使用,以及配合下面各種校驗注解進行使用

(2)注解參數

注解 作用
@Valid 進行校驗前端入參
注解 作用
@Null 限制只能為null
@NotNull 限制必須不為null
@AssertFalse 限制必須為false
@AssertTrue 限制必須為true
@DecimalMax(value) 限制必須為一個不大於指定值的數字
@DecimalMin(value) 限制必須為一個不小於指定值的數字
@Digits(integer,fraction) 限制必須為一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction
@Future 限制必須是一個將來的日期
@Max(value) 限制必須為一個不大於指定值的數字
@Min(value) 限制必須為一個不小於指定值的數字
@Past 限制必須是一個過去的日期
@Pattern(value) 限制必須符合指定的正則表達式
@Size(max,min) 限制字符長度必須在min到max之間
@Past 驗證注解的元素值(日期類型)比當前時間早
@NotEmpty 驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)
@NotBlank 驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格
@Email 驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式

(3)示例

    /**
     * 接受前端的請求並且根據User實體類注解進行校驗
     */
    @PostMapping("/hello/user")
    public String hello(@Valid @RequestBody User user, BindingResult result) {
        if (result.hasErrors()) {
            result.getAllErrors().forEach(System.out::println);
        }
        System.out.println(user);
        return "hello spring";
    }
@Data
public class User {

    @NotBlank(message = "用戶名不能為空")
    private String username;

    @NotBlank(message = "密碼名不能為空")
    private String password;
}

6、lombok常用注解

idea要下載lombok插件
打開IDEA的Setting –> 選擇Plugins選項 –> 選擇Browse repositories –> 搜索lombok –> 點擊安裝 –> 安裝完成重啟IDEA –> 安裝成功
然后pom導入lombok包

<dependency>  
    <groupId>org.projectlombok</groupId>  
    <artifactId>lombok</artifactId>  
    <version>1.18.0</version>  
    <scope>provided</scope>  
</dependency> 

6.1、@Slf4j和@Log

(1)解釋

@Slf4j: 注解在類上,為類提供一個屬性名為 log 的 log4j 的日志對象,避免重復代碼。(基於lombok包)
@Log:使用的是 java.util.logging.Logger ,直接使用變量 log,用法同上。

(2)示例

@Service
@Slf4j
public class UserService {

    public void func() {
        log.info("【使用{}】","@Slf4j");
    }
}

6.2、@Data

(1)解釋

用在pojo類,在類上面加這個注解。簡化java代碼編寫,為該類提供讀寫屬性,還提供了equals(),hashCode(),toString()方法。
等價於 @ToString、@Getter、@Setter、@EqualsAndHashCode、@NoArgsConstructor

注意:同時使用@Data 和 @AllArgsConstructor 后 ,默認的無參構造函數失效,如果需要它,要重新設置 @NoArgsConstructor

(2)例子

@Data
public class ActivityListParam{
    private Integer id;
    private Integer page;
    private Integer count;
    ...

}

6.3、@Getter,@Setter,@ToString,@EqualsAndHashCode

(1)解釋

在pojo類上面加了這些注解以后,自動生成get、set、toString、equals、hashCode等方法
@EqualsAndHashCode(callSuper = false)的意思是忽略父類的字段,來調用equals和hashcode

6.4、@AllArgsConstructor、@NoArgsConstructor

(1)解釋

@AllArgsConstructor
在pojo類上面加了這些注解以后,會生成一個包含所有變量的構造函數,同時如果變量使用了NotNull annotation , 會進行是否為空的校驗,
全部參數的構造函數的自動生成,該注解的作用域也是只有在實體類上,參數的順序與屬性定義的順序一致

@NoArgsConstructor
在pojo類上面加了這些注解以后,會生成一個無參構造函數

6.5、@NonNull

(1)解釋

該注解用在屬性或構造器上,Lombok會生成一個非空的聲明,可用於校驗參數,能幫助避免空指針。

(2)例子

public class Person {
 	 private String name;
  
	public NonNullExample(@NonNull Person person) {
	  super("Hello");
	  this.name = person.getName();
	}
  
  	@NonNull
	public List<Person> getMembers() {
	  return members;
	}
}

6.6、@Cleanup

(1)解釋

該注解能幫助我們自動調用close()方法,很大的簡化了代碼。

(2)例子

    import lombok.Cleanup;
    import java.io.*;
    
    public class CleanupExample {
      public static void main(String[] args) throws IOException {
        @Cleanup InputStream in = new FileInputStream(args[0]);
        @Cleanup OutputStream out = new FileOutputStream(args[1]);
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      }
    }

如不使用Lombok,則需如下:

import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        if (out != null) {
          out.close();
        }
      }
    } finally {
      if (in != null) {
        in.close();
      }
    }
  }
}

6.7、@Builder

(1)解釋

聲明實體,表示可以進行Builder方式初始化

(2)例子

/**
 * toBuilder 允許修改屬性
 */
@Builder(toBuilder = true)
@Getter
public class User {
    private String name;
    private String password;
}
    @Test
    public void contextLoads() {
        // 創建對象並且賦值
        User user = User.builder().name("123").password("456").build();
        
        // 修改對象屬性值
        User updateUser = user.toBuilder().name("張三").password("123").build();
    }

7、tkMapper注解

不知道怎么用tkMapper查看我的另一個文章:https://blog.csdn.net/ranandrun/article/details/86509394

7.1、@Select、@Param

  • @Param作用是用於傳遞參數,從而可以與SQL中的的字段名相對應,一般在2=<參數數<=5時使用最佳
  • @Select作用是用注解方式來查詢,不需要通過mapperxml文件
import com.td.pay.tdpay.entity.PayParamsModel;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

@Repository
public interface PayParamsDao extends Mapper<PayParamsModel> {
	/**
	 * 根據sn查詢訂單
	 */
	@Select("SELECT * FROM pay_params WHERE sn = #{sn};")
	public PayParamsModel selectBySn(@Param("sn") String srcOrderSn);
}

8、springboot常用注解

8.1、@ConfigurationProperties

(1)解釋

將配置文件中配置的每一個屬性的值,映射到這個組件中

(2)例子

**
 * @ConfigurationProperties:
 *      prefix = "person":配置文件下面的所有屬性和類的屬性進行一一映射
 *
 * 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

配置文件

person:
    lastName: hello
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
      - lisi
      - zhaoliu
    dog:
      name: 小狗
      age: 12

我們可以導入配置文件處理器,以后編寫配置就有提示了

<!--導入配置文件處理器,配置文件進行綁定就會有提示-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>

8.2、@MapperScan("com.test.dao")

掃描dao接口,放啟動類上面

8.3、@SpringBootApplication(scanBasePackages = {"com.test"})

SpringBootApplication啟動時會默認掃描主類當前包及子包,如果需要掃描主類當前包外的其他包就用@SpringBootApplication

9、注入bean的三個注解

歸納:

  • @Autowired是spring自帶的,@Inject是JSR330規范實現的,@Resource是JSR250規范實現的,需要導入不同的包
  • @Autowired、@Inject用法基本一樣,不同的是@Autowired有一個request屬性
  • @Autowired、@Inject是默認按照類型匹配的,@Resource是按照名稱匹配的
  • @Autowired如果需要按照名稱匹配需要和@Qualifier一起使用,@Inject和@Name一起使用

9.1、@Inject(javax.inject下的)

(1)解釋

根據類型進行自動裝配的,默認需要配置與變量名一致。如果需要按名稱進行裝配,則需要配合@Named;
@Inject可以作用在變量、setter方法、構造函數上。

(2)例子

    @Inject
    private Mongo mongo;

9.2、@Autowired ( org.springframework下的sping-beans)

(1)解釋

根據類型進行自動裝配的,名稱不一樣也沒事,如果需要按名稱進行裝配,則需要配合@Qualifier;
@Autowired有個屬性為required,可以配置為false,如果配置為false之后,當沒有找到相應bean的時候,系統不會拋錯;
@Autowired可以作用在變量、setter方法、構造函數上。

(2)例子

    @Autowired
    private MongoTemplate mongoTemplate;

9.3、 @Resource (jdk下的rt.jar下的javax.annotation)

(1)解釋

根據名稱進行自動裝配的,默認需要配置與變量名一致,一般會指定一個name屬性。
@Resource可以作用在變量、setter方法上。

(2)例子

    @Resource(name = "userMapper")
    private UserMapper userMapper;

10、java內置注解(java.lang下的)

10.1、@Override

(1)解釋

幫助自己檢查是否正確的復寫了父類中已有的方法
告訴讀代碼的人,這是一個復寫的方法

(2)例子

public class Apple extends Fruit{
     @Override
     public void show_name(int num){
         System.out.println("Apple");
    }
}

10.2、@Deprecated

(1)解釋

這個方法或類不再建議使用。調用時也會出現刪除線,但並不代表不能用。在新版本中有其他方法或類可以代替這個使用,以后的版本也不會再更新這個方法或類

(2)例子

     /**
     * 請改用每個實體對象的實例方法的existed()方法。
     */
    @Deprecated
    public static <T extends Entity> boolean exists(Class<T> clazz, Serializable id) {
        return getRepository().exists(clazz, id);
    }

10.3、@SuppressWarnings

(1)解釋

抑制內容警告,我們使用是要保證抑制影響的范圍最小。
@ SuppressWarnings可以使用的屬性列表如下:

屬性 備注
all 禁止所有警告
boxing 禁止與裝箱/拆箱操作相關的警告
cast 強制轉換以抑制與強制轉換操作相關的警告
dep-ann 用於抑制相對於已棄用注釋的警告
deprecation 棄用以抑制相對於棄用的警告
fallthrough 在switch語句中,通過fallthrough來抑制與丟失中斷相關的警告
finally 最后抑制與最終塊相關的不返回的警告
hiding 隱藏以抑制相對於隱藏變量的本地警告
incomplete-switch 在switch語句(enum案例)中,incomplete-switch用來抑制相對於丟失條目的警告
javadoc 禁止與javadoc警告相關的警告
nls 使用nls來抑制相對於非nls字符串的警告。
null 空值來抑制相對於空值分析的警告
rawtypes 拒絕與使用原始類型相關的警告
resource 用於抑制與使用類型為Closeable的資源相關的警告的資源
restriction 限制禁止與使用不鼓勵或禁止引用相關的警告
serial 串行用於抑制相對於可串行化類缺少serialVersionUID字段的警告
static-access 靜態訪問,抑制相對於不正確的靜態訪問的警告
static-method 靜態方法,用於抑制相對於可以聲明為靜態的方法的警告
super 超級-來抑制相對於在沒有超級調用的情況下重寫方法的警告
synthetic-access 用於抑制相對於內部類的未優化訪問的警告的合成訪問
sync-override 在覆蓋同步方法時,由於缺少同步而取消警告
unchecked 未選中以抑制與未選中操作相關的警告
unqualified-field-access 不限定字段訪問來抑制與字段訪問不限定相關的警告
unused 不常用來抑制與未使用代碼和死代碼相關的警告

(2)例子

public class SuppressWarnings {

    /**
     * 變量單個類型的警告
     */
    @java.lang.SuppressWarnings("unused")
    public void unused() {
        String s = "";
    }

    /**
     * 抑制多個類型的警告
     * @param item 元素
     */
    @java.lang.SuppressWarnings({"unchecked", "rawtypes"})
    public void addItems(String item){
        List items = new ArrayList();
        items.add(item);
    }

    /**
     * 抑制所有類型的警告
     * @param item
     */
    @java.lang.SuppressWarnings("all")
    public void all(String item) {
        List items = new ArrayList();
        items.add(item);
    }
}

10.4、@SafeVarargs

(1)解釋

抑制堆污染警告
問:什么時候會出現對堆污染警告?
答:使用泛型+可變參數的時候就會出現堆污染警告。

(2)例子


        @SafeVarargs
	public static<T> T useVarargs(T... args){
		return args.length > 0?args[0]:null;
	}
	@Test
	public void testSafeVarargs(){
		System.out.println(useVarargs(Arrays.asList("s1","s2")));
	}

10.5、@FunctionalInterface

(1)解釋

在Java SE 8中引入的 ,申明某個接口是函數式接口(函數式接口是就只含有一個抽象方法的接口)。加上該注解,當你寫的接口不符合函數式接口定義的時候,編譯器會報錯。該注解只是提醒編譯器去檢查該接口是否僅包含一個抽象方法。

(2)例子

如定義了一個函數式接口如下:

    @FunctionalInterface
    interface GreetingService 
    {
        void sayMessage(String message);
    }

那么就可以使用Lambda表達式來表示該接口的一個實現(注:JAVA 8 之前一般是用匿名類實現的):

GreetingService greetService1 = message -> System.out.println("Hello " + message);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM