写给大忙人看的 Java Core 读书笔记
随便记录一点零碎和不熟悉的知识点吧,好记性不如烂笔头。
第一章 基本的编程结构
1、数字与字符串转换
int a = 50;
String str =Integer.toString(a,22); //radix基数(进制),2~36之间
a = Integer.parseInt(str,3); //同样可以指定基数
//Double有同样的Double.toString Double.parseDouble
2、数组与数组列表复制
基本类型数组 和 包装类数组列表 之间转换需要显式循环或Stream
//数组复制
String[] oldStr = new String[]{"a", "b", "c"};
String[] newStr = Arrays.copyOf(oldStr, oldStr.length);
//数组列表复制
List<String> oldArr = new ArrayList<String>(Arrays.asList(oldStr));
List<String> newArr = new ArrayList<>(oldArr);
Arrays.deepToString(); //输出二维数组
//关于Arrays的算法等以后章节再详细写吧。。
在参数类型后加上 … 就变为了变长参数,变长参数必须写在参数列表最后一个,变长参数可以传入数组。
//至少有一个参数
public static double max(double first,double... values) {
}
第二章 面向对象编程
之前写过关于面向对象的复习博客:面向对象一 面向对象二
所以只记一下感觉这本书上说的比较好的地方。
1、静态变量和方法
final 修饰对象引用,代表该引用永远不变。类中的 final 变量必须初始化,定义时初始化,否则就要在所有的构造函数中加上初始化。
static 修饰类中元素,代表是属于该类的,所用该类的对象共享,修饰变量时,应注意多线程的问题。(更合适的描述词 class variable)
代码 | 名字 | 描述 |
---|---|---|
final | 实例变量 | 初始化后不可更改 |
static | 静态变量 | 类对象共享 |
static final | 静态常量 | final + static |
static{} | 静态初始块 | 第一次类加载时,执行静态初始块 |
static修饰方法 | 静态方法 | 不用运行在对象上的方法,只可访问本类实例变量 |
关于工厂方法,之前有写篇完全搬实验楼的博客:工厂模式
2、嵌套类
- static 修饰的静态嵌套类:不可有外部嵌套类的引用,静态嵌套类中的属性方法,如果也有 static 修饰就是外部的类公有,否则就是私有。
- 无 static 修饰的内部类:可以有外部嵌套类的引用,即可以对外部类的属性进行修改,且只属于该实例化的类。
除了编译时常量外,内部类不能声明静态成员。如果静态类有静态成员,那关于 static 的含义将会模糊不清。
内部类会被编译成普通类,该类有一个指向外部实例的隐藏实例变量。
静态嵌套类很容易就可以想到,只是个类的生成接口。那么内部类可以对外部类进行操作会发生什么?
public class Club {
private String clubName;
public List<Member> members = new ArrayList<>(); //为了方便设为public
public class Member{
final String name;
public Member(String name){
this.name = name;
}
public void leave(){
members.remove(this);
}
public String getClubName(){
return clubName;
}
}
public Member creatMember(String name){
return new Member(name);
}
public Club(String clubName) {
this.clubName = clubName;
}
public void addMember(Member member){
members.add(member);
}
//内部类的外部类引用OuterClass.this
public boolean belongsTo(Club club){
return Club.this == club;
}
}
public static void main(String[] args) {
Club aClub, bClub;
aClub = new Club("AcFun");
bClub = new Club("BiLiBiLi");
Club.Member liHua = aClub.creatMember("LiHua");
bClub.addMember(liHua);
System.out.println(bClub.members.get(0).getClubName());
//输出为AcFun,放入bClub中仍然输入aClub名字
bClub.members.get(0).leave();
System.out.println(aClub.members.size());
//输出为0,在一个类实例中影响了另一个类实例的元素
//内部类有一个指向外部实例的隐藏实例对象
}
3、文档注释
你可以(并且应该)为每个功能提供注释,每个注释放在它所描述的功能紧上面。注释以 /** 开始,以 */ 结束。
所有 /**…*/ 文档注释包含自由格式的文本,后面紧跟标签。 @author 或 @param
文档注释 | 位置 | 描述 |
---|---|---|
@param | 方法注释 | 每个参数 |
@return | 方法注释 | 返回值 |
@throws | 方法注释 | 任何抛出的异常 |
/**直接写在这*/ | 变量注释 | 你只需要注释共有变量——通常是静态常量 |
@since | 通用注释 | 从哪个版本开始有这个功能 |
@deprecated | 通用注释 | 表示类、方法、变量不在用了,应提供一个替代者 |
@see | 添加链接 | 可以引用类、方法、超链接、文本。引用方法时,使用#号分割类名与方法名。 |
@link | 添加链接 | 与@see规则相同 |
IDEA文档模板:
类创建文档模板:
/**
1. @description: TODO
2. @author ${USER}
3. @Date ${DATE} ${TIME}
4. @version 1.0
*/
文档快捷键模板需要自己添加:
- 右上角 + 号,先添加自定义组,再在组中添加模板。
- 左下角添加 contexts ,即生效范围,点 java 即可。
- Eidt vaiables 编辑自定义变量。
方法注释模板:
**
*
$params$
* @return $returns$
* @author $user$
* @date $date$ $time$
*/
Name Default value
params groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+='* @param ' +params[i] + ((i < params.size() - 1) ? '\\n ' : '')};return result", methodParameters())methodParameters())
returns methodReturnType()
user user()
date date()
time time()
类注释模板:
**
*
* @author $user$
* @date $date$ $time$
* @version 1.0
*/
Name Default value
user user()
date date()
time time()
用的时候打出来定义的 * 回车就生成了,效果图如下。