一. this
this只能在方法内部使用,表示对"调用方法的对象"的引用。
实例方法中隐藏的参数就是this,所以可以在方法内部直接调用同一个类的另一个方法.
- 当方法中的局部变量和成员变量重名时,可以用this表明用的是对象的成员变量
class Animal{
private String name;
public Animal(String name) {
this.name = name;
}
}
- 当方法需要该类的对象作为参数时,可用this代替
class Barber {
static People cutHair(People people) {
people.loseHair();
return people;
}
}
class People {
People getNewHair() {
return Barber.cutHair(this);
}
public void loseHair() {
}
}
- 外部类名.this的形式表示外部类的对象的引用
public class Outer {
String color = "red";
class Inner {
void print() {
String value = Outer.this.color;
}
}
}
- 在构造函数中可以用this调用另一个构造函数
class Student {
private String name;
private int age;
public Student(String name) {
this(name, 20);
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
- 当方法需要返回当前对象的引用时,可以return this.
class NumberResult {
int i = 0;
NumberResult increase() {
i++;
return this;
}
void print() {
System.out.printf("i = " + i);
}
}
this指向一个对象实例,所以静态方法中没有this引用
二. super
super指向 离自己最新的父类对象的指针
- super.xxx引用父类的成员或方法
class Person{
String name ="father";
}
class Child extends Person{
String name = "son";
public void print(){
System.out.printf("子类 = "+name+", 父类 = "+super.name);
}
}
- 调用父类的构造方法
class Person{
String name ="father";
Person(String name){
this.name = name;
}
}
class Child extends Person{
String name = "son";
Child(String name){
super(name);
this.name = name;
}
public void print(){
System.out.printf("子类 = "+name+", 父类 = "+super.name);
}
}
三. static
static关键字可以修饰变量,方法,内部类,块
1. static变量
static只能修饰成员变量,不能修饰局部变量
-static变量是对于整个类而言的,但是局部变量只用在某个方法内部使用
静态变量和非静态变量的区别:
静态变量被所有的对象共享,内存中只有一份[方法区内],在类初次加载时会被初始化。
非静态变量是对象所拥有的,在创建对象时被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化
2. static方法
static方法没有this对象
在static方法的内部不能调用非static方法,反之可以。
可以在没有创建对象的前提下,通过类本身来调用static方法
构造方法中可以使用this,所以构造方法不是静态的
3. static内部类
内部类:1.只为其外部类使用 2.含有外部类引用 3.可以直接访问外部类属性 4.每个内部类能独立继承一个接口
static内部类不含有外部类的引用
4. static块
类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次【根据class加载原理 每个类加载一次 使用双亲委托加载】
四. final
final可以修饰变量,方法和类
final变量 一旦被赋值,不能被修改 (final修饰的成员变量必须由程序员显式的指定初始值,系统不会隐式初始化)
- final修改成员变量必须要赋值,而且只能初始化一次。
如果修饰的成员变量是一个引用,指向引用的内容是可以改变的
-
final方法不能被重写
-
final类无法被继承