1、byte、short、char做简单运算,结果类型是int,查了下貌似没有原因,规范如此
2、char类型默认初始值,空字符,空格字符,空字符串
空字符:\u0000,是一个Unicode字符(\u开头),是控制字符(也叫不可显字符)
空格字符:\u0020,和前者不同
"\u0000":是一个包含一个空字符的字符串,"\u0000".length()=1
""是空字符串,里面不包含任何字符,长度是0
" "是空格字符串,里面包含一个空格,长度是1
" ".equals("\u0000") //false " ".equals("\u0020") //true '\u0000'+2 //2
3、方法的参数传递机制,基本数据类型,传递的是值,引用类型,传递的是对象的内存地址
4、属性赋值的顺序
默认初始化值,显式初始化赋值,构造器中初始化赋值,方法或属性调用赋值,其中前三个只执行一次
5、this和super关键字
表示当前对象,this()表示调用构造方法,如果在构造器中调用,必须声明在首行
在构造器中调用this或super构造器时,都必须放在首行,因此不能同时都调用
如果没有显式调用带参数的构造器,默认会调用无参构造器(this或super)
子类构造器初始化过程中一定会调用父类构造器最终到调用Object类的构造器
6、子类和父类有同名属性时,子类的这个属性不会覆盖父类的同名属性,也就是同时存在,未指定时默认是子类的属性
7、类和类之间的关系:泛化(继承),实现,聚合(电脑和组成电脑的鼠标键盘等部件,可以独立使用),组合(公司和部门关系,不可分割),关联,依赖
8、多态
父类引用指向子类对象:Animal dog = new Dog()
对于方法调用,编译时看左边,运行时看右边(编译时检查父类类型,运行时执行子类类型)
对于属性访问,编译和运行时都看左边(只看引用变量所属的类型)
对于类型转换,父类转换为子类,可能会报类型转换异常,子类转换为父类是一定可以转换成功的
父类引用只能调用父类中声明过的方法,不能调用子类独有的方法。运行时实际调用的是子类覆盖的方法(动态绑定)
对于父类被覆盖的方法,统称为虚拟方法
9、对象被回收之前,会调用它的finalize()方法
10、new Boolean("true123") //false new Boolean("TrUe") //true 查阅源码
public Boolean(String s) { this(parseBoolean(s)); } public static boolean parseBoolean(String s) { return ((s != null) && s.equalsIgnoreCase("true")); }
11、Arrays.asList(xx),其中xx是一个数组
当xx更新时,返回的这个list也会自动更新;得到的list长度是不可变的;不支持add,remove,clear方法
12、java中类不支持多继承,但是接口支持多继承,interface A extends B,C(B,C都是interface),例如spring中的应用上下文类
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver
13、代码块作用
用来初始化类或者对象;
静态代码块随着类加载执行且只执行一次,用于初始化类信息;优先于非静态代码块执行;只能调用静态属性,静态方法
非静态代码块随着对象创建而执行,每创建一个对象就执行一次;
14、final修饰局部变量或者方法的形参时,该变量或参数只能使用,不能再重新赋值或修改