Java中一些其他修饰符,如super、static、final

时间:2021-07-15 21:09:10

super修饰符

super关键字与this类似,this用来表示当前类的实例,super用来表示父类。

super可以用在子类上,使用方式和this一样,通过点号(.)来在子类中获取父类的成员变量和方法。super也可以用在子类的类中,Java能自动上层追溯。

super关键字的功能:
  • 调用父类中声明为private的变量。
  • 可以调用在子类中已被覆盖了的方法。
  • 作为方法名表示父类构造方法。
注意:如果在子类的构造方法中使用super()调用父类的构造方法时,必须把super()放在子类的构造方法的第一行。
class Student extends People{
	public double score;
	public Student(double score){
	    super();//必须放在第一行
	    this.score=score;
	}
	
}

instanceof关键字

Java多态性带来了一个问题,就是如何判断一个变量所实际引用的对象的类型。C++中使用runtime-type iformation(RTTI),Java使用instanceof关键字。

public class Test {

	public void instanceofTest(Object obj){
		if(obj instanceof People){
			System.out.println("参数obj是一个People类型的对象");
		}else if(obj instanceof Teacher){
			System.out.println("参数obj是一个Teacher类型的对象");
		}else if(obj instanceof Student){
			System.out.println("参数obj是一个Student类型的对象");
		}
	}
	public static void main(String[] args) {
		Student student=new Student(100);
		Test test=new Test();
		test.instanceofTest(student);

	}

}
可以看出,如果变量引用的是当前类或当前类的子类,instanceof返回true,否则返回false。


static关键字

static修饰的变量

static修饰符能够与变量、方法一起使用,表示是“静态”的。

被static关键字修饰的变量、方法可以直接通过(类名.属性)这样的格式获取,不用对类进行实例化,并且static修饰的变量一般情况下都是大写。

staitc 的内存分配

静态变量属于类,不属于任何独立的对象,所以无需创建类的实例就能访问到静态变量。之所以会有这样的结果,是因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一次内存空间,虽然有多个实例,但这些实例共享该内存。实例变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立,互不影响,改变a对象的实例变量不会影响b对象。

注意:static的变量在类装载时就会被初始化。也就是说,只要类被装载,不管你是否使用了这个static变量,他都会被初始化。
static修饰的方法

调用静态方法也是通过(类名.方法名)这样即可。不需要实例化任何对象。

因为静态方法不能操作对象,所以不能在静态方法中访问实例变量,只能访问自身类的静态变量。

写过很多程序的人肯定注意到了,main()也是一个被static修饰的方法,不对任何对象进行操作。实际上,在程序启动时还没有任何对象,main()方法时程序的入口,将被执行并创建程序所需的对象。

关于静态变量和静态方法的总结:

  • 一个类的静态方法只能访问静态变量;
  • 一个类的静态方法不能够直接调用非静态方法;
  • 如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐;
  • 静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super;
  • 静态方法不能被非静态方法覆盖;
  • 构造方法不允许声明为 static 的;
  • 局部变量不能使用static修饰。

final修饰符

在Java中,声明类,变量和方法时,可以使用final关键字来修饰,final所修饰的数据具有“终态”的特征,表示“最终的”意思。具体规定如下:

  • final修饰的类不能被继承,如String类,StringBuffer,Integer...
  • final修饰的方法不能被子类重写。
  • final修饰的变量即称为常量,只能赋值一次,无法二次修改。
  • final修饰的成员变量必须在声明的同时赋值,如果在声明的时候赋值,那么只有一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。

final修饰符一般用于修饰那些通用性的功能、实现方法或取值不能随意被改变的数据,以避免被误用,例如数学类常量π=3.1415926、e=2.71828等。