Java面向对象之super、this和初始化块

一、super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。(代表对象。就是所在函数所属对象的引用。)
this到底代表什么呢?哪个对象调用了this所在的函数,this就代表哪个对象,就是哪个对象的引用。
开发时,什么时候使用this呢?
在定义功能时,如果该功能内部使用到了调用该功能的对象,这时就用this来表示这个对象。
this 还可以用于构造函数间的调用。
调用格式:this(实际参数);
  this对象后面跟上 . 调用的是成员属性和成员方法(一般方法);
  this对象后面跟上 () 调用的是本类中的对应参数的构造函数。
注意:用this调用构造函数,必须定义在构造函数的第一行。因为构造函数是用于初始化的,所以初始化动作一定要执行。否则编译失败。
示例代码截图如下:

public class Bird {
	int weight = 5;	
	// --方法
	public void fly() {
		System.out.println("我是鸟,我可以飞!");
	}	
}

public class Ostrch extends Bird {
	int weight = 10;
	// 重写父类的方法 (override)
	public void fly() {
		System.out.println("我是鸵鸟,虽然我是鸟但我不能飞!");
	}
	// super this 关键字
	public void spuerThisDemo() {
		// this,调用自身的方法或成员变量
		System.out.println(this.weight);
		this.fly();
		// super,子类中调用父类的方法或成员变量
		System.out.println(super.weight);
		super.fly();
	}
}

public class TestDemo {
	public static void main(String[] args) {
		// 实例化 Eagle
		Ostrch ostrch = new Ostrch();		
		// 调用方法
		ostrch.fly();
		System.out.println("---------------------");
		ostrch.spuerThisDemo();
	}
}

结果截图:
在这里插入图片描述
二、初始化块
初始化块根据是否使用static修饰分为两类:
(1)不使用static修饰的是初始化块
(2)使用static修饰的是静态初始化块
初始化块:
(1)初始化块相当于是对构造器的补充,用于创建对象时给对象的初始化,在构造器之前执行;
(2)如果一段初始化代码对所有构造器完全相同,且无需接收参数,那就可以将其提取到非静态初始化代码块中;
(3)实际上,经过编译后,非静态块已经添加到构造器中,且位于所有构造器代码的前面。
静态初始化块:
(1)静态初始化块用static修饰,又叫类初始化块;
(2)静态初始化块负责对类进行初始化,因此类初始化块是在类初始化阶段就执行;
(3)静态块跟静态方法一样,不能访问非静态成员;
(4)因为静态块是在类的初始化阶段完成的,因此在创建某个类的第二个对象时,该类的静态块就不会执行了
1、单个类中初始化块、静态初始化块、构造器的执行顺序:
在单个类中,静态初始化块(多个时从上往下执行),初始化块(多个时从上往下执行),构造器
示例代码:

public class ClassDemo1 {
	public ClassDemo1() {
		System.out.println("ClassDemo1构造器");
	}
	{
		System.out.println("ClassDemo1 初始化块1");
	}
	{
		System.out.println("ClassDemo1 初始化块2");
	}	
	static {
		System.out.println("ClassDemo1 静态初始化块1");
	}
	static {
		System.out.println("ClassDemo1 静态初始化块2");
	}
}
 

public class Test {
	public static void main(String[] args) {
		ClassDemo1 classDemo1=new ClassDemo1();
	}
}

结果截图如下:
在这里插入图片描述
2、多个类的继承中初始化块、静态初始化块、构造器的执行顺序:
在继承中,先后执行父类A的静态块,父类B的静态块,最后子类的静态块,然后再执行父类A的非静态块和构造器,然后是B类的非静态块和构造器,最后执行子类的非静态块和构造器
示例代码:

public class BaseOne {
    public BaseOne(){
        System.out.println("BaseOne构造器");
    }    
    {
        System.out.println("BaseOne初始化块");
    }    
	static {
        System.out.println("BaseOne静态初始化块");
    }
}



public class BaseTwo extends BaseOne{
	public BaseTwo(){
        System.out.println("BaseTwo构造器");
    }    
    {
        System.out.println("BaseTwo初始化块");
    }    
	static {
        System.out.println("BaseTwo静态初始化块");
    }
}

 
public class BaseThree extends BaseTwo{
	public BaseThree(){
        System.out.println("BaseThree构造器");
    }    
    {
        System.out.println("BaseThree初始化块");
    }    
	static {
        System.out.println("BaseThree静态初始化块");
    }
}
 

public class Demo2 {
	public static void main(String[] args) {
		BaseThree baseThree=new BaseThree();
		System.out.println("---在创建第二个对象时,该类的静态块就不会执行了---");
		BaseThree  baseThree2=new BaseThree();
	}
}

结果截图如下:
在这里插入图片描述
总结:
static:键字,是一个修饰符,用于修饰成员(成员变量和成员函数)。
特点:
1,想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰。
2,被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。
3,静态随着类的加载而加载。而且优先于对象存在。
弊端:
1,有些数据是对象特有的数据,是不可以被静态修饰的。因为那样的话,特有数据会变成对象的共享数据。这样对事物的描述就出了问题。所以,在定义静态时,必须要明确,这个数据是否是被对象所共享的。
2,静态方法只能访问静态成员,不可以访问非静态成员。
因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。
3,静态方法中不能使用this,super关键字。
因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。
4,主函数是静态的。
注意:静态的生命周期很长。
静态代码块:就是一个有静态关键字标示的一个代码块区域。定义在类中。
作用:可以完成类的初始化。静态代码块随着类的加载而执行,而且只执行一次(new 多个对象就只执行一次)。如果和主函数在同一类中,优先于主函数执行。
静态代码块、构造代码块、构造函数同时存在时的执行顺序:
静态代码块 ——> 构造代码块 ——> 构造函数;

猜你喜欢

转载自blog.csdn.net/weixin_44563573/article/details/92406537