Java 语言规则笔记

//注意,本博文不是最终版本,仅记录最新理解。部分内容为推测

1. 方法重载:形参不同即可重载。不导致重载的因素有:

    1.1返回值:由于调用者可以可以忽略返回值,可出现二义性

    1.2访问修饰符:若有高访问权限的方法来调用,可出现二义性

    1.3抛出异常:调用者可忽略异常,可出现二义性

注意:可变长参数与普通参数构成重载,同类型可变长参数不构成重载(不推荐使用可变长参数)

 

2.类和对象构造相关

    2.1为什么没有静态构造器?在Java中,构造器特指实例对象的构造函数,所以没有静态构造器(static constructor)的说法,但是有静态初始化块(static initializer)

    2.2实例对象中,父类构造器super默认是本类构造器的第一句。接下来是初始化块的语句,然后是成员赋默认值语句,最后才是本类构造器其他语句

    2.3构造顺序和对象状态

        2.3.1 静态

            2.3.1.1 父类 静态初始化块()

            2.3.1.2 父类 静态成员按声明顺序赋默认值(若父类还未被加载)

            2.3.1.3 本类 静态初始化块(若本类还未被加载)

            2.3.1.4 本类 静态成员按声明顺序赋默认值(若本类还未被加载)

        2.3.2 实例

            2.3.2.1 父类 构造器  

            2.3.2.2 本类 构造器的其他剩余部分

    2.4构造出错

        2.4.1不允许在任何构造块和构造函数中抛出checked异常,因为在代码中无法显式处理此checked异常。Java允许在在构造块和构造函数中抛出unchecked异常,但编译器可能要求必须有一个不抛出任何异常的分支

        2.4.2如果在静态构造块抛出异常,这个异常将无法处理

        2.4.3如果构造过程出现任何错误,引用将不会被赋值而保留原值

 

3.内部类:在类中声明的类

    3.1 作为外部类的成员

        3.1.1 static修饰静态内部类和非静态内部类

            3.1.1.1 构造方式:对于static内部类,只要外部类存在/被加载,就可通过new 外部类.内部类构造器来创建对象;对于非static内部类,则需要通过外部类的对象.new 内部类构造器来创建内部类对象。

        3.1.2 访问控制:

            3.1.2.1 内部类本身作为外部类的成员,内部类所有成员和所有嵌套外部类的所有成员都可以互相访问。

            3.1.2.2 作为类的成员,可以用4个访问修饰符修饰(普通的类只能用public和默认修饰),效果和普通成员一致

    3.2 作为类本身

        3.2.1 abstract修饰

        3.2.2 final修饰

        3.2.3 外部类访问某个内部类的成员或内部类访问外部类成员时,使用类名.this.成员。注意,此处说明非静态内部类对象隐式持有外部类对象的引用,显式设置外部类对象引用为null并不能被gc,导致内存泄漏。类名.super只指代Object类

    3.3 局部内部类:在方法内定义的类,访问范围只有本方法,故无访问修饰符,常用来实现返回值为接口的方法

    3.4 匿名内部类:不给定类名称,其他同局部内部类

4.final和immutable

    4.1 final:“字面值”不可修改,但引用的对象内容可以修改

        4.1.1修饰 类:该类不可被继承

        4.1.2修饰 方法:该方法不可被重写

        4.1.2修饰 成员变量:必须在构造器中显式初始化,随后不可改变,分配空间时的默认值不算初始化

        4.1.3修饰 静态变量:必须在静态初始化块中显式初始化,随后不可改变

        4.1.4修饰 局部变量:只能赋值一次,若在编译时可确定值(没访问普通变量),则会被编译器替换成字面常量

    4.2 immutable:该类对象内容不可修改,自动将所有成员设置为private final(表明不保证成员引用的对象不可修改)

5.异常:Java共有两种异常

    5.1 Error:Java虚拟机无法解决的严重错误,如JVM内部错误,资源耗尽。一般不编写针对性代码进行处理

    5.2 Exception:一般性问题,如空指针访问、文件不存在、网络中断等

你可能感兴趣的:(Java)