Java-对象创建和成员可见性

如果不提供对super()的显示调用,编译器将会提供不带参数的super()调用,这会导致调用超类的无参构造函数。如果不提供无参构造函数,编译器会调用自己提供的无参构造函数。这只会发生在没有为类定义任何其他构造函数的情况下;否则编译器将会抛出异常。
如果已经定义了构造函数(不管是无参还是有参的),编译器将不会提供无参构造函数

创建复制构造函数

public class TimeOfDay {
    private int hour, mins;
    public TimeOfDay(int hour, int mins) {
        this.hour = hour;
        this.mins = mins;
    }

    //创建一个复制构造函数
    public TimeOfDay(TimeOfDay timeOfDay) {
        this(timeOfDay.hour, timeOfDay.mins);
    }   
}
  • toString()方法默认会返回对象的引用。

  • 如果构造函数中没有使用this或super调用,编译器将会添加一条隐式的super()调用,这会调用父类无参的构造函数。如果父类构造函数中没有此类构造函数,编译器将会触发错误

  • 如果编写自己的构造函数,编译器将不会提供默认的构造函数

final

  • 类:
    声明final类,可确保其他类无法对这个类进行扩展
public class final MyClass {
}
  • 方法:
    如果不想让子类重写某个方法,可以给其设置final属性。
    由于private和static方法不能在子类中重写,所以他们总是引式的final
  • 变量
    使用final的变量会被认为是常量,将不允许再被做修改。
    final变量不需要在声明时就初始化,可以在声明后的其他地方进行初始化,但是只能初始化一次
    属性为final的变量如果在声明时没有初始化,那么它的初始化必须放在构造函数中,因为它只在对象的声明周期中调用一次。如果在构造函数中进行初始化,就必须在所有的构造方法中都进行初始化。
public class Student {
    public final int ID;
    public Student() {
        ID = 10;
    }
}
  • 类变量
    final类变量仅仅保存的是指向对象的引用,那么引用必须保持不变,而非对象。对象状态依旧是可以被改变。
    final类变量不能指向除初始化时设置的对象之外的任何对象。

成员可见性

理解以下表格即可

同包 同包 不同包 不同包
修饰符 同类 子类 非子类 子类 非子类
public Yes Yes Yes Yes Yes
private Yes No No No No
protect Yes Yes Yes Yes No
default Yes Yes Yes No No

你可能感兴趣的:(java,重识Java)