对象创建
创建子类对象时,所有的父类对象都会被创建。
构造函数从顶层父类开始一直向下,直到子类被实例化。
子类构造函数中不提供对super()的显示调用,编译器会调用父类的无参数构造函数。
如果父类未提供无参构造函数,编译器会默认提供一个无参构造函数,这只会发生在没有为类定义任何其他构造函数的情况下
如果类已经定义了构造函数(无参/有参),编译器将不会提供无参构造函数
super调用父类,this调用当前类
方法重载
方法名称相同,参数个数和顺序不同
多个构造函数,在构造函数的实现中this或super调用只能出现一个且必须出现在第一行。
创建复制构造函数
用一个已经实例化的对象来new另一个对象,获得两个独立对象
深复制
public class Student {
private String name;
private int age;
private int sex;
// 构造方法
public Student() {
}
// 拷贝构造方法
public Student(Student t) {
super();
this.name = t.name;
this.age = t.age;
this.sex = t.sex;
}
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student(student1);
student1.name = "name1";
student2.name = "name2";
System.out.println("student1.name:" + student1.name);
System.out.println("student2.name:" + student2.name);
System.out.println("student1:" + student1);
System.out.println("student2:" + student2);
}
}
输出:
student1.name:name1
student2.name:name2
student1:demo1.Student@7852e922
student2:demo1.Student@4e25154f
final关键字 限制扩展或修改
final类
public final class MyClass {
}
public class MyClass2 extends MyClass {
}
//The type MyClass2 cannot subclass the final class MyClass
不可以被继承
final方法
public class MyClass {
public final String getName() {
return this.getClass().getName();
}
}
public class MyClass2 extends MyClass {
public String getName() {
return super.getClass().getName();
}
}
//Cannot override the final method from MyClass
private、static方法也不能被子类重写
final变量
public class MyClass2 extends MyClass {
public final String NAME = "lzg";
}
final变量以大写字母命名,单词之前用下划线分隔
final变量不能被修改,类中的final变量视作常量
final变量声明时可以不用初始化,叫做空缺final变量
空缺final变量必须在构造函数中初始化,且只能初始化一次
空缺final变量在使用前必须进行初始化
final类变量
final类变量只能指向当前类对象的引用
可以调用当前对象的方法来改变当前对象的状态,但是不能给final类变量指向一个新的实例
访问修饰符
public 任意类可见
protected 当前类可见,子类可见,相同包的类可见
private 当前类内部可见
default 相同包可见
| 当前类 | 子类(同包) | 子类(不同包) | 其它类(同包) | 其它类(不同包) |
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | × |
private | √ | × | × | × | × |
default | √ | √ | × | √ | × |
继承相关规则
子类中重写方法的可见性不能小于父类中的方法在