java的几个奇怪语法
=============================
Java 双冒号 :: 语法的含义
=============================
下面的代码中有双冒号,初看上去很奇怪,
list.forEach(System.out::println);
这是Java8的"方法引用", 语法是 类名::静态方法名, 一般用作简化Lamda表达式.
详见讨论: https://www.zhihu.com/question/28565691
比如:
list.forEach(System.out::println) 等价于 list.forEach(i->System.out.println(i))
nameList.forEach(Person::new) 等价于 nameList.forEach(name->new Person(name))
=============================
Java 三个点 ... 参数的含义
=============================
Java 1.5引入了三个点...语法, 即可变参数语法. 既然是可变参数语法, 说明它仅仅能用于函数参数定义, 另外也只能用于最后一个参数. 在函数体中, 这个可变参数可以被看作是一个数组; 而在函数调用方面, 可以为该参数传入: 一个数组实参, 或者0个参数, 或者多个实参.
可变参数的函数, 比普通的数组参数函数使用更灵活. 详见示例:
public class App
{
static void test1(String...names)
{
for(String name:names){
System.out.println(name);
}
System.out.println("end of test1");
} static void test2(String[] names)
{
for(String name:names){
System.out.println(name);
}
System.out.println("end of test2");
} public static void main(String[] args) {
test1(new String[] {"a","b"});
test1("a","b");
test1(); //甚至可以不传参数 test2(new String[] {"a","b"});
//test2(); //不传参数将报语法错误
test2(new String[] {}); //传个空数组, 相当于不传参数
}
}
=============================
@interface vs interface
=============================
都知道 interface 关键词用来定义一个接口, 但发现 @interface 好像也是在定义一个接口, @interface是什么东西?
原来@interface是用来定义annotation的, 定义annotation的写法和普通的interface很像, 下面是一个annotation定义的示例和使用.
public @interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
// Note use of array
String[] reviewers();
}
@ClassPreamble (
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe",
// Note array notation
reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List { // class code goes here }
=======================
SomeClass.class 和 SomeObject.getClass()
=======================
Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
经常能看到 SomeClass.class 这样的表达式, 该表达式和 SomeObject.getClass() 返回值是一样的, 都是返回一个 java.lang.Class 子类型对象, class是静态方法,注意它确实是方法, 但不需要加()号, getClass()是一个函数方法. 另外, .class还适用于原始类型, getClass()却不支持原始类型.
摘自 https://stackoverflow.com/questions/15078935/what-does-class-mean-in-java
=======================
怎么理解函数返回类型是 <T> void
=======================
public <T> void foo(List<T> listOfT) {...}
函数返回类型是 <T> void, 到底有没有返回值? 其实void 之前的<T>没有任何实际意义, 返回类型仍然是 void, void 之前的<T> 仅仅是一个提示, 告诉我们该函数参数是泛型.
或者可以将这个提示加到类名后, 也是可以的.
// 泛型类型提示加到函数上
public class App{
public <T> void foo(List<T> listOfT) {
}
} // 泛型类型提示加到类名后
public class App<T>{
public void foo(List<T> listOfT) {
}
}
下面是一个多个泛型类型函数的提示:
public <T,W> void bar(List<T> listOfT, List<W> listOfW) {...}
摘自, https://stackoverflow.com/questions/11377248/return-type-of-java-generic-methods
=======================
<T> 和 <?> 的区别
=======================
public <T> void foo(List<T> listOfT) {...}
public void bar(List<?> listOfSomething) {...}
<?>意思是可以使用任何类型, 所以上面两个函数从功能上是一样的, 但仍有一些差别.
最终的差异有: 第一个函数体中, 我们有一个类型变量T, 在函数体中可以用T定义另一个变量, 而第二个函数就做不到.
还有一些其他差异详见 https://stackoverflow.com/questions/6008241/what-is-the-difference-between-e-and-t-for-java-generics
=============================
catch括号中包含多个Exception类名
=============================
try {
execute(); //exception might be thrown
} catch (IOException | SQLException ex) {
LOGGER.error(ex);
} catch (CustomException ex) {
// do something else with this custom exception
}
代码中 catch (IOException | SQLException ex) 两个类名, 这是 Java7的语法, 如果针对两个类型的Exception有同样的处理机制, 可以在catch() 中用竖线符号将这些类型并列起来.
java的几个奇怪语法的更多相关文章
- Java中的10颗语法糖
语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的 ...
- Java之JDK7的新语法探索
Java之JDK7的新语法探索 前言 感谢! 承蒙关照~ 字面量: 各种精致的表达方式: 八进制以0开头,十六进制0X开头,二进制以0B开头. 二进制运算时,应该写成这样才直观: &15 -& ...
- Java基础-正则表达式(Regular Expression)语法规则简介
Java基础-正则表达式(Regular Expression)语法规则简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正则表达式的概念 正则表达式(Regular Exp ...
- Java学习笔记之---基础语法
Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...
- .Net程序员之不学Java做安卓开发:奇怪的Java语法
1.final关键字:用以修饰类时,表示类不可以被继承,指向基本数据类型或者引用类型时,该类只可以在声明的时候初始化 2.@Override 类似C# 中override关键字,表示对父类的重写.网上 ...
- JAVA 入门第一章(语法基础)
本人初学java 博客分享记录一下自己的学习历程 java我的初步学习分为六章,有c和c++的基础学起来也简便了很多. 第一章 语法基础 第二章 面向对象 第三章 常用工具类 第四章 文件操纵 第五章 ...
- Java 和C/C++的“语法”上的差异!
额其实认为语言语法之间是没有可比性的! 但是因为额曾经学过C/C++,而今又学Java,有赵本山说的话:“知识都学杂了!”,所以我个人总结一下,望提醒自己! Java C++ double 要用%f: ...
- Java基础の第二弹 基础语法
Java关键字 • abstract:表明类或类中的方法是抽象的:• boolean:基本数据类型之一,布尔类型:• break:提前跳出一个块:• byte:基本数据类型之一,字节类型:• ...
- Java错误:很奇怪的错误。。。
刚刚调试java web中出现了一个很奇怪的现象,前端有一个页面通过ajax调用后台的servlet,当我把后台的servlet代码修改后(将返回值由a修改为b),前端页面仍然获取的是a.调试跟踪se ...
随机推荐
- 【HDU3595】GG and MM(博弈论)
[HDU3595]GG and MM(博弈论) 题面 HDU 一个游戏由多个游戏组成,每次每个操作者必须操作所有可以操作的游戏,操作集合为空者输. 每个游戏由两堆石子组成,每次可以从较多的那一堆中取走 ...
- 关于Autosar中DCM(14229UDS)模块的理解
阅读本篇文章希望达到的目的是: UDS是干什么的, ISO14229是如何定义规则的, 希望接下来的阅读让你不虚此行. 1. UDS是干什么的?UDS全称是Unified Diagnostic Ser ...
- ACM-ICPC 2018 焦作赛区网络预赛 G. Give Candies (打表找规律+快速幂)
题目链接:https://nanti.jisuanke.com/t/31716 题目大意:有n个孩子和n个糖果,现在让n个孩子排成一列,一个一个发糖果,每个孩子随机挑选x个糖果给他,x>=1,直 ...
- AITP
AITP AITP比较简单,适合刚毕业,即将开始IT生涯的学生.接受CIPS认证课程的毕业生可以自动获得AITP证书,并获得一年的免费的CIPS会员资格. 接受非CIPS认证课程的毕业生需要申请,另外 ...
- mysql json 使用 类型 查询 函数
一,对记录的操作 1.创建有json字段的表 -- 创建表 ) , info JSON); 2.插入记录 -- 插入含有json数组的记录 , , "abc", NULL, TRU ...
- OpenLayers学习笔记(三)— QML与HTML通信之 地图上点击添加自由文本
实现在地图随意点击,弹出文本输入框,输入任意文字,完成自由文本添加的功能 作者: 狐狸家的鱼 GitHub:八至 本文链接:地图上点击添加自由文本 关于如何QML与HTML通信已经在上一篇文章 QML ...
- WinterAndSnowmen
https://vjudge.net/problem/TopCoder-12891 暴力想法是:dp[i][s1][s2]前i个,第一个集合xor是s1,第二个集合xor是s2方案数O(n^3) 有x ...
- 【洛谷P1637】三元上升子序列
题目大意:给定一个长度为 N 的序列,求有多少个三元组满足 \(i<j<k,a_i<a_j<a_k\). 题解:这是一类二维偏序问题,与逆序对问题类似. 对于序列中每个点来说, ...
- JavaScript ES6 核心功能一览
JavaScript 在过去几年里发生了很大的变化.这里介绍 12 个你马上就能用的新功能. JavaScript 历史 新的语言规范被称作 ECMAScript 6.也称为 ES6 或 ES2015 ...
- Django 项目内利用ORM直接运行脚本读库
#导包 import os import sys #将脚本所在工程添加到环境变量 #绝对路径 # sys.path.append('c:/Users/nxy/www/mymac') #相对路径 sys ...