static 关键字
1.静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。
class People{
private int age; //实例变量
private static String name; //静态成员变量
public void eat(){ //成员方法
System.out.println("eat()");
}
}
注意:
- 局部变量不能被声明为 static 变量
- 静态成员变量: 位于“方法区”,无论多少个对象该变量在内存中都只有一份
- 非静态成员变量:位于“堆空间”,每 new 一个对象创建一份,因此有多少个对象该变量在内存就有多少份
2.静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量,静态方法中不能用this引用。静态方法从参数列表得到数据,然后计算这些数据。静态方法也被称为类方法。一般用类名访问。
静态成员方法访问方式:“类名.静态方法”
例:Arrays.copyOf(arr,arr.length);
class People{
private int age; //实例变量
private static String name; //静态成员变量
public void printAge(){ //普通成员方法
System.out.println(age);
}
public static void printName(){ //静态成员方法
System.out.println(name);
}
}
静态方法只能访问类中的静态成员变量:
- 由于在调用静态成员方法时,并不会将对象的引用传递过去,因此不能访问对象的非静态成员变量。
- 而且由于静态成员方法通常以“类名.静态方法”的形式访问,如果可以访问“非静态成员变量”,那么编译器也就无法确定:访问的“非静态成员变量”是属于哪个对象,在内存中的位置,甚至根本就还没有对象,为避免这种情况的出现,编译器一定不会允许“静态成员方法”访问“非静态成员变量。
final 关键字
使用关键字 final 作为字段的修饰符,可以声明常量字段。
例:public final int age = 18;
注意:
- 常量字段必须在声明时进行赋值或者在类的构造方法或者初始化代码中被赋值一次,否则会产生编译错误。
- 在其他位置上常量字段不能被修改,否则也会产生编译错误。
- 常量字段可以是静态常量字段或者实例静态常量字段。
- 常量的名称一般才有大写,多个字之间用下划线连接。常量字段一般声明为 public static final。
- final修饰的方法不能被重写。
- final修饰的类不能被继承。
this 关键字
1.this 关键字引用类的当前实例,当在一个类中要明确指出使用对象自己的的变量或方法时就应该加上 this 引用,例如:
public void fun(String name,int age){
this.name=name;
this.age=age;
}
注:静态成员方法中不能使用 this 关键字
2.this 关键字调用其它类型的构造函数
class People{
private int age;
private static String name;
public People(int age,String name){{
this.age = age;
this.name = name;
}
public People(){
this(18,"lisi");
}
}
调用构造函数应该注意:
- 在构造函数中调用另一个构造函数,调用动作必须置于最起始的位置(代码首行)。
- 不能在构造函数以外的任何函数内调用构造函数;
- 在一个构造函数内只能调用一个构造函数。
super 关键字
super 关键字的用法:
- super关键字引用父类 , 用于从派生类访问基类的成员。
- 派生类要调用基类的构造方法 super()(无参方法),super()只能在派生类的构造方法中调用,位于方法首行。
- 调用基类已被其他方法重写的方法。
- 访问基类的成员:super.成员变量、super.成员方法。
class People{
private int age;
private static String name;
public People(int age,String name){{
this.age = age;
this.name = name;
}
public void eat(){
System.out.println("eat()");
}
}
class Student extends People{
private String school_name;
public Student(int age,String name,String school_name){
super(age,name); //位于代码首行
this.school_name = school_name;
}
public void food(){
super.eat();
System.out.println("food()");
}
}
注意:
- this 关键字引用类的当前实例(子类),只能调用子类中的成员,无法访问父类的成员;super关键字引用父类。
- 子类显式调用父类的构造方法,super()必须写在子类构造方法的第一行。
- super()和this()不能出现在一个构造方法中。