this关键字
this表示的是当前对象本身,更准确地说,this代表当前对象的一个引用,可以调用该类的属性,方法,构造器。
当在方法内需要用到调用该方法的对象时就可以使用this。
使用this调用成员变量
当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量时类成员
public Persion(String name, int age) {
this.name = name;
this.age = age;
}
使用this调用方法。
调用当前对象的其他方法(可以省略)
位置:任意
public void getInfo(){
System.out.println("姓名:" + name) ;
this.speak();
}
public void speak(){
System.out.println(“年龄:” + this.age);
}
构造方法中使用this来调用其它构造方法。
位置:必须是第一条语句
public Persion(String name, int age) {
this.name = name;
this.age = age;
}
public Persion(String name, int age,double salary) {
this(name,age);
this.salary = salary;
}
super关键字
使用场景
super可用于调用父类中定义的成员方法
super可用于在子类构造方法中调用父类的构造器,必须在构造器中的第一句,且不能同时出现this调用本类中其他的构造方法
this和super的区别
No. | 区别点 | this | super |
1 | 访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 访问父类中的属性 |
2 | 调用方法 | 访问本类中的方法
| 直接访问父类中的方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
4 | 特殊 | 表示当前对象 | 无此概念 |
static关键字
static修饰成员变量
static修饰的成员变量为静态成员变量 ,或者叫做: 类属性,类变量.注意:static不能修饰局部变量。
它为该类的公用变量,属于类,对于该类的所有对象来说,static成员变量只有一份,被该类的所有对象共享,如果一个对象修改了类变量都将影响其他对象对这个类变量的调用
可以使用”对象.类属性”来调用。不过,一般都是用“类名.类属性”
static变量存放在静态域中
static修饰方法
不需要对象,就可以调用(类名.方法名)
静态方法不能以任何方式引用this和super关键字,因为this,super都是对象的引用,它在内存中是在静态方法加载后出现的,所以无法访问
静态方法中不可以访问非静态变量,非静态方法,只能访问静态变量和静态方法
理解:加载类的时候就加载静态变量和静态方法,此时可能还没有创建对象,所以非静态变量和非静态的方法还没有分配空间,无法访问
非静态方法中可以访问静态方法或者静态变量
理解:加载类的时候就已经加载静态变量和静态方法,创建对象后,非静态变量和非静态的方法才分配空间,此时静态变量和静态方法已经存在,可以访问
重载的方法需要同时为static的或者非static的
static修饰代码块
如果希望加载后,对整个类进行某些初始化操作,可以使用static静态代码块。
类第一次被载入时先执行static代码块;类多次载入时,static代码块只执行一次;Static经常用来进行static变量的初始化。
是在类初始化时执行,不是在创建对象时执行。
静态初始化块中不能访问非static成员。
static修饰内部类
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
}
}
final关键字
1.final修饰变量,成为常量,值不能再变化
--final修饰基本数据类型,值只能赋值一次,后续不能再赋值
--final修饰引用数据类型,不能变化的引用变量的值,可以变化的是对象的属性
2.final修饰方法,不能被子类重写
3.final修饰类,不能再有子类,如String类、StringBuffer、System
4.final不能修饰构造方法
5.static final 修饰的变量是全局静态常量