JAVA中 this关键字,比较复杂,灵活
三类结构的描述:
当前类中的属性:this.属性
当前类中的方法:(普通方法,构造方法):this()//构造方法 this.方法名称();//普通方法
描述当前对象:(最头疼的部分)
一。当前类中的属性:this.属性
利用构造方法和setter方法都可以对类中的属性进行赋值,但是在进行赋值的时候,可以进行如下操作
java中大括号{} 是程序的边界,在程序里面当进行变量(参数,构体的边界符),那么在程序里面当进行变量(参数属性成为变量)
都是以大括号{}作为查找边界,按照就近取用的原则,这时构造方法并没能访问类中的属性与参数,往往会在属性前追加一个 this,
表示本类属性
1 package baba; 2 3 class Person { 4 private String name; 5 private int age; 6 7 public Person(String name, int age) { 8 this.name = name;// 加上this目的为了明确标识出类中的属性与参数区别 9 this.age = age;// 会在属性前加this,标识本类属性(通俗的说告诉告诉构 造方法 10 // 你别到处找了,我在这里,你别把参数给别人,和篮球场传球原来一样) 11 } 12 13 public void tell() { 14 System.out.println("姓名" + this.name + ",年龄" + this.age); 15 }// 16 } 17 18 /** 19 * 一个一个文件中可以定义多个类,但是只能有一个public的类, 而且java文件名必须和这个public类相同。
* 看看下面代码这个 20 * 主类的类名和java文件名相同,可以看出一个源文件里能定义多个class,
* 但是有且只能有一个public类可以看出一个源文件里能定义多个class, 21 * 但是有且只能有一个public类 public类的名字必须和源文件名一致 22 * 23 * @author Administrator 24 * 25 */ 26 public class JavaDemo {// 主类 又叫public表示全局类 27 public static void main(String args[]) {// 主方法 28 Person per = new Person("小米", 3);// 声明,并实例化了一个对象 29 per.tell(); 30 31 } 32 33 }
二.当前类中的方法:(普通方法,构造方法):this()//构造方法 this.方法名称();//普通方法
但是对于方法调用就必须考虑构造方法与普通方法的区别
1.普通方法调用(this.方法名称()):实例化对象产生之后就可以调用普通方法(这个好理解,小孩没出生,怎么会有吃喝
拉撒的行为呢)
1 package baba; 2 class Person { 3 private String name; 4 private int age; 5 public Person(String name, int age) { 6 /**通过set 方法把值设到构造方法里面,构造方法再把值赋给被封装类的属性 7 * this调用本类中的方法,来给属性赋值 8 */ 9 this.setName(name);//加与不加(this)都表示本类中的方法 10 this.setAge(age); //为了统一最好加上 11 } 12 public void tell() { 13 System.out.println("姓名" + this.name + ",年龄" + this.age); 14 }// 15 public void setName(String name) { 16 this.name=name; 17 } 18 public void setAge(int age) { 19 this.age=age; 20 } 21 public String getName() { 22 return this.name; 23 } 24 public int getAge() { 25 return this.age; 26 } 27 } 28 public class JavaDemo {// 主类 又叫public表示全局类 29 public static void main(String args[]) {// 主方法 30 Person per = new Person("小明", 3);// 声明,并实例化了一个对象,给这个新的对象设置了初始值 31 per.tell(); 32 33 } 34 35 }
2.构造方法的调用【 this() 】:使用关键字new实例化对象的时候才会调用构造方法;
评价一个代码的好坏,可以重用,没重复,所有本类构造方法的互相调用要注意以下几个重要问题:
① 构造方法必须在实例化新对象的时候调用,所有this()的语句只允许放在构造方法的首行
②在构造方法中可以调用普通方法,在普通方法中不允许调用构造方法
③构造方法相互调用时请给程序保留出口,不要形成死循环(不然报错 构造方法的递归调用)
1 package baba; 2 class Emp { 3 private long empno;// 员工编号 4 private String ename;// 员工姓名 5 private String dept;// 部门名称 6 private double salary;// 基本工资 7 // setter getter省略 8 public Emp() { 9 this(1000,"无名氏",null,0.0); 10 } 11 12 public Emp(long empno) { 13 this(empno,"新员工",null,0.0); 14 } 15 16 public Emp(long empno, String ename, String dept) { 17 this(empno,ename,dept,2500.00); 18 19 } 20 21 public Emp(long empno, String ename, String dept, double salary) { 22 this.empno = empno; 23 this.ename = ename; 24 this.dept = dept; 25 this.salary =2500.00; 26 } 27 28 public String getInfo() { 29 return "雇员编号:" + this.empno +" 雇员姓名:" + this.ename + " 所在部门:" + this.dept + " 基本工资:" + this.salary; 30 } 31 } 32 public class JavaDemo {// 主类 又叫public表示全局类 33 public static void main(String args[]) {// 主方法 34 Emp emp=new Emp(5874L,"黎明","财务部门"); 35 System.out.println(emp.getInfo()); 36 } 37 38 }
总结,通过构造方法来实例化对象时,操作过程是从新对象的小括号内(),依照小括号内给定的参数,选择对应的构造方法
来获取,再把这些参数赋给成员属性,然后,对象通过相应方法取出属性值,再输出到控制台
setter getter 方法 与 构造方法实例化对象的差别
- 构造方法只有在创建对象时才会被“系统”调用且只调用一次, 而getter和setter方法是随时可以被“对象”调用
- 构造方法不能获取对象属性的值, 而getter可以获取对象的属性