static
static是Java语言中的关键字,表示“静态的”,可以用来修饰变量、方法、代码块等,static修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。
(1)在Java语言中凡是用 static修饰的都是类相关的,不需要创建对象,直接通过“类名”即可访问。
(2)当一个属性是类级别的属性,所有对象的这个属性的值是一样的,建议定义为静态变量。
静态变量
Java中的变量包括局部变量和成员变量,在方法体中声明的变量为局部变量,局部变量存储在栈中,方法结束之后局部变量的内存就会释放掉。在类体中声明的变量为成员变量,成员变量又包括实例变量和静态变量。
成员变量声明时使用了static关键字则称为静态变量,没有使用static关键字称为实例变量。两者的区别如下:
- 实例变量必须先创建对象通过"引用."的方式去访问,静态变量访问时则不需要创建对象,直接通过"类名."的方式访问。
- 实例变量存储在堆内存中,静态变量存储在方法区中。
- 实例变量在构造方法执行过程中初始化,静态变量在类加载时初始化。
当一个类的所有对象的某个“属性值”不会随着对象的改变而变化的时候,建议将该属性定义为静态属性。
静态方法
实际开发中,一般将“工具类”中的方法定义为静态方法,而需要对象参与时方法应定义为实例方法。将方法定义为静态方法比较方便使用,不需要创建对象,直接使用类名就可以访问。
[修饰符列表] static 返回值 方法名(形参列表){
方法体
}
静态代码块
静态代码块在类加载时执行,并且只执行一次。如果要在类加载的时候解析某个文件,并且要求该文件只解析一次,那么此时就可以把解析该文件的代码写到静态代码块当中。
类{
// 静态代码块
static{
Java 语句;
}
}
静态代码块遵循自上而下的顺序依次执行,并且在main方法执行前执行,这是因为静态代码块在类加载时执行,并且只执行一次。
this
this是一个引用,保存了当前对象的内存地址并指向自身,任何一个堆内存的java对象都有一个this。this使用在构造方法和实例方法中,不能在静态方法中使用,语法格式为"this.“和"this(…)”。
this不能出现在 static的方法中,可以出现在实例方法中,代表当前对象,大部分情况下 this都是可以省略的,只有当在实例方法中区分局部变量和实例变量的时候不能省略。
this使用在构造方法中
this使用在构造方法的第一行,通过当前构造方法调用本类中其他构造方法实现代码复用时,语法格式为:this(实际参数列表)
public class Date{
private int year;
private int month;
private int day;
// 业务要求,默认创建日期为2000年1月6日
public Date(){
// this(实际参数列表)调用有参构造方法,实现代码复用
this(2000,1,6)
}
// setter and getter
public int getYear(){
return year;
}
public void setYear(int year){
this.year=year
}
public int getMonth(){
return month;
}
public void setMonth(int month){
this.month=month
}
public int getDay(){
return day;
}
public void setDay(int day){
this.day=day
}
}
public class DateTest{
public static void main(String[] args){
Date d1=new Date();
// 调用无参构造,结果为默认值: 2000年1月5日
System.out.println(d1.getYear()+"年"+d1.getMonth()+"月"+d1.getDay()+"日");
Date d2=new Date(2008,8,8);
// 调用有参构造,结果为: 2008年8月8日
System.out.println(d2.getYear()+"年"+d2.getMonth()+"月"+d2.getDay()+"日");
}
}
super
super与this可以对比着学习
this:
- this是一个引用,保存内存地址指向自己
- this出现在实例方法中,谁调用这个实例方法,this就代表谁,this代表当前正在执行该动作的对象。
- this不能出现在静态方法中
- this大部分情况可以省略,在方法中区分实例变量和局部变量时不能省略
- this(实际列表参数)出现在构造方法的第一行,通过当前的构造方法调用本类当中其他的构造方法
super:
- super并不是引用,只是一个关键字,代表当前对象中从父类继承过来的那部分特征。
- super和this都可以使用在实例方法中
- super不能使用在静态方法中,因为super代表了当前对象上的父类特征,静态方法中没有this,肯定也不能使用super
- super(实际参数列表)用法通过当前的构造方法调用父类的构造方法
super使用在构造方法中
语法格式为super(实际参数列表),this和super都只允许出现在构造方法的第一行。“super(实际参数列表)”这种语法表示子类构造方法执行过程中调用父类的构造方法。
super.什么时候不能省略
父类和子类中有同名属性,或者说有同样的方法,
想在子类中访问父类的,super. 不能省略。
super的使用:
super.属性名 【访问父类的属性】
super.方法名(实参) 【访问父类的方法】
super(实参) 【调用父类的构造方法】