static和this关键字

目录

1、static关键字

2、Java中三大变量

3、什么时候使用静态变量

4、实例变量、实例方法、静态变量、方法访问调用(静态的不存在空指针异常)

4.1实例变量和静态变量的访问

 4.2实力方法与静态方法的调用

5、什么时候定义为静态方法和实例方法

6、静态代码块

7、静态代码块和静态变量的执行时机和顺序

8、实例代码块执行时机

9、综合代码执行顺序

10、this

11、this的内存结构及应用

12、this不能省的情况

13、this()的用法

14、大总结



1、static关键字


    1.1、static修饰的统一都是静态的,都是类相关的,不需要new对象。直接采用“类名.”访问。
    1.2、当一个属性是类级别的属性,所有对象的这个属性的值是一样的,建议定义为静态变量。
    

/*
	static:
		1、static翻译为“静态”
		2、所有static关键字修饰的都是类相关的,类级别的。
		3、所有static修饰的,都是采用“类名.”的方式访问。
		4、static修饰的变量:静态变量
		5、static修饰的方法:静态方法
	
	变量的分类:
		变量根据声明的位置进行划分:
			在方法体当中声明的变量叫做:局部变量。
			在方法体外声明的变量叫做:成员变量。
		
		成员变量又可以分为:
			实例变量
			静态变量
*/

class VarTest{

	// 以下实例的,都是对象相关的,访问时采用“引用.”的方式访问。需要先new对象。
	// 实例相关的,必须先有对象,才能访问,可能会出现空指针异常。
	// 成员变量中的实例变量
	int i;

	// 实例方法
	public void m2(){
		// 局部变量
		int x = 200;
	}


	// 以下静态的,都是类相关的,访问时采用“类名.”的方式访问。不需要new对象。
	// 不需要对象的参与即可访问。没有空指针异常的发生。
	// 成员变量中的静态变量
	static int k;

	// 静态方法
	public static void m1(){
		// 局部变量
		int m = 100;
	}
	
}

 2、Java中三大变量

3、什么时候使用静态变量

/*
	什么时候变量声明为实例的,什么时候声明为静态的?
		如果这个类型的所有对象的某个属性值都是一样的,
		不建议定义为实例变量,浪费内存空间。建议定义
		为类级别特征,定义为静态变量,在方法区中只保留
		一份,节省内存开销。
	
	一个对象一份的是实例变量。
	所有对象一份的是静态变量。
*/
/*
public class StaticTest02{
	public static void main(String[] args){
		Chinese c1 = new Chinese("1231456456456456","张三","中国");
		System.out.println(c1.idCard);
		System.out.println(c1.name);
		System.out.println(c1.country);

		Chinese c2 = new Chinese("7897897896748564","李四","中国");
		System.out.println(c2.idCard);
		System.out.println(c2.name);
		System.out.println(c2.country);
	}
}

// 定义一个类:中国人
class Chinese{

	// 身份证号
	// 每一个人的身份证号不同,所以身份证号应该是实例变量,一个对象一份。
	String idCard; 

	// 姓名
	// 姓名也是一个人一个姓名,姓名也应该是实例变量。
	String name;

	// 国籍
	// 对于“中国人”这个类来说,国籍都是“中国”,不会随着对象的改变而改变。
	// 显然国籍并不是对象级别的特征。
	// 国籍属于整个类的特征。整个族的特征。
	// 假设声明为实例变量,内存图是怎样的?
	// 假设声明为静态变量,内存图又是怎样的?
	String country;

	// 无参数
	public Chinese(){
	
	}

	// 有参数
	public Chinese(String s1,String s2, String s3){
		idCard = s1;
		name = s2;
		country = s3;
	}
}
*/

