浅议java中的final、static关键字

时间:2021-02-02 18:22:56

final可以修饰的对象有:

变量:被final修饰的变量称为常量,一旦被赋值,不能被改变。

方法:如果一个方法被final修饰,则说明该方法不能被子类覆盖。

类:如果一个类被final修饰,则说明该类不能被继承。


static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。


但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。

想要对对象中相同的数据,来进行数据的共享,就可以对该变量进行修饰,修饰符为static。
被static所修饰的变量存放在方法区当中。
方法区存放的内容:
所有的对象都能共享的内容。又叫共享数据区。

static的关键:
1、被static修饰的成员变量,能够被所有的对象共享。
2、static的生命周期:随着类的加载而加载,随着类的消失而消失。
3、静态时优先于对象而存在的。
4、静态成员可以直接用类名进行调用,也可以用对象名调用。

静态存在时还没有对象,static内容需要被调用的话,此时只有类能完成。
所以建议用类名来调用静态成员。

静态数据:共有的,每个对象都有统一的数据,然后存在方法区当中。
特有数据:存放在对象当中的数据,存放在堆内存当中。

注意:
1、静态方法中只能直接调用静态成员。
          如果在静态方法中调用了非静态成员,那么非静态成员对用的数据或运算,就要找对象,但是静态成员是优先于对象而存在的,所有的静态方法都没有对象,也就无法使用非静态成员。
      非静态的方法既可以调用静态成员也可以调用非静态成员。
2、在静态方法中不允许出现this super关键字。
this就代表对象。静态当中没对象。

静态成员只能访问静态内容。 

静态变量和非静态变量之间的区别:
1、非静态变量又称为实例变量,静态变量又被称为类变量。
2、非静态成员变量随着对象的创建而存在,随着对象的消失而消失。
   静态成员变量是随着类的加载而加载,随着类的结束而消失。
3、非静态成员变量是存放在堆内存中的,
   静态成员变量是存放在方法区当中的。
4、非静态成员变量只能被对象调用,
   静态成员变量可以被类名调用,也可以被对象调用。

成员变量:
成员变量的值,如果每个对象都相同时,那么就用static修饰,被所有的对象共享。
成员函数:
当函数中访问到了对象中所特有的属性时,那么函数就不能被static修饰。

如果一个类中定义的方法都是静态的,这个类普遍称之为工具类。

静态代码块的特点:
1、随着类的加载而运行,只执行一次。
2、优先于主函数执行。

作用:给类进行初始化。

      如:如果类本身是不需要创建对象的,给类进行初始化就用静态代码块。


示例代码如下:

package com.basic.exercise;

public class Student {
private String name;
private String id;
static String Country="中国";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public static void study(){
System.out.println("好好学习,天天向上!!!");
}
//非静态方法可以调用静态成员变量和成员函数
public void show(){
study();
System.out.println(Country);
}
}

package com.basic.exercise;public class Test {	static int x=0;	public static void main(String[] args) {		// TODO Auto-generated method stub		Student stu1=new Student();		Student stu2=new Student();		//对象可以调用静态成员变量		stu1.Country="美国";		System.out.println(stu2.Country);		System.out.println(Student.Country);		show();	}	public static void show() {		// TODO Auto-generated method stub				//静态方法只能调用静态成员变量		System.out.println("x="+x);	}}