类的创建过程:
1.加载.class文件进方法区
2.如果有静态变量,先默认初始化,再显示初始化。
3.如果有静态代码块,要执行、仅一次。
4.通过new在堆内存中,开辟空间,并明确指向地址。
5.对对象中的属性进行默认初始化
6.调用对应的构造函数进行初始化
7.构造函数内部
8.对象初始化完毕后,将地址赋给创建者
继承
好处:提高了代码的复用性,让类与类产生了关系。
允许单继承,不直接支持多继承。单继承:一个子类只有一个父类;多继承:一个子类可以有多个父类。
如何在子类中直接访问同名的父类中的变量呢?
this:代表的是本类的对象的引用
super:代表的是父类内容空间
子类不能直接访问父类的私有方式
如果在子类中,对父类函数进行了重写,但仍需使用父类功能,则使用super。
重写的注意事项:
1.子类覆盖父类,必须保证权限大于/等于父类
2.静态覆盖静态
写法:必须一样(类型+名字)
子类中所有构造函数中的第一行都偶有一句隐式语句super();
子类默认调用父类的空参构造函数。
细节:
1.如果子类的构造函数第一行写了this调用本类的其他构造函数,不再有super()。因为this()/super()只能定义在构造函数第一行。
2.父类构造函数中也有super(),所有对象的父类是object。
final:是一个修饰符,可以修饰类,方法、变量(成员变量,局部变量,静态变量)
修饰的类是一个最终类,不能派生子类。
修饰的方法是最终方法,不可以给重写。
修饰的变量是一个常量,只能赋值一次。
abstract:抽象,定义了抽象函数的类也必须抽象,
抽象类:在描述事物时,没有足够的信息描述一个事物,这时该事物就是抽象事物。
特点;
1.抽象类/方法都要被abstract修饰,抽象方法一定要定义在抽象类中。
2.抽象类不可以创建实例,(调用抽象方法没有意义)。
3.只有覆盖了抽象类中的所有的抽象方法后,其子类才可以实例化,否则该子类还是一个抽象类。
抽象类一定是个父类,有构造函数,虽然不能给自己初始化,但可以给自己子类初始化。
抽象类与一般类的异同点:
同:1.都是用来描述事物的
2.都可以定义属性和行为
异:1.一般类可以具体的描述事物,抽象类描述事物的信息不具体。
2.抽象类中可以多定义一个成员:抽象函数
3.一般类可以创建对象,而抽象类不能创建对象。
抽象类 abstract不能和哪些关键字共存?
final private static