JavaSE--this和static
一、static关键字
1、static
- static翻译为“静态的”
- 所有static关键字修饰的都是类相关的,类级别的
- 所有static修饰的,都通过“类名.”的方式访问
- static修饰的变量:静态变量
- static修饰的方法:静态方法
成员变量分为:实例变量、静态变量
class VarTest{
// 以下实例的,都是对象相关的,访问时采用“引用.”的方式访问,需要先new对象
// 必须先有对象,才能访问,可能会出现空指针异常
// 成员变量
int i;
// 实例方法
public void m2(){
}
// 以下静态的,都是类相关的,访问时次啊用“类名.”的方式访问,不需要new对象
// 不需要对象参与,没有空指针异常
// 静态变量
static int k;
// 静态方法
// 注意::也可以使用“引用.”来访问,不建议用(因为其他程序员看见会困惑)
public static void m1(){
}
}
2、什么时候使用static关键字
// 定义一个类:中国人
class Chinese{
// 身份证号
String idCard;// 一个对象一个身份证号,所以应该是实例变量
// 姓名
String name;// 一个对象一个姓名
// 国籍
// 对于中国人这个类来说 国籍都是“中国”,不会随着对象的改变而改变
// 显然国籍不是对象级别特征
// 国籍属于整个类的特征
static String country = "中国";// 注意::静态变量在类加载是初始化,不需要new对象,静态变量的空间就开出来了
// 注意::静态变量在方法区
// 空引用时静态不会为空指针
public Chinese(){
}
}
3、关于方法来说:什么是定义为实例方法、什么时候定义为静态方法
当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法
大部分情况下,如果是工具类的话,工具类中的方法一般都是静态
4、静态代码块
1)使用static关键字可以定义:
静态代码块
2)静态代码块语法
static{
java语句;
java语句;
}
3)静态代码块什么时候执行
类加载的时候执行,并且只执行一次
注意:静态代码块在类加载时执行,并且在main方法之前执行
4)静态代码块作用
- 不是很常用(不是每个类当中都用)
- 静态代码块这种语法机制实际上是sun公司给java 程序员的一个特殊时刻,这个实际叫做类加载时机
- 具体例子:比如想要记录一下类加载的日志信息(在哪年哪月哪分哪秒哪个类加载到了jvm中)
5、实例语句块
- 实例块在类加载的时候不会执行
- 实例块在构造方法之前执行,只要构造方法执行,实例块就会先执行
- 这叫做对象构建时机
public class InstanceCode{
public static void main(String[] args){
System.out.println("main begin");
new InstanceCode();
}
// 实例语句块
{
System.out.println("实例语句块执行");
}
public InstanceCode(){
System.out.println("无参构造");
}
public InstanceCode(String name){
System.out.println("有参构造");
}
}
二、this关键字
1、this
- this是一个变量,是一个引用。this保存当前对象的内存地址,指向自身
- 一个对象一个this。严格来说,this代表的就是“当前对象”,this存储在堆内存当中对象的内部。
- this只能使用在实例方法中,谁调用这个实例方法this就是谁
- this大部分情况下是可以省略的
- this什么时候不能省略
- 在实例方法中或构造方法中,为了区分局部变量和实例变量
class Customer{
private String name;
public Customer(){
}
/*
形式参数s没有可读性
public Customer(String s){
name = s;
}
*/
public Customer(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public void shopping(){
// this就是当前对象
System.out.println(this.name + "shopping");
// this可以省略,省略的话还是默认访问“当前对象”的name
// System.out.println(name + "shopping");
}
}
2、this不仅可以使用在实例方法中,也可以使用在构造方法中
通过当前的构造方法去调用同一个类中的另一个构造方法,使用新语法格式:this(实际参数);
注意::this();调用只能出现构造方法的第一行
/*
定义日期类,可以表示年月日
无参构造:调用默认创建日期1970年1月1日
有参构造:
*/
class Date{
private int year;
private int month;
private int day;
public Date(){
// 调用无参构造初始化日期为固定值
// this.year = 1970;
// this.month = 1;
// this.day = 1;
this(1970,1,1);// 构造本类的另一个构造方法
}
public Date(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public void setYear(int year){
this.year = year;
}
public int getYear(){
return year;
}
public void setMonth(int Month){
this.month = month;
}
public int getMonth(){
return month;
}
public void setDay(int day){
this.day = day;
}
public int getDay(){
return day;
}
}