public class StaticTest02{
	public static void main(String[] args){
		// 访问中国人的国籍
		// 静态变量应该使用类名.的方式访问
		System.out.println(Chinese.country);

		Chinese c1 = new Chinese("1231456456456456","张三");
		System.out.println(c1.idCard);
		System.out.println(c1.name);

		Chinese c2 = new Chinese("7897897896748564","李四");
		System.out.println(c2.idCard);
		System.out.println(c2.name);

		// idCard是实例变量,必须先new对象,通过“引用.” 访问
		// 错误: 无法从静态上下文中引用非静态 变量 idCard
		//System.out.println(Chinese.idCard);
	}
}

// 定义一个类:中国人
class Chinese{

	// 身份证号
	// 每一个人的身份证号不同,所以身份证号应该是实例变量,一个对象一份。
	String idCard; 

	// 姓名
	// 姓名也是一个人一个姓名,姓名也应该是实例变量。
	String name;

	// 国籍
	// 重点重点五颗星:加static的变量叫做静态变量
	// 静态变量在类加载时初始化,不需要new对象,静态变量的空间就开出来了。
	// 静态变量存储在方法区。
	static String country = "中国";

	// 无参数
	public Chinese(){
	
	}

	// 有参数
	public Chinese(String s1,String s2){
		idCard = s1;
		name = s2;
	}
}

将country设为实例变量内存图 

将country设为静态变量内存图 

4、实例变量、实例方法、静态变量、方法访问调用(静态的不存在空指针异常)

4.1实例变量和静态变量的访问

/*
	实例的:一定需要使用“引用.”来访问。

	静态的:
		建议使用“类名.”来访问,但使用“引用.”也行(不建议使用"引用.")。
		静态的如果使用“引用.”来访问会让程序员产生困惑:程序员以为是实例的呢。
	
	结论:
		空指针异常只有在什么情况下才会发生呢?
			只有在“空引用”访问“实例”相关的,都会出现空指针异常。
*/
public class StaticTest03{
	public static void main(String[] args){
		// 通过"类名."的方式访问静态变量
		System.out.println(Chinese.country);
		// 创建对象
		Chinese c1 = new Chinese("1111111", "张三");
		System.out.println(c1.idCard); // 1111111
		System.out.println(c1.name); // 张三
		System.out.println(c1.country); // 中国

		// c1是空引用
		c1 = null;
		// 分析这里会不会出现空指针异常?
		// 不会出现空指针异常。
		// 因为静态变量不需要对象的存在。
		// 实际上以下的代码在运行的时候,还是:System.out.println(Chinese.country);
		System.out.println(c1.country);

		// 这个会出现空指针异常,因为name是实例变量。
		//System.out.println(c1.name);
	}
}

class Chinese{

	// 实例变量
	String idCard;
	String name;

	// 静态变量
	static String country = "中国";

	//构造方法
	public Chinese(String x, String y){
		idCard = x;
		name = y;
	}
}

 4.2实力方法与静态方法的调用

public class StaticTest04{
	public static void main(String[] args){

		// 这是比较正规的方式,静态方法采用“类名.”
		StaticTest04.doSome();

		//对象
		StaticTest04 st = new StaticTest04();
		// 用“引用.”访问
		st.doSome();

		// 空引用
		st = null;
		// 不会出现空指针异常
		st.doSome(); // 这个代码在最终执行的时候还是会转变为:StaticTest04.doSome();

		// 实例方法doOther()
		// 对象级别的方法(先new对象,通过“引用.”来访问)
		//错误: 无法从静态上下文中引用非静态 方法 doOther()
		//StaticTest04.doOther();

		StaticTest04 st2 = new StaticTest04();
		st2.doOther();

		// 空引用
		st2 = null;
		// 空引用调用实例方法会出现什么问题?空指针异常。
		//st2.doOther();

	}

	// 静态方法(静态方法不需要new对象,直接使用“类名.”来访问)
	// 但是也可以使用“引用.”来访问,不建议用。(因为其他程序员会感到困惑。)
	public static void doSome(){
		System.out.println("静态方法doSome()执行了!");
	}

