static关键字
- 1.加static 的变量叫静态变量,不加static的叫做实例变量
- 2.静态变量在类加载时初始化,不需要new对象,静态变量存储在方法区
什么时候变量声明为实例的,什么时候声明为静态的?
如果这个类型的所有对象的某个属性值都是一样的,
不建议定义为实例变量,浪费内存空间.建议定义为类级别特征,
定义为静态变量,在方法区只保留一份,节省内存开销
一个对象一份的实例变量
所有对象一份的静态变量
实例的:一定要用引用.来访问
静态的:建议使用类名.方式来访问 - 3.空指针异常只有在什么情况下才会发生?
只有在空引用访问"实例相关"的,都会出现空指针异常 - 4.static静态代码块在什么时候执行?
类加载时执行,并且只执行一次
并且在main方法执行之前执行
一个类中可以有多个,并且按照自上而下顺序执行 - 5.静态代码块有什么用?
第一:静态代码块不是那么常用.(不是每一个类当中都要写的东西.)
第二:静态代码块这种语法机制实际上是sun公司给我们java程序员的一个特殊的时刻/
这个时刻叫做:类加载时机
具体的业务:
项目经理说了,大家注意 了,所有我们编写的程序中,只要是类加载了,请记录一下,
类记载的日志信息(在哪年哪月哪日几时几分几秒,哪个类加载到JVM当中了).
思考:这些记录日志的代码写到哪?
写到静态代码块当中
栈:方法只要执行,会压栈(局部变量)
堆:new出来的对象都会在堆中,垃圾回收器主要针对.(实例变量)
方法区:类的信息,字节码信息,代码片段(静态变量)
总结:到目前为止,你遇到的所有java程序,有顺序要求的是哪些?
- 1.对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的原则执行
第二:静态代码块1和静态代码块2是有先后顺序的
第三:静态代码和静态变量是有先后顺序的
*除了静态代码块之外,还有一种语句块叫做:实例语句块
- 2.实例语句在类加载时并没有执行
- 3.实力语句语法?
{
java语句;
java语句;
java语句;
}
- 4.实例语句在什么时候执行?
只要是构造方法执行,必然在构造方法执行之前,自动执行"实例语句块"中的代码
实例上也是sun公司为java程序员准备的一个特殊的时机,对象构造时机
public class CodeOrder{
//静态代码块
static{
System.out.println("A");
}
// 入门
// A X Y C B Z
public static void main(String[] args){
System.out.println("Y");
new CodeOrder();
System.out.println("Z");
}
//构造方法
public CodeOrder(){
System.out.println("B");
}
//实例语句块
{
System.out.println("C");
}
//静态代码块
static{
System.out.println("X");
}
}
this关键字
this:
- 1.this是一个关键字,全部小写
- 2.this是什么,在内存方面是怎样的?
一个对象一个this
this是一个变量,是一个引用.this保存当前对象的内存地址,指向自身
this存储在堆内存当中对象的内部 - 3.this 只能使用在实例方法中.谁调用这个实例方法,this就是谁.
所以this代表的是:当前对象 - 4."this."大部分情况下可以省略
- 5.为什么this不能使用在静态方法中?
this代表当前对象,静态方法中不存在当前对象
public class ThisTest04{
public static void main(String[] args){
//调用无参数的构造方法
Date d1 = new Date();
d1.detail();
Date d2 = new Date(2008,8,8);
d2.detail();
}
}
/*
需求:
1.定义一个日期类,可以表示年月日信息
2.需求中要求:
如果调用无参数构造方法,默认创建的日期为:1970年1月1日
当然,除了调用无参数构造方法之外,也可以调用有参数的构造方法来创建日期对象
*/
class Date{
//年
private int year;
//月
private int month;
//日
private int day;
//构造方法无参
public Date(){
//错误: 对this的调用必须是构造器中的第一个语句
//System.out.println("111");
//this.可以省略
/*
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 detail(){
// System.out.println(year+"年"+month+"月"+day+"日");
System.out.println(this.year+"年"+this.month+"月"+this.day+"日");
}
//setter and getter
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;
}
}