作用域与可见性 | 当前类 | 同一package | 子类 | 其他package |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
子类只能继承父类非私有的(protected及public)成员变量和方法。
子类可以通过super关键字来显示地调用父类的构造函数,当父类没有提供无参数的构造函数时,子类的构造函数必须显式地调用父类的构造函数。
Java 8 开始,接口可以默认方法与静态方法。接口中所有的方法都是抽象的。接口中成员的作用域修饰符都是public,常量值默认使用public static final修饰。
没有任何方法声明的接口被叫做标识接口,如Cloneable,Serializable。
浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。
深复制:把复制对象的所有引用对象都复制了一遍。
Java创建对象的方式:
- 通过new语句实例化一个对象
- 通过反射机制获得一个对象
- 通过clone()方法创建一个对象
- 通过反序列化的方式创建对象
Java通过利用接口与类来实现函数指针的功能,如排序中传入Comparetor(或者实现Compareable接口中的compareTo)来实现降序升序排序。
当子类构造函数需要显式调用父类构造函数时,super()
必须为构造函数中的第一条语句。
当构造函数调用本类其他构造函数时,this()
必须为构造函数中的第一条语句。
在Java语言中,默认声明的小数是double类型,因此在对float类型的变量进行初始化时需要进行类型转换。
float f = 1.0f;
float f = (float) 1.0;
同样long类型赋值:long l = 26012402244L;
。
在Java类库中,所有基本类型的包装类型都是不可变类,例如Integer,Float等,此外String也是不可变类。
在hashMap中,由于key是不可重复的。此处的不可重复指的是equals()和hashCode()只要有一个不等就可以。
Java异常处理用到了多态的概念,如果在异常处理中先捕获了父类,再捕获了子类,那么捕获子类的代码块将永远不会执行。正确的写法是先捕获子类,再捕获父类。
数组类本身不通过类加载器创建,是由虚拟机直接创建。数组类的元素类型最终是靠类加载器创建。