	// 实例方法(实例相关的都需要new对象,使用"引用."来访问。)
	public void doOther(){
		System.out.println("实例方法doOther执行了!");
	}
}

// 从第一天开始讲解HelloWorld到目前为止,一个类当中一共就写过这些东西。
/*
类{
	// 实例相关的都是需要new对象的,通过"引用."访问。
	实例变量;
	实例方法;

	// 静态相关的都是采用“类名.”访问。也可以使用“引用.”,只不过不建议。
	静态变量;
	静态方法;
}
*/

5、什么时候定义为静态方法和实例方法

/*
	关于方法来说,什么时候定义为实例方法?什么时候定义为静态方法?
		有没有参考标准。

		此方法一般都是描述了一个行为,如果说该行为必须由对象去触发。
		那么该方法定义为实例方法。

		参考标准:
			当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法。

			我们以后开发中,大部分情况下,如果是工具类的话,工具类当中的方法
			一般都是静态的。(静态方法有一个优点,是不需要new对象,直接采用类名
			调用,极其方便。工具类就是为了方便,所以工具类中的方法一般都是static的。)

			什么是工具类?????
				以后讲。(工具类就是为了方便编程而开发的一些类。)
	
	类 = 属性 + 方法
		属性描述的是:状态
		方法描述的是:行为动作
	
	一个方法代表了一个动作。

	什么时候方法定义为实例方法?
		张三考试,得分90
		李四考试,得分100
		不同的对象参加考试的结果不同。
		我们可以认定“考试”这个行为是与对象相关的行为。
		建议将“考试”这个方法定义为实例方法。
*/
public class StaticTest05{
	public static void main(String[] args){
		User u = new User();
		System.out.println(u.getId()); //0

		//User.getId();错误因为getId里面访问了实力变量,实例变量要创建对象后访问
        //都i没有创建对象,没有对象你怎么访问实例(对象)变量啊

		User.printName2();//没有错误,但是这个方法里面没有访问实例变量

		User x = new User();
		x.printName1();

		// 访问T的id怎么访问
		/*
		T t = new T();
		System.out.println(t.id);
		*/

		User y = new User();
		y.printName1();
	}
}

class T{
	// 实例变量
	int id;
}

// 我之前怎么说的?实例变量访问的语法机制是什么?
// 语法:引用.实例变量名
class User{

	// 实例变量,需要对象
	private int id;

	// 实例变量
	private String name; // 首先先分析的是,这个name是对象级别的,一个对象一份。

	//分析这个方法应该定义为实例方法还是静态方法呢?
	// 打印用户的名字这样的一个方法。
	public void printName1(){ 
		System.out.println(name);
	}

	public static void printName2(){
		// 输出的是一个对象的name
		//System.out.println(name);
	}

	public void setId(int i){
		id = i;
	}

	public int getId(){
		return id;
	}

	/*
	public static int getId(){
		return id;//这是错误的 访问了对象(实例变量)
	}
	*/
}

6、静态代码块

/*
	1、使用static关键字可以定义:静态代码块  在方法区
	2、什么是静态代码块,语法是什么?
		static {
			java语句;
			java语句;
		}
	3、static静态代码块在什么时候执行呢?
		类加载时执行。并且只执行一次。
		静态代码块有这样的特征/特点。

	4、注意:静态代码块在类加载时执行,并且在main方法执行之前执行。

	5、静态代码块一般是按照自上而下的顺序执行。

	6、静态代码块有啥作用,有什么用?
		第一:静态代码块不是那么常用。(不是每一个类当中都要写的东西。)
		第二:静态代码块这种语法机制实际上是SUN公司给我们java程序员的一个特殊的时刻/时机。
		这个时机叫做:类加载时机。

	具体的业务:
		项目经理说了:大家注意了,所有我们编写的程序中,只要是类加载了,请记录一下
		类加载的日志信息(在哪年哪月哪日几时几分几秒,哪个类加载到JVM当中了)。
		思考:这些记录日志的代码写到哪里呢?
			写到静态代码块当中。
		
*/
public class StaticTest06{

