new对象时初始化顺序:父类静态代码块->子类静态代码块->普通属性->父类构造代码块->父类构造函数->子类构造代码块->子类构造函数。
抽象类与普通类差不多,允许有抽象方法。
接口不允许有静态代码块。可以有非抽象的方法,比如default方法和静态方法。接口中只有常量定义,没有变量声明,修饰默认public static final。方法默认修饰public abstarct。abstract不能与final并列修饰同一个类。
abstract 不能与private、static、final或native并列修饰同一个方法。程序设计语言中,数组元素在内存中是一个接着一个线性存放的,通过第一个元素就能访问随后的元素,这样的数组称之为“真数组”。实现了真数组为Java语言健壮性的特点之一。
通常,当我们说 this 的时候,都是指“这个对象”或者“当前对象”。而且它本身会产生当前对象的一个句柄(即引用)。
构造方法this super所调用的构造方法必须放在第一行,且只能引用一个构造方法。
static修饰的变量或方法类似与全局变量或方法。static只能调用静态方法或静态变量。
static可以修饰修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。
(1)内部静态类实例化对象:StaticInnerClass staticInnerClass = new StaticInnerClass();
(2)内部非静态类实例化对象:InnerClass innerClass = new Test().new InnerClass();
static是不允许用来修饰局部变量。
静态语句块只能访问定义在静态语句块之前的变量,定义在之后的变量,只能进行赋值,不能访问。java 尽自己的全力保证所有变量都能在使用前得到正确的初始化。若一个方法的局部变量没有初始化,就会编译出错。将基本类型设为一个类的数据成员则会自动给一个初值。
static 初始化只有在必要的时候才会进行。且只初始化一次。
定义数组时必须指明它的行数。如int a[3][ ]
-
java类访问级别
final修饰基本属性时,该属性是不可变的,修饰对象时,引用不可改变,但其内容是可以改变的。
final修饰方法参数时时,我们不能改变自变量引用指向的东西。
使用 final 方法为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。
final修饰的类不可被继承。子类有父类的同名private,不属于继承而来的方法。
方法的重写规则
方法名、参数列表、返回值必须完全与被重写方法的相同;
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。(子类范围要小)
声明为final的方法不能被重写。构造方法不能被重写。
声明为static或者子类不能访问到的父类方法不能被重写,但是能够被再次声明。
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。(子类范围要小)重载规则
被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);
被重载的方法可以改变返回类型、访问修饰符、声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载函数的区分标准。类是单继承的,接口是多继承的。
内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种。
java.lang.Integer.equals():两个对象对应的值一致则返回true。
java.lang.String.equals():两个字符串对应的值一致则返回true。
java.lang.Object.equals():两个对象的引用是否一致,即两个的对象是否是同一个则返回true。Integer和String的hashCode()方法都是根据具体的value值来计算hashCode,那么尽管两个引用不同但是值相同的对象,依然是相等的。object则不相等。
tips: 建议只要重写equals,就必须重写hashCode;方法的继承:除了私有的方法,其他方法都可以继承。
方法的重写:子类重写父类中的方法,方法名不变,参数类型列表不变返回值类型可以不变,或者是父类型的返回值类型的子类型修饰词可以不变,也可以变的修改范围更大。
构造器:不能被继承,但是子类的构造器中一定会有一个构造器调用了父类的构造器。在子类构造器的首行首句使用super。函数式接口只包含一个抽象方法,默认方法不是抽象方法,可含有多个默认方法。
一个类只能继承一个抽象类,但一个类可以实现多个接口。
一个抽象类可以通过实例变量保存一个通用状态,而接口是不能有实例变量的。
一个类的默认方法使用相同的函数签名继承自多个接口时,遵守下面三条准则即可解决所有冲突:
(1)首先,类或父类显示声明的方法,其优先级高于所有方法。
(2)若第一条无法判断,则选择最具体实现的默认方法的接口,如类A实现了B、C两个接口,B、C都有a()方法,且B继承了C,则选择B的默认方法。
(3)若上面两条均无法解决,则应显示指定使用那个方法,如类A实现了B、C两个接口,B、C都有a()方法,可使用B.super.a()显式指定使用B的方法。-
Optional没有实现Serializable接口,所以无法序列化。
不推荐使用基础类型的Optional(OptionalInt、OptionalLong、OptionalDouble),因为它们不支持map、flatMap、filter方法。
一个 try-with-resources 语句可以像普通的 try 语句那样有 catch 和 finally 块。在try-with-resources 语句中, 任意的 catch 或者 finally 块都是在声明的资源被关闭以后才运行。
-
java类文件中的属性、方法、以及类中的常量信息都被分别存储在.class文件中。
JAVA反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,修改它的任意属性;这种动态获取的信息以及动态调用对象成员的功能称为java语言的反射机制。
Field、Method以及Constructor的父类AccessibleObject提供一个方法:setAccessible(boolean flag),该方法用于设置访问对象的accessible标志,当该标志为true时,反射的对象在使用时取消java语言访问检查,此时我们就可顺利使用反射对象了。
类装载器是用来把类(class)装载进 JVM 的。
Class对象的创建只能在JVM完成。
实例方法被覆盖 静态方法被隐藏。
若子类存在和父类同名的静态方法hello(),则Father f = new Son(); f.hello();调用的是父类的hello方法。静态方法和最终方法 带关键字 final 的方法不能被覆盖。
访问那些被覆盖方法的唯一途径 就是使用 super 关键字。
两个数值进行二元操作时,会有如下的转换操作:
如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型。
否则,如果其中一个操作数是long类型,另一个会转换为long类型。
否则,两个操作数都转换为int类型。