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 ...
随机推荐
- Hdoj 2190.悼念512汶川大地震遇难同胞——重建希望小学 题解
Problem Description 下面是512汶川大地震部分受灾学校伤亡情况(惨痛!!) 1. 四川省都江堰市 聚源中学 伤亡情况:遇难学生人数(含失踪)320 详细说明: 一栋教学楼被震垮,该 ...
- Java List 遍历
//方法1 Iterator it1 = list.iterator(); while(it1.hasNext()){ System.out.println(it1.next()); } //方法2 ...
- luogu3953 [NOIp2017]逛公园 (tarjan+dijkstra+记忆化搜索)
先跑一边dijkstra算出从1到i的最短距离dis[i] 然后建反向边 从n开始记忆化搜索,(p,k)表示1到p的距离=dis[p]+k的方案数 答案就是$\sum\limits_{i=0}^{k} ...
- [CERC2017]Intrinsic Interval(神仙+线段树)
题目大意:给一个1-n的排列,有一堆询问区间,定义一个好的区间为它的值域区间长度等于它的区间长度,求包这个询问区间的最小好的区间. 题解 做法太神了,根本想不到. %%%i207m. 结论:当一个区间 ...
- os模块总结
学了忘,忘了学,忘了就来看一下...唯一进步的就是这次学的比上次更快了- - 最常用的几个: os.getcwd() # os.path.abspath(os.path.dirname(__fil ...
- nio 阻塞 非阻塞 同步 异步
https://mp.weixin.qq.com/s/5SKgdkC0kaHN495psLd3Tg 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相 ...
- Go 语言 HTTP Server 源码分析
http://www.codeceo.com/go-http-server-code.html
- 把 android 手机变成 web server (golang)
配置 golang 开发环境 略 安装并初始化 gomobile go get golang.org/x/mobile/cmd/gomobile gomobile init 创建 beego 项目, ...
- 【洛谷P1198】最大数
题目大意:在线维护一个序列,支持插入一个数,查询区间最值. 题解:直接建立线段树,插入就单点修改,查询就正常查..orz开始还真没想到.. 代码如下 #include <bits/stdc++. ...
- (贪心 区间) 51nod1091 线段的重叠
X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长 ...