this是java里面比较复杂的关键字,因为this的使用形式上决定了它的灵活性,在程序里使用this,可以实现以下三类结构的描述:
- 当前类中的属性:this属性
- 当前类中的方法(普通方法、构造方法):this()、this.方法名称()
- 描述当前对象
使用this调用当前类中属性
通过现在的分析可以发现,利用构造方法或者是setter方法都可以进行类中的属性的赋值,但是在进行赋值时,之前采用的是如下的定义形式:
class Person{
private String name ;
private int age ;
public Person(String n , int a){
name = n;
age = a;
}
public void tell(){
System.out.println("姓名:" + name + "、年龄:" + age);
}
//setter getter 略
}
public class keywordThis {
public static void main(String[] args) {
Person per = new Person("王五",38);
per.tell();
}
}
但是这个时候在构造方法定义的过程中会发现有一点点的问题:
public Person(String n , int a){
name = n;
age = a;
}
这个问题出现在参数名称上,可以发现,此时构造方法中两个参数的目的是为了类中的name,age属性初始化。但是现在却发现此时的代码n和a参数名称不好。
如果现在将构造方法中的参数名称修改为name,age,则发现无法进行属性的正确设置:
public Person(String name , int age){
name = name;
age = age;
}
public void tell(){
System.out.println("姓名:" + this.name + "、年龄:" + this.age);
}
在java程序之中“{}”是作为一个结构体的边界符,name在程序里面当进行变量(参数、属性都成为变量)使用的时候都会以“{}”作为一个查找边界,所以按照就近取用的原则,此时的构造方法并没有能够访问类中的属性,所以此时为了明确的标记类中的属性与参数的区别,往往会在属性前追加一个“this”,表示本类属性。
public Person(String name , int age){
this.name = name;
this.age = age;
}
在以后编写的程序代码之中,只要是访问本类中属性的时候,请一定要加上“this”实现访问。
使用this调用方法
除了调用属性之外,this也可以实现方法的调用,但是对于方法的调用就必须考虑构造方法与普通方法
- 构造方法调用(this()):使用关键字new实例化对象的时候才会调用构造方法;
- 普通方法调用(this.方法名称()):实例化对象产生之后就可以调用普通方法;
范例:调用类中的普通方法
package com.java3;
class Person{
private String name ;
private int age ;
public Person(String name , int age){
this.setName(name);
this.setAge(age);
//setAge(age);//加与不加都表示本类方法 加上更好
}
public void tell(){
System.out.println("姓名:" + this.name + "、年龄:" + this.age );
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class keywordThis {
public static void main(String[] args) {
Person per = new Person("王五",38);
per.tell();
}
}
除了普通的方法调用之外,还需要进行构造方法的调用,对于构造方法的调用,肯定要放在构造方法中执行。现在假设说类中一共定义有三个构造方法,但是要求不管调用哪个构造方法,都执行一行输出语句“一个新的Person实例化对象”
class Person{
private String name ;
private int age ;
public Person(){
System.out.println("***一个新的Person类对象实例化了***");
}
public Person(String name){
this(); //调用无参构造方法
this.name = name;
}
public Person(String name , int age){
this(name); //调用单参构造方法
this.setAge(age);
}
public void tell(){
System.out.println("姓名:" + this.name + "、年龄:" + this.age );
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class keywordThis {
public static void main(String[] args) {
Person per = new Person("王五",50);
per.tell();
}
}
评价一个代码的好坏:
- 代码结构可以重用,提供的是一个中间独立的支持;
- 我们的目标是:没有重复代码;
对于本类构造方法的互相调用需要注意以下几点重要问题:
- 构造方法必须在实例化对象的时候调用,所以“this()”的语句只允许放在构造方法的首行。不能放在普通方法中。
- 构造方法互相调用时请保留有程序的出口,别形成死循环。
- 此时的程序在进行编译的时候,会直接出现错误提示:告诉用户你出现了构造方法的递归调用。
public Person(){
this("王五",50);
System.out.println("***一个新的Person类对象实例化了***");
}
public Person(String name){
this(); //调用无参构造方法
this.name = name;
}
public Person(String name , int age){
this(name); //调用单参构造方法
this.setAge(age);
}
构造方法互相调用案例:
现在要求定义一个描述有员工信息的程序类,该类中提供有:编号、姓名、部门、工资,在这个类之中提供有四个构造方法。
- 无参构造:编号定义为1000,姓名定义为无名氏;
- 单参构造:传递编号,姓名定义为“新员工”,部门定义为“未定”,工资为0;
- 三参构造:传递编号、姓名、部分,工资为2500.00;
- 四参构造:所有的属性全部进行传递。
范例: 进行代码的初期实现
class Emp {
private final long empno; //员工编号
private final String ename; //员工姓名
private final String dept; //部门名称
private final double salary; //基本工资
public Emp(){
this(1000,"无名氏",null,0.0);
}
public Emp(long empno){
this(empno,"新员工","未定",0.0);
}
public Emp(long empno , String ename , String dept){
this(empno,ename,dept,2500.00);
}
public Emp(long empno , String ename, String dept , double salary){
this.empno = empno;
this.ename = ename;
this.dept = dept;
this.salary = salary;
}
//setter getter 略
public String getInfo(){
return "雇员编号:" + this.empno +
"、雇员姓名:" + this.ename +
"、所在部门:" + this.dept +
"、基本工资:" + this.salary;
}
}
public class employee {
public static void main(String[] args) {
Emp emp = new Emp(7369L,"小王","财务部",15000.00);
System.out.println(emp.getInfo());
}
}
代码的任何位置上都可能有重复,所以消除重复代码时先期学习之中最需要考虑的部分。
简单java类
在以后进行项目的开发与设计的过程之中,简单java类都将作为一个重要的组成部分存在,慢慢接触到正规的项目设计,简单java类无处不在,并且有可能会产生一系列的变化。
对于简单java类而言,其核心的开发结构如下:
- 类名称一定要有意义,可以明确的描述某一类事物
- 类之中的所有属性都必须使用private进行封装,同时封装后的属性必须要提供有setter、getter方法
- 类之中可以提供有无数多个构造方法,但是必须要保留有无参构造方法
- 类之中不允许出现任何的输出语句,所有内容的获取必须返回
- (非必须)可以提供有一个获取对象详细信息的方法,暂时将此方法名称定义为getInfo()
范例:定义一个简单java类
package com.java3;
class Dept{
private long deptno ;
private String dname;
private String loc;
public Dept(){ //必须提供有无参
}
public Dept(long deptno,String dname, String loc){
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public String getInfo(){
return "【部门信息】部门编号:"+this.deptno+"、部门位置:"+this.dname+"、部门名称:"+loc;
}
public void setDeptno(long deptno){
this.deptno = deptno;
}
public void setDname(String dname){
this.dname = dname;
}
public void setLoc(String loc){
this.loc = loc;
}
public long getDeptno(){
return this.deptno;
}
public String getDname(){
return this.dname;
}
public String getLoc(){
return this.loc;
}
}
public class simpleJava {
public static void main(String[] args) {
Dept dept = new Dept(10,"技术部","北京");
System.out.println(dept.getInfo());
}
}
这种简单java类基本上就融合了所有的现在接触到的概念,例如:数据类型划分、类的定义、private封装、构造方法、方法定义、对象实例化。