菜鸡自学JAVA坎坷路day.5(关于内存一个实例的讲解和this,对象值传递的详解)【重点复习】

1.创建对象:

(2.中的显示的应该是显式)

2.this的本质:


注意:this不能用于static方法之中;static属于类在方法区不是对象,this是指当前对象,没有对象可以让他指;

/**
 * 测试this
 * @author Wang
 *
 */

public class TestThis {
	
	int a,b,c;
	
	TestThis(){}//构造函数不要加返回值类型他是默认返回当前对象地址给相关变量的
	
	TestThis(int a,int b){
		this.a = a;//this代表当前对象
		this.b = b;	
	}
	
	TestThis(int a,int b,int c){
		this(a,b);//调用上面的构造器进行初始化  注意:构造器的调用只能用于第一句
		this.c = c;
	}
	static void sing() {
		System.out.println("我喜欢唱歌给你听");
		//sleep();static不能调用普通的方法,她只能调用static的注意static属于类,他就像是汽车图纸,而非static是属于对象(对象和成员变量存放在堆中,方法和局部变量在栈帧中)的,对象就像是造好汽车(有汽车就有图纸有图纸不一定有汽车)
	}
	
	void sleep() {
		System.out.println("我睡觉");
	}
	
	void eat() {
		this.sleep();//这里加不加this都可以(一般出现二义性的时候是必须加的)
		sing();//static方法是属于类的跟类一起存在方法区不用家this直接调用
		System.out.println("i like eating");
	}
	
	public static void main(String[] args) {
		TestThis qq = new TestThis();
		sing();//静态的方法可以直接调用;
		//sleep();会报错
		qq.eat();//非静态的要这样用
		
	}

}

注意:

1.static不能调用普通的方法,她只能调用static的,static属于类(存放在方法区),他就像是汽车图纸,而非static是属于对象(对象和成员变量存放在堆中,方法和局部变量在栈帧中)的,对象就像是造好汽车(有汽车就有图纸,有图纸不一定有汽车)所以普通的方法就可以调用static(上面的这个代码有细节上的东西  看一下注解)

3.静态初始化块


/**
 * 测试静态初始化块初始类的过程
 * @author Wang
 *
 */

public class staticInit {
	int a,b,c;
	static String company;
	
	static{
		System.out.println("执行类的初始化");
		company = "DKF";
		printCompany();//还是老规矩static不能使用非静态的东西
	}
	
	static void printCompany() {
		System.out.println(company);
	}
	
	public static void main(String[] args) {
		staticInit a = null;//创建了一个空对象  还是会执行static 进行类的初始化
	}
}

注意:要是有父类的话要使用子类创建一个对象,初始化的过程是这样的,first先初始化父类(执行父类的静态初始化块),然后初始化子类(亦然),然后执行构造函数创建对象;

4.参数传值的机构


/**
 * 测试值传递(以对象作为值)
 * @author Wang
 *
 */

public class user1 {
	int a,b;
	String name;
	
	public user1(int a,String name) {
		this.a = a;
		this.name = name;
	}
	
	public void TestParameterTransfer01(user1 u) {
		u.name = "李四";
	}
	
	public void TestParameterTransfer02(user1 u) {
		 u = new user1(1,"李大双"); 
	}
	
	public static void main(String[] args) {
		user1 c = new user1(2,"张三");//在这里会在堆中建一个一个对象C,a为2,name为3(假设其地址为123)
		System.out.println(c.name);
		
		c.TestParameterTransfer01(c);//在这会把C的地址给01的u,u指向了123,u.name就是123的name,就会被改成李四(局部变量用完后会消除)
		System.out.println(c.name);
		
		c.TestParameterTransfer02(c);//在这里会把C的地址给02的u,u就指向了123,执行里面的u = new...,就会在堆中新建一个对象地址为124给02的u,02的u就会指向124而不是123所以123中的u.name就不会改成李四而是124改成李四
		System.out.println(c.name);
	}
}

注意:上面没有写引用;


猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/80296652
今日推荐