1.静态代码块,构造代码块,构造方法,执行的先后顺序问题
/*执行过程:
1.jvm调用了main方法,main进栈
2.遇到Zi z =new Zi();会先将Fu.class和Zi.class分别加载进方法区,再创建对象,当Fu.class加载进内存
父类的静态代码块会随着fu.class一起加载,当zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
第一个输出,静态代码块Fu,第二个输出静态代码块zi
3.走zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,所以先走的父类的构造,但是在执行父类构造时
,发现父类有构造代码块,构造代码块是优先于构造方法执行的,所以第三个输出构造代码块fu,第四个输出构造方法fu
4.fu类初始化结束,子类初始化开始,第五个输出的是zi类的构造代码块,构造方法zi
*/
class Demo2_Extends {
public static void main(String[] args) {
Zi z = new Zi();
}
}
class Fu {
static {
System.out.println("静态代码块fu");
}
{
System.out.println("构造代码块fu");
}
public Fu () {
System.out.println("构造方法fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi () {
System.out.println("构造方法zi");
}
}
2./*执行过程:
继承中成员方法的关系
方法重写:
A.子父类出现了一模一样的方法(返回值类型可以是子父类)
B.方法重写的应用:当子类需要父类的功能,而功能主体子类有自己特有的内容的时候
可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
方法重写注意事项:
A.父类中的私有的方法不能被重写
因为父类私有的方法子类根本无法继承
B.子类重写父类方法时,访问权限不能更低
最好一致
C.父类静态方法,子类也必须通过静态方法进行重写
子类重写父类方法的时候,最好声明一摸一样
*/
class Demo2_Extends {
public static void main(String[] args) {
Zi z = new Zi();
z.print();//就近原则
z.method();
}
}
class Fu {
public void print () {
System.out.println("fu print");
}
}
class Zi extends Fu {
public void method () {
System.out.println("zi method");
}
public void print () { //重写
super.print();
System.out.println("zi print");
}
}
3./*final关键字
修饰类,类不能被继承
修饰变量,变量就成了常量,只能赋值一次
修饰方法,方法不能被重写
*/
class Demo1_Final {
public static void main(String[] args) {
Son s = new Son();
}
}
class Fu {
public final void print () {
System.out.println("父类");
}
}
class Son extends Fu{
public void print () {
System.out.println("子类");
}
}
/*final关键字
基本类型,是值不能改变
引用类型,是地址值不能被改变,对象中的属性可以改变
*/
class Demo1_Final {
public static void main(String[] args) {
final int NUM = 10;
//NUM = 20; //无法为最终变量赋值
final Person p = new Person("张三",23);
//p = new Person();
p.setAge(24);
}
}
class Person {
private String name;
private int age;
public Person () { }
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public void setName(String Name) {
this.name = name;
}
public String getName () {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge () {
return age;
}
}