	// 静态代码块(特殊的时机:类加载时机。)
	static {
		System.out.println("A");
	}

	// 一个类当中可以编写多个静态代码块
	static {
		System.out.println("B");
	}

	// 入口
	public static void main(String[] args){
		System.out.println("Hello World!");
	}

	// 编写一个静态代码块
	static{
		System.out.println("C");
	}
}

/*结果:
A
B
C
Hello World!
*/

7、静态代码块和静态变量的执行时机和顺序

/*
	栈:方法只要执行,会压栈。(局部变量)
	堆:new出来的对象都在堆中。垃圾回收器主要针对。(实例变量)
	方法区:类的信息,字节码信息,代码片段。(静态变量)

	方法的代码片段放在方法区,但是方法执行过程当中需要的内存在栈中。
*/
public class StaticTest07{
	
	// 静态变量在什么时候初始化?类加载时初始化。
	// 静态变量存储在哪里?方法区
	static int i = 100;

	// 静态代码块什么时候执行?类加载时执行。
	static {
		// 这里可以访问i吗?
        // 可以
		System.out.println("i = " + i);
	}

	// 实例变量
	int k = 111; // k变量是实例变量,在构造方法执行时内存空间才会开辟。

	static {
		//k变量可以访问吗?
		// static静态代码块在类加载时执行,并且只执行一次。
		// 类加载时,k变量空间还没有开辟出来呢。
		//错误: 无法从静态上下文中引用非静态 变量 k
		//System.out.println("k = " + k);

		// 这里可以访问name吗?
		//错误: 非法前向引用
		// 静态代码块和静态变量都在类加载的时候执行,时间相同,只能靠代码的顺序来决定谁先谁后。
		//System.out.println("name = " + name);
	}

	// 静态变量在静态代码块下面。
	static String name = "zhangsan";


	//入口(main方法执行之前实际上执行了很多代码)
	public static void main(String[] args){
		System.out.println("main begin");
		System.out.println("main over");
	}
}

/*
总结:
	到目前为止,你遇到的所有java程序,有顺序要求的是哪些?
		第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的顺序执行。
		第二:静态代码块1和静态代码块2是有先后顺序的。
		第三:静态代码块和静态变量是有先后顺序的。
*/

8、实例代码块执行时机

/*
1、除了静态代码块之外,还有一种语句块叫做:实例语句块
2、实例语句在类加载是并没有执行。
3、实例语句语法?
	{
		java语句;
		java语句;
		java语句;
	}
4、实例语句块在什么时候执行?
	只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码。
	实际上这也是SUN公司为java程序员准备一个特殊的时机,叫做对象构建时机。
*/
public class InstanceCode{

	//入口
	public static void main(String[] args){
		System.out.println("main begin");
		new InstanceCode();
		new InstanceCode();

		new InstanceCode("abc");
		new InstanceCode("xyz");
	}


	//实例语句块
	{
		System.out.println("实例语句块执行!");	
	}

	// Constructor
	public InstanceCode(){
		System.out.println("无参数构造方法");
	}

	// Constructor
	public InstanceCode(String name){
		System.out.println("有参数的构造方法");
	}

}

9、综合代码执行顺序

//判断以下程序的执行顺序
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");
	}

}

10、this

1、this
    1.1、this是一个关键字,是一个引用,保存内存地址指向自身。
    1.2、this可以使用在实例方法中,也可以使用在构造方法中。
    1.3、this出现在实例方法中其实代表的是当前对象。
    1.4、this不能使用在静态方法中。
    1.5、this. 大部分情况下可以省略,但是用来区分局部变量和实例变量的时候不能省略。
    1.6、this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的
    构造方法,目的是代码复用。

11、this的内存结构及应用

