基本类型
二进制前缀:0b或者0B,使用“_”来分隔过长的数字
八进制前缀:0,容易混淆,不建议使用。
十六进制:0x或0X,
0.0/0.0为NaN,所有的NaN值不相等,不能用“==”判断,但可用“Double.isNaN()”来判断
char类型:2字节,原本用于表示单个字符,不建议使用char类型。
可以用16位Unicode“\u0000”,注意,Unicode可以表示单引号外的地方
注释中的Unicode也会被替换,遇到换行符可能会出错,\u后面不是十六进制字符也会出错.
char类型描述的是,UTF-16编码中的一个代码单元(某些字符由两个代码单元组成)
Unicode码点:
U+0000~U+FFFF:表示经典的代码
U+10000~U+10FFFF表示其余码点,包括辅助字符.
U+D800~U+DBFF :第一个代码单元
U+DC00~U+DFFF :第二个代码单元
运算符
算术运算符
位运算符
& | ^ ~
& | 可以用在布尔运算里,但不会短路
>> 右移,高位补符号位
<< 左移,低位补0.
>>> 无符号右移,空出来的高位补0.
String类
Unicode字符一般用一个代码单元,辅助字符需要两个代码单元
length()表示字符串的代码单元数量,常用汉字一般是一个代码单元;如果一定要得到码点数量,可以使用codePointCount(start,end),不包含end.
codePointAt(int index) : 返回第index个码点
charAt(index) : 返回第index个代码单元
char[] 转String?
Scanner类
流程控制
switch语句
case标签
- 类型为char,byte,short,int
- 枚举常量
- java 7开始,可以是字符串字面量
break可以带标签
创建数组时,数字初始化为0,boolean初始化为false,对象初始化为null
for each循环可以用来处理数组或者其他元素集合的每一个元素,集合必须是数组或者是一个实现了Iterable接口的类对象。
数组拷贝,Arrays.copyOf(),两个参数,第一个为待拷贝数组,第二个为新数组的长度,若新数组长度长,则赋默认值。若短,则只复制前面的。
Arrays类
static void fill(xxx[] a, xxx v) 将数组所有元素设置为v
static boolean equals(xxx[] a, xxx[] b) 判断数组是否相等。
static String toString(xxx[] a) 返回包含a中元素的字符串,用中括号包围,用逗号分隔,可以是基本类型
static String deepToString(xxx[][] a) 用于二维数组
不规则数组
创建不规则数组,允许除第一个中括号外的其他中括号内不指定长度。
对象未初始化,和赋值为null不一样。
加号与字符串一起用,double+字符串
var关键字只能用于方法中的局部变量
对象a1和a2为类型A,则A类的方法可以访问任何A类对象的私有字段,a1的方法可以访问a2的私有字段。
final关键字修饰的对象不可更改,表示的是信用值不可使用构造器时,无法改变所构造的对象的类型。更改,而不是对象的内容不可更改。
关于final知识点
使用静态工厂方法得到对象,而不直接利用构造器?
1. 无法命名构造器,若希望有两个或以上的名字,构造器无法完成。
2. 无法改变所构造对象的类型。
每一个类都可以有一个main方法,但执行A类时,只会执行A类的main方法。
Java参数传递采用的是按值调用,而不是按引用调用,参见p128
方法重载
方法签名:方法名,参数类型。不包括返回值
类的字段没有显式地赋值,则赋值为默认值
初始化块
创建对象,首先运行初始化块,然后运行构造器的主体部分
调用构造器的具体处理步骤
- 如果构造器的第一行调用了另一个构造器,则基于所提供的参数执行第二个构造器
- 否则,
- 所有数据字段初始化为其默认值
- 按照在类声明中的出现的顺序,执行所有字段初始化方法和初始化块
TODO 构造器,对象初始化块,静态初始化块的顺序问题
子类也不能调用父类的私有方法和私有属性
super和this的区别
super不是对象的引用,但this是。this可以赋值给另一个对象,而super不可以
使用super()调用构造器,必须是子类构造器的第一条语句
如果子类构造器没有显式调用父类构造器,则默认调用父类无参构造器,若没有无参构造器,则报错
类似于基本数据类型之间的强制类型转换。
存在继承关系的父类对象和子类对象之间也可以在一定条件之下相互转换。
这种转换需要遵守以下原则:
1.子类对象可以被视为是其父类的一个对象
2.父类对象不能被当作是某一个子类的对象。
3.如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。
4.如果父类对象与引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用。
1.Parent b = new parent();
2.Child c = (Child) b ;
采用该方法不能实现对象类型由超类向子类的转化,以上源程序编译正常,但是运行时会抛出class castException异常。
数组类型扩展了Object类
Objects类
static int hash(Object… objects) 返回一个散列码,由提供的所有对象的散列表组合而成
反射问题
初始化有关问题
类属性
方法中的变量
方法中的数组变量
若采用new int[n]的形式初始化,则按类型赋值.
- 关于线程,setDaemon设置必须要在Start之前?
- 反序列化后,类属性和对象属性?
- Servlet转向时不在地址栏显示向后的地址?
- String类型和char[]数组利用equals可以比较吗?
- 为了让浏览器以UTF-8显示JSP,应?
- 二维数组在初始化时, 可以不指定第二维的长度
- public static void main(String[] args)
- public和static没有顺序,可以调换
- 可以定义为final. public static final void main(String[] args)
- 可以用synchronized修饰. static public synchronized viod main(String[] args)
- 不能使用abstract
- 每一个类中都可以定义main() ,但是只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法
- java程序初始化
父类静态变量->父类静态代码块->
子类静态变量->子类静态代码块->
父类非静态变量->父类非静态代码块->父类构造方法->
子类非静态变量->子类非静态代码块->子类构造方法
- 一个Java文件可以定义多个类,但最多只有一个public修饰的类.
如果有一个public修饰的类,则文件名必须和这个类名一致.
11.普通方法可以与构造方法同名
- 标识接口的用处
- 接口中的成员方法都是public abstract的,而且只能被这两个关键词修饰
- 接口中定义的成员变量默认为public static final,必须给初值
- 非静态内部类中不能有静态成员
- getClass()方法在object类中被定义为final与native,子类不能覆盖该方法.因此this.getClass()和super.getClass()最终调用的是Object中的getClass()方法.而Object的getClass()方法的释义是:返回此Object的运行时类
如何在子类中获取父类的名字?
通过反射:getClass().getSuperclass().getName()
- 在java语言中,每个中文字符占用2Byte,每个英文字符占用1Byte
二维数组有三种声明方法
type arrayName[][];type[][] arrayName;type[] arrayName[];
当用final作用于类的成员变量时,成员变量必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。而作用于局部变量时,只需要保证在使用之前被初始化赋值即可
- Java中,数据类型分为基本数据类型(或叫做原生类、内置类型)和引用数据类型。原生类是指基本数据类型。
byte a = 'b';正确,- 只有int可以表示以下
二进制,需要以 0B 或 0b 开头
十进制,默认
八进制,需要以 0 开头
十六进制 ,需要以 0x 或 0X 开头
- 方法的重载
方法的重载是指在同一个类中的多个方法有相同的名称,但是方法签名不同,编译器能够根据方法签名决定调用哪个方法。由于方法签名由方法名和参数表共同构成,因此方法的重载等同于多个方法有相同的名称和不同的参数列表。
方法的重载可以增加程序的可读性,执行相似操作的方法应该有相同的名称。
关于方法的重载,需要注意以下两点。
方法签名只由方法名和参数列表共同构成,因此被重载的方法必须具有不同的参数列表,而不能通过不同的修饰符和返回值类型进行方法的重载。
如果一个方法调用有多个可能的匹配,则编译器会调用最合适的匹配方法,如果编译器无法判断哪个方法最匹配,则称为歧义调用,会导致编译错误。
