java日常学习:构造函数及this关键字使用

#java代码块


##java构造函数
构造函数的作用: 给对应的对象进行初始化。
构造函数的格式:

修饰符  函数名(形式参数列表){
	初始化的语句;
}

构造函数要注意的细节:
1. 构造函数是没有返回值类型的。
2. 构造函数的函数名必须 与类名一致。
3. 构造函数并不是由我们手动调用的, 构造函数是在创建对应对象的时候由jvm主动调用的(每创建一个对象就会调用一次构造函数)。
4. 如果一个类没有显式的添加一个构造函数,那么java编译器会为该类添加一个无参的构造函数。
5. 如果一个类已经显式的添加一个构造函数,那么java编译器则不会再为该类添加一个无参的构造函数。
6. 构造函数是可以以函数重载的形式存在多个的。

疑问1 :我们现在知道创建对象的时候,jvm需要调用到对应的构造方法,那么以前我们没有学构造方法,那么jvm还会调用到构造方法吗?而且构造方法存在吗?

存在构造方法的, 但是不是java虚拟机添加的,是java编译器添加的。

疑问2:java编译器添加的无参构造函数的修饰符是什么?

无参的构造函数的权限修饰符是与类名一致的。

如何反编译: 反编译可以使用jdk给我们提供的开发工具—》javap

javap -c -l -private  class文件

问题:重复代码。

构造函数的作用:给对应的对象进行初始化。

构造代码块:给所有的对象进行统一的初始化。

构造代码块格式:

	{
		初始化语句;
	}

代码块的类型:

构造代码块: 代码块位于成员位置上。

局部代码块 :代码块位于方法之内。
局部代码块的作用:
缩短局部变量的生命周期。

静态代码块:
静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。

构造代码块要注意的细节:
1. 构造函数 的代码是位于成员变量的显式初始化 语句、构造代码块语句之后执行 的。
2. 成员变量的显式初始化语句与构造代码块的语句的先后执行顺序是按照当前代码的顺序执行的。
3. 成员变量的初始化语句和构造代码块的代码其实是在构造函数中完成的。


##java this关键字的使用
this关键字: this关键字代表的是所属函数的调用者对象。

问题: 存在着同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,如何才能访问成员变量呢?

this关键字的作用:
1. 一个类存在着同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,我们可以通过this关键字指定访问成员变量的数据。
2.this关键字可以在构造函数中调用其他的构造函数初始化对象使用。
例子:
public Animal(int id,String name,String color){

		this(name,color); //这句话要放在构造函数的最前面,调用到两个参数的构造函数,如果不写这句话,则应该是
		/*this.name = name;
		  this.color = color;
		*/
		//这样与下面的构造函数形成代码重复
		this.id = id;
	}

    //构造函数
	public Animal(String name,String color){ //形式参数也是属于局部变量。
		this.name = name;
		this.color =color;
	}

this关键字要注意的细节:
1. 如果在一个函数中访问一个成员变量,而且没有存在同名的局部变量 时,那么java编译器会默认在变量的前面加上this关键字的。
2. this关键字调用 其他的构造函数时,this语句必须 位于构造函数中的第一个语句。
3. this关键字调用构造函数的时候不准出现相互调用的情况,因为是一个死循环的调用方式。


##java代码块:构造函数和this关键字

/*
需求:使用java类描述一个学生,学生有 name 、age两个属性, 还具备一个功能就是比较年龄。  
 
要求: 
	一旦创建了学生对象,学生就有了对应的属性值。(构造函数、this)
*/

//学生类;
class Student{
	String name;
	int age;
	//构造函数;
	public Student(String name,int age){    //存在同名的成员变量与局部变量
		this.name = name;
		this.age = age;
	}
	//比较年龄;  
	public void compareAge(Student s2){
		if (this.age>s2.age){
			System.out.println("狗娃大!");
		}else if (this.age<s2.age){
			System.out.println("狗蛋大!");
		}else{
			System.out.println("一样大!");
		}
	}

}

class demo4{
	public static void main(String[] args) 
	{
		Student s1 = new Student("狗娃",18);
		Student s2 = new Student("狗蛋",19);
		s1.compareAge(s2);
	}
}

用于平时自己复习回顾,如有错误,欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值