this关键字的作用
1.表示类中的属性
2.可以使用this调用本类的构造方法
3.this表示当前对象
1.1 this 调用本类中的属性
class Person {
private String name; // 姓名
private int age; // 年龄
public Person(String name,int age){ // 通过构造赋值
this.name = name ; // 明确表示为类中的name属性赋值
this.age = age ; // 明确表示为类中的age属性赋值
}
public String getInfo() { // 取得信息
return "姓名:" + name + ",年龄:" + age;
}
}
public class ThisDemo02 {
public static void main(String[] args) {
Person per1 = new Person("张三",33) ; // 调用构造实例化对象
System.out.println(per1.getInfo()) ; // 取得信息
}
}
2.1 使用this调用构造方法
避免代码重复,让构造方法之间互相调用,使用this(若干参数)的形式完成.
如果一个类中有多个构造方法的话,也可以利用this关键字互相调用。
假设现在要求不管类中有多少个构造方法,只要对象一被实例化,就必须打印一行“新对象实例化”的信息出来,很明显,此时如果在各个构造方法中编写此输出语句肯定不合适,所以此时就可以利用this的概念完成。
package demo0309;
public class Test1 {
public static void main(String[] args) {
Person p=new Person("呵呵呵",12); //调用有参构造
System.out.println(p.getInfo()); //输出信息
}
}
class Person{
private String name; //私有化姓名
private int age; //私有化年龄
public Person() { //无参构造
System.out.println("一个新的Person对象被实例化! ");
}
public Person(String name,int age) {
this(); //此处调用Person类中的无参构造方法
this.name=name;
this.age=age;
}
public String getInfo() { //取得信息
return "姓名: "+name+" 年龄 :"+age;
}
}
使用this调用构造方法必须也只能放在构造方法的第一行。
3.1this表示当前对象,在java中当前对象就是指当前正在调用类中方法的对象。
class Person {
public String getInfo() {
System.out.println("Person类 --> " + this); // 直接打印this
return null ; // 此处返回null,为的是让语法不出错
}
}
public class ThisDemo06 {
public static void main(String[] args) {
Person per1 = new Person() ;
Person per2 = new Person() ;
System.out.println("MAIN方法 --> " + per1); // 直接打印对象
per1.getInfo() ;
System.out.println("--------------------------") ;
System.out.println("MAIN方法 --> " + per2); // 直接打印对象
per2.getInfo() ;
}
}
静态方法中不能使用this关键字
只要一有对象实例化则就会调用构造方法。
1.构造方法的定义格式
class 类名称{
访问权限 类名称(类型1 参数1,类型2 参数2,…){
程序语句 ;
… // 构造方法没有返回值
}
}
1.1在构造方法的声明中一定要牢记以下几点:
构造方法的名称必须与类名称一致
构造方法的声明处不能有任何返回值类型的声明
不能在构造方法中使用return返回一个值
2.声明一个构造方法
class Person {
public Person(){ // 声明构造方法
System.out.println("一个新的Person对象产生。") ;
}
}
public class ConsDemo01 {
public static void main(String args[]) {
System.out.println("声明对象:Person per = null ;") ;
Person per = null ; // 声明对象时不调用构造
System.out.println("实例化对象:per = new Person() ;") ;
per = new Person(); // 实例化对象时调用构造
}
}
3.默认的构造方法
每个类中肯定都会有一个构造方法。
如果一个类中没有声明一个明确的构造方法则会自动生成一个无参的什么都不做的构造方法。
class Person {
public Person(){}
}
4.构造方法的目的
构造方法的主要目的是为类中的属性初始化。
class Person {
private String name; // 声明姓名属性
private int age; // 声明年龄属性
public Person(String name,int age){ // 定义构造方法为属性初始化
this.setName(name) ; // 为name属性赋值
this.setAge(age) ; // 为age属性赋值
}
public void tell() { // 取得信息的方法
System.out.println("姓名:" + getName() + ",年龄:" + getAge());
}
public int getAge() {
return age;
}
public void setAge(int a) { // 设置年龄
if (a >= 0 && a < 150) { // 在此处加上验证代码
age = a;
}
}
public String getName() {
return name;
}
public void setName(String n) {
name=n;
}
}
}
public class ConsDemo02 {
public static void main(String args[]) {
Person per = new Person("张三",30); // 调用构造方法,传递两个参数
per.tell(); // 输出信息
}
}
5. 构造方法重构
构造方法的重载过程与普通方法一样。
参数的类型或个数不同
public Person(){}
public Person(String name){
this.setName(name) ;
}
public Person(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
6.构造方法的注意事项
package demo0310;
class Person{
private String name;
private String gender;
private int age;
private String address;
public Person(String name,String gender,int age,String address) {
this.name=name;
this.gender=gender;
this.age=age;
this.address=address;
System.out.println(this.name+" "+this.gender+" "+this.age+" "+this.address);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class Test1 {
public static void main(String[] args) {
Person p=null;//声明对象时不调用构造方法
p=new Person("张天伦","男",21,"陕西省");//实例化对象时调用构造方法
}
}
声明对象时不调用构造方法
实例化对象时调用构造方法
7.匿名对象
只使用一次的对象,称为匿名对象。
匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。
public class NonameDemo01 {
public static void main(String args[]) {
new Person("张三", 30).tell(); // 匿名对象
}
}