/*
	this:
		1、this是一个关键字,全部小写。
		2、this是什么,在内存方面是怎样的?
			一个对象一个this。
			this是一个变量,是一个引用。this保存当前对象的内存地址,指向自身。
			所以,严格意义上来说,this代表的就是“当前对象”
			this存储在堆内存当中对象的内部。

		3、this只能使用在实例方法中。谁调用这个实例方法,this就是谁。
		所以this代表的是:当前对象。

		4、“this.”大部分情况下是可以省略的。

		5、为什么this不能使用在静态方法中??????
			this代表当前对象,静态方法中不存在当前对象。
*/
public class ThisTest01{
	public static void main(String[] args){

		Customer c1 = new Customer("张三");
		c1.shopping();

		Customer c2 = new Customer("李四");
		c2.shopping();

		Customer.doSome();
	}
}

// 顾客类
class Customer{

	// 属性
	// 实例变量(必须采用“引用.”的方式访问)
	String name;   

	//构造方法
	public Customer(){
	
	}
	public Customer(String s){
		name = s;
	}

	// 顾客购物的方法
	// 实例方法
	public void shopping(){
		// 这里的this是谁?this是当前对象。
		// c1调用shopping(),this是c1
		// c2调用shopping(),this是c2
		//System.out.println(this.name + "正在购物!");

		// this. 是可以省略的。
		// this. 省略的话,还是默认访问“当前对象”的name。
        // 不能用c1、c2。因为它们在另一个类里面局部变量到不了这个类里
        // 即使能到也不行,写死了
		System.out.println(name + "正在购物!");
	}

	// 静态方法
	public static void doSome(){
		// this代表的是当前对象,而静态方法的调用不需要对象。矛盾了。
		// 错误: 无法从静态上下文中引用非静态 变量 this
		//System.out.println(this);
	}
}


class Student{

	// 实例变量,怎么访问?必须先new对象,通过“引用.”来访问。
	String name = "zhangsan";

	// 静态方法
	public static void m1(){
		//System.out.println(name);

		// this代表的是当前对象。
		//System.out.println(this.name);

		// 除非你这样(这样也不能用this)
		Student s = new Student();
		System.out.println(s.name);

	}

	//为什么set和get方法是实例方法?
	public static void setName(String s){
		name = s;//省了this
	}
	public String getName(){
		return name;//省了this
	}

	// 又回到上午的问题了?什么时候方法定义为实例方法,什么时候定义为静态方法?
	// 如果方法中直接访问了实例变量,该方法必须是实例方法。
}
// 分析:i变量在main方法中能不能访问????

public class ThisTest02{

	// 实例变量
	int i = 100; // 这个i变量是不是必须先new对象才能访问。

	// 静态变量
	static int k = 111;

	// 静态方法
	public static void main(String[] args){
		// 错误: 无法从静态上下文中引用非静态 变量 i
		// System.out.println(i);

		// 怎么样访问i
		ThisTest02 tt = new ThisTest02();
		System.out.println(tt.i);

		// 静态变量用“类名.”访问。
		System.out.println(ThisTest02.k);

		// 类名. 能不能省略?
		// 可以(因为在同一个类中)
		System.out.println(k);
	}
}

12、this不能省的情况

/*
1、this可以使用在实例方法中,不能使用在静态方法中。
2、this关键字大部分情况下可以省略,什么时候不能省略呢?
	在实例方法中,或者构造方法中,为了区分局部变量和实例变量,
	这种情况下:this. 是不能省略的。
*/
public class ThisTest03{
	public static void main(String[] args){

		Student s = new Student();
		s.setNo(111);
		s.setName("张三");
		System.out.println("学号:" + s.getNo());
		System.out.println("姓名:" + s.getName());

		Student s2 = new Student(2222, "李四");
		System.out.println("学号:" + s2.getNo());
		System.out.println("姓名:" + s2.getName());

	}
}

// 分析一下:以下代码哪里写的不好。形参不能见名知意,可读性不好
// 学生类
class Student{
	//学号
	private int no;

	//姓名
	private String name;

