java-查漏补缺,巩固理论知识

1、byte、short、char做简单运算,结果类型是int,查了下貌似没有原因,规范如此

2、char类型默认初始值,空字符,空格字符,空字符串

空字符:\u0000,是一个Unicode字符(\u开头),是控制字符(也叫不可显字符)

空格字符:\u0020,和前者不同

'\u0000':空字符值,char类型的默认初始值就是它,对应的整数值是0

"\u0000":是一个包含一个空字符的字符串,"\u0000".length()=1

""是空字符串,里面不包含任何字符,长度是0

" "是空格字符串,里面包含一个空格,长度是1

" ".equals("\u0000") //false
" ".equals("\u0020") //true
'\u0000'+2              //2

3、方法的参数传递机制,基本数据类型,传递的是值,引用类型,传递的是对象的内存地址;String类型参数,也是引用传递,不是值传递,可以画堆栈图来理解

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修饰局部变量或者方法的形参时,该变量或参数只能使用,不能再重新赋值或修改

15、类加载的顺序:先父类后子类,静态先执行,最后构造方法

16、抽象类的匿名子类对象,接口的匿名实现类编写方法

17、抽象类的典型设计模式-模板方法模式

18、接口的典型设计模式-代理模式

19、构造方法,static对应的典型设计模式-单例模式

20、java8 接口中定义的静态方法,只能接口自己调用,实现类不能调用,接口中定义的默认方法,其实现类的对象可以调用

如果实现类实现了多个接口,而这多个接口中定义了同名同参的默认方法,那么这个实现类必须重写这个默认方法,否则调用时报错 

如何在实现类中调用接口中定义的默认方法?

假设下面4个类中都定义了show()方法,其中SubClass这个类的show()是重写的;
public class SubClass extends SuperClass implements InterfA,InterfB{
   public void test(){
      show();                 //调用自己重写的方法
      super.show();           //调用父类的方法
      InterfA.super.show();  //调用接口的默认方法
      InterfB.super.show();  //调用接口的默认方法

   }
}
接口名.super.方法名()

21、子类抛出的异常不能大于父类抛出的异常

22、内部类分为成员内部类(static的和非static的)和局部内部类(定义在方法内或代码块内或构造器内),局部内部类的方式用的极少,可不不关注,也不推荐,以下都是指前者

内部类一方面作为外部类的成员,可以调用外部类的结构,可以被static修饰,可以被4种不同的权限修饰

另一方面作为一个类,可以定义属性,方法,构造器;可以被final修饰,可以被abstract修饰

23、枚举类的父类是java.lang.Enum,枚举类的属性建议用private final修饰,因为枚举类的属性值事先已经确定,定义成final表明这个属性一旦初始化后不可更改(基本类型是值不可更改,引用类型是引用地址不再更改)

 

 
posted @ 2022-04-26 14:19  鼠标的博客  阅读(139)  评论(0编辑  收藏  举报