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 ...
随机推荐
- 540. Single Element in a Sorted Array
题目大意: 给你一个由小到大排好序的数组,里面只有一个数出现了一次,其他数都出现了两次,要求找出那个只出现一次的数,而且时间复杂度为O(logn) 题目思路: 说实话一开始没想到,因为几乎每个数都出现 ...
- LOJ#6284. 数列分块入门 8
分块的时候开一个数组标记这个区间是不是都是一样颜色的部分,如果是的话,我后面的查询,更新部分就可以直接整块操作,对于不是不全部都一样颜色的块在具体进到快里面去暴力. 在更新的时候对边上的两个不完整的块 ...
- [WC2014]紫荆花之恋(动态点分治+替罪羊思想)
题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每 ...
- dbForge Studio for MySQL V8.0 Enterprise
上篇文章:JetBrains全家桶破解思路(最新更新:2018-12-24) 最适合从SQLServer转向MySQL的人使用(用起来基本上差不多) 最适合Net开发人员的MySQL IDE (不装V ...
- 洛谷P1494 小Z的袜子
题意:在[l, r]之中任选两个数,求它们相同的概率. 解: 莫队入门. 概率这个很好搞,就是cnt * (cnt - 1) / 2. 然后发现每次挪指针的时候,某一个cnt会+1或-1.这时候差值就 ...
- A1043. Is It a Binary Search Tree
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- 【CH6801】棋盘覆盖
题目大意:给定一个 N*N 的棋盘,棋盘上有些位置不能防止任何东西,现用 1*2 的骨牌填充棋盘,问最多能铺多少块骨牌. 题解:由于骨牌只能覆盖相邻的两个格子,那么按照对角线进行划分的格子可以保证一定 ...
- [luogu3391][文艺平衡树]
题目链接 思路 splay区间操作的裸题. 假如要对l-r这段区间操作,那么就先把l-1伸展到根节点,然后把r +1伸展为根的儿子.这样r + 1的左儿子就是要操作的区间了.只要在上面打上标记,以后每 ...
- Django(十一)请求生命周期之CBV与FBV
https://www.cnblogs.com/yuanchenqi/articles/8715364.html FBV FBV(function base views) 就是在视图里使用函数处理请求 ...
- python logging日志模块
一.logging模块的简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不 ...