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关键字

Java中定义一个静态方法_静态代码块

this:
  • 1.this是一个关键字,全部小写
  • 2.this是什么,在内存方面是怎样的?
    一个对象一个this
    this是一个变量,是一个引用.this保存当前对象的内存地址,指向自身
    this存储在堆内存当中对象的内部
  • 3.this 只能使用在实例方法中.谁调用这个实例方法,this就是谁.
    所以this代表的是:当前对象
  • 4."this."大部分情况下可以省略
  • 5.为什么this不能使用在静态方法中?
    this代表当前对象,静态方法中不存在当前对象

Java中定义一个静态方法_System_02

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;
	}

}