	//构造方法无参
	public Student(){
	
	}

	//构造方法有参
	/*
	public Student(int i, String s){
		no = i;
		name = s;
	}
	*/

	// 上面的构造方法也增强以下可读性
	public Student(int no, String name){
		this.no = no;
		this.name = name;
	}

	// setter and getter方法
	/*
	public void setNo(int i){
		no = i;
	}
	*/
	/*
	public void setNo(int no){ // 等号右边的no本身就是形参的no,
								//又因就近原则使等号左边的no也是形参no
		no = no; //这两个no都是局部变量no,和实例变量no没关系。
				//这样写没有给属性赋值。s.getNo输出的是0
	}
	*/
	public void setNo(int no){ 
		//no是局部变量
		//this.no 是指的实例变量(属性)。
		this.no = no; // this. 的作用是:区分局部变量和实例变量。
	}
	public int getNo(){
		return no;
		//return this.no;
	}
	/*
	public void setName(String s){
		name = s;
	}
	*/
	/*
	public void setName(String name){ // 就近原则使等号左边的name也是形参name
		name = name; //这两个name都是局部变量name,和实例变量name没关系。
					//这样写没有给属性赋值。s.getName输出的是null
	}
	*/
	public void setName(String name){
		this.name = name;
	}


	public String getName(){ // getName实际上获取的是“当前对象”的名字。
		//return this.name; // 严格来说,这里是有一个 this. 的。只不过这个 this. 是可以省略的。
		return name;
	}
}

13、this()的用法

/*
	1、this除了可以使用在实例方法、构造方法中,还可以用在构造方法方法调用另一个构造方法时。
	2、新语法:通过当前的构造方法去调用另一个本类的构造方法,可以使用以下语法格式:
		this(实际参数列表)(无参构造时);有参调用另一个有参时 this(形参列表)
			通过一个构造方法1去调用构造方法2,可以做到代码复用。
			但需要注意的是:“构造方法1”和“构造方法2” 都是在同一个类当中。

	3、this() 这个语法作用是什么?
		代码复用。
	
	4、死记硬背:
		对于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{ // 以后写代码都要封装,属性私有化,对外提供setter and getter
	//年
	private int year;
	//月
	private int month;
	//日
	private int day;

	// 构造方法无参
	// 调用无参数构造方法,初始化的日期是固定值。
	public Date(){
		//错误: 对this的调用必须是构造器中的第一个语句
		//System.out.println(11);
		/*
        // 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;
	}
}

14、大总结

总结所有的变量怎么访问,总结所有的方法怎么访问!!!!
总结一下到目前为止我们在一个类中都接触过什么了。

review01

/*
	到目前为止一个类当中可以出现的:
		类体{
			实例变量;
			实例方法;

			静态变量;
			静态方法;

			构造方法;

			静态代码块;
			实例语句块;

			方法(){
				// 局部变量
				int i = 100;
			}
		}
*/
public class Review{ // 类
	// 类加载机制中,是这样的:在程序执行之前,凡是需要加载的类全部加载到JVM当中。
	// 先完成加载才会执行main方法。
	static{
		System.out.println("Review类加载时执行!");
	}

	// 入口
	// 静态方法
	public static void main(String[] args){
		// 局部变量
		int i = 100;

		// 完成一个对象的一连串动作。
		// 一个学生在教室先学习,学习完成之后去餐厅吃饭。
		Student s1 = new Student();

		// 先学习,所有调用学习这个实例方法。
		s1.study();

		Student s2 = new Student();
	}

}

// 学生类
class Student{

	static{
		System.out.println("Student类加载时执行!");
	}

	// 学号
	private int no; // 实例变量
	// 姓名
	private String name;

	// 学生有静态变量吗?
	// 类级别的属性
	static String job = "学习";

	{
		System.out.println("实例语句块,构造方法执行一次,这里就执行一次!");
	}

	// 构造方法
	public Student(){
		// 假设调用无参数的构造方法,默认创建的学生学号是100,名字是zhangsan
		this(100, "zhangsan"); // this() 在这里也使用了。
	}
	public Student(int no, String name){
		this.no = no; // 这里使用了this
		this.name = name;
	}

	// 封装
	// setter and getter方法
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setNo(int no){
		this.no = no;
	}
	public int getNo(){
		return no;
	}

	// 提供两个实例方法
	public void study(){
		// 私有的是可以在本类中访问的。在其它类中必须使用set和get方法。
		//System.out.println(this.name + "正在努力的学习!");
		//System.out.println(name + "正在努力的学习!");

		// 在实例方法中调用本类其它的实例方法。
		System.out.println(this.getName() + "正在努力的学习!");
		//System.out.println(getName() + "正在努力的学习!");

		// 方法执行到此处表示学习完成了,去吃饭。
		//this.eat();		
		// this.可以省略
		// 编译器检测到eat()方法是实例方法,会自动在eat()方法前添加 this.
		eat();
	}
	
	public void eat(){ // 实例方法
		System.out.println(this.getName() + "在餐厅吃饭呢!!!");

		// 调用静态m1()方法
		// 静态方法使用“类名.”的方式访问
		// Student.m1();

		// 类名. 可以省略吗?可以。
		// java编译器会自动在m1()方法之前添加“类名.”,因为检测到m1()方法是一个静态方法。
		m1();
	}


	// 提供两个静态方法
	public static void m1(){
		System.out.println("Student's m1 method execute!");
		// 调用m2()方法
		//Student.m2();
		m2();
	}

	public static void m2(){
		System.out.println("Student's m2 method execute!");
		System.out.println("工作性质:" + job);
		// 编译器检测到job是一个静态变量,所以这里会自动在job前添加:Student.
		//System.out.println("工作性质:" + Student.job);
	}
}

 review02

/*
	程序再怎么变化,万变不离其宗,有一个固定的规律:
		所有的实例相关的都是先创建对象,通过“引用.”来访问。
		所有的静态相关的都是直接采用“类名.”来访问。
	
	你有发现一些问题吗?
		总有一些是需要记忆的,在这些记忆的基础之上进行分析。
	
	大结论:
		只要负责调用的方法a和被调用的方法b在同一个类当中:
			this. 可以省略
			类名. 可以省略
*/
public class Review02{

	int i = 100;

	static int j = 1000;

	public void m1(){

		// 访问其他类的静态方法
		T.t1();

		// 访问其他类的实例方法
		T t = new T();
		t.t2();
	}

	public void m2(){}

	// 实例方法
	public void x(){ // 这个方法是实例方法,执行这个方法的过程中,当前对象是存在的。
		m1();
		m2();

		m3();
		m4();

		System.out.println(i); // System.out.println(this.i);
		System.out.println(j); // System.out.println(Review02.i);
	}

	public static void m3(){}

	public static void m4(){}

	// 问?你怎么分析这个程序?
	/*
		第一步:
			main方法是静态的,JVM调用main方法的时候直接采用的是“类名.”的方式。
			所以main方法中没有this。

		第二步:
			m1() 和 m2() 方法是实例方法,按照java语法规则来说,实例方法必须先
			new对象,通过“引用.”的方式访问。
	*/
	public static void main(String[] args){
		// 编译报错。
		//m1();
		//m2();

		m3(); // 编译器会自动识别m3()静态方法,结果是:Review02.m3();
		m4(); // Review02.m4();

		//System.out.println(i); // 报错
		System.out.println(j); // 可以

		// 想访问m1() m2()还有i,你在static方法中只能自己new
		Review02 r = new Review02();
		System.out.println(r.i);
		r.m1();
		r.m2();

		// 局部变量,局部变量访问的时候是不需要“xxx.”的
		int k = 10000;
		System.out.println(k);
	}
}


class T{
	// 静态方法
	public static void t1(){
	
	}

	//实例方法
	public void t2(){
	
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值