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); }}