Java面向对象编程03 this关键字

this关键字

this调用本类属性

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 setName(String n){
        name = n;
    }
    public String setName(){
        return name;
    }
    public void setAge(int a){
        if(a>=0){
            age = a;
        }
    }
    public int setAge(){
        return age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void tell(){
        System.out.println("姓名:" + name + "、年龄:" + age);
    }
}
public class JavaDemo {//主类
    public static void main(String[] args) {
        new Person("张三", 10).tell();//进行方法的调用
    }
}

此时我们发现构造方法中的两个参数是为了给name和age赋值,发现代码中的n和a参数名称不好。
如果说现在将构造方法中的参数名称修改为name、age,则发现无法进行属性的正确设置。

class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        name = name;
        age = age;
    }
    public void tell() {
        System.out.println("姓名:" + name + "、年龄:" + age);//姓名:null、年龄:0
    }
}

在Java程序之中“{}”是作为一个结构体的边界符,那么在程序里面当进行变量(参数、属性都称为变量)使用的时候都会以“{}”作为一个查找边界,所以按照就近取用的原则,此时的构造方法并没有能够访问类中的属性,所以此时为了明确的标记出类中的属性与参数的区别,会在前面追加this关键字;

public Person(String name, int age) {
        this.name = name;
        this.age = age;
  }

在你以后所编写的程序代码之中,只要是访问本类中属性的时候,请一定要加上“this”实现访问。

使用this调用方法

除了调用属性之外,this也可以实现方法的调用,但是对于方法的调用就必须考虑构造方法与普通方法:

  • 构造方法调用( this()):使用关键字new实例化对象的时候才会调用构造方法
  • 普通方法调用(this.方法名称()):实例化对象产生之后就可以调用普通方法。.
class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.setName(name);
        setAge(age);//加与不加都表示本类方法
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }

    public void tell() {
        System.out.println("姓名:" + name + "、年龄:" + age);
    }
}

public class JavaDemo {//主类

    public static void main(String[] args) {
        Person per = new Person("张三", 18);
        per.tell();
    }
}

除了普通的方法调用之外,还需要进行构造方法的调用,对于构造方法的调用,肯定是在构造方法里面执行。
假如在类中有三个构造方法,但是不管调用那个构造方法,都执行一行输出语句“一个新的Person类对象实例化”:
传统做法:

class Person {
    private String name;
    private int age;

    public Person() {
        System.out.println("***一个新的Person类对象实例化了。");
    }

    public Person(String name) {
        System.out.println("***一个新的Person类对象实例化了。");
        this.name = name;
    }

    public Person(String name, int age) {
        System.out.println("***一个新的Person类对象实例化了。");
        this.name = name;
        this.age = age;
    }

    //setter、getter略
    public void tell() {
        System.out.println("姓名:" + name + "、年龄:" + age);
    }
}

public class JavaDemo {//主类

    public static void main(String args[]) {
        Person per = new Person("张三", 18);
        per.tell();
    }
}

如果想要评价一个代码的好坏:
代码结构可以重用,提供的是一个中间独立的支持;
我们的目标是:没有重复

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.age = age;
    }


    //setter、getter略
    public void tell() {
        System.out.println("姓名:" + name + "、年龄:" + age);
    }
}

public class JavaDemo {//主类

    public static void main(String args[]) {
        Person per = new Person("张三", 18);
        per.tell();
    }
}

对于本类构造方法的互相调用需要注意以下几点重要问题:

  • 构造方法必须在实例化新对象的时候调用,所以“this()”的语句只允许放在构造器的首行;
  • 构造方法互相调用时请保留有程序的出口,别形成死循环

构造方法互调用案例:
现在要求定义一个描述有员工信息的程序类,该类中提供有:编号、姓名、部门、工资,
【无参构造】编号定义为1000,姓名定义为无名氏;
【单参构造】传递编号,姓名定义为“新员工”,部门定义为“未定”,工资0
【三参构造】传递编号、姓名、部门,工资为2500.00; .
【四参构造】所有的属性全部进行传递。

class Emp {
    private long empno;//员工编号
    private String ename; //员工姓名
    private String dept; //部门名称
    private double salary; //基本工资

    public Emp() {
        this.empno = 1000;
        this.ename = "无名氏";
    }

    public Emp(long empno) {
        this.empno = empno;
        this.ename = "新员工";
        this.dept = "未定";
    }

    public Emp(long empno, String ename, String dept) {
        this.empno = empno;
        this.ename = ename;
        this.dept = dept;
        this.salary = 2500.00;
    }

    public Emp(long empno, String ename, String dept, double salary) {
        this.empno = empno;
        this.ename = ename;
        this.dept = dept;
        this.salary = salary;
    }

    //getter、setter略
    public String getInfo() {
        return "雇员编号:" + this.empno +
                " 雇员姓名:" + this.ename +
                " 所在部门:" + this.dept +
                " 基本工资:" + this.salary;
    }
}

public class JavaDemo { //主类
    public static void main(String[] args) {
        Emp emp = new Emp(89989L, "张三", "财务部", 6500.00);
        System.out.println(emp.getInfo());
    }
}

此时可以发现代码有重复,所以就可以对Emp类进行简化定义。

class Emp {
    private long empno;//员工编号
    private String ename; //员工姓名
    private String dept; //部门名称
    private 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.0);
    }

    public Emp(long empno, String ename, String dept, double salary) {
        this.empno = empno;
        this.ename = ename;
        this.dept = dept;
        this.salary = salary;
    }

    //getter、setter略
    public String getInfo() {
        return "雇员编号:" + this.empno +
                " 雇员姓名:" + this.ename +
                " 所在部门:" + this.dept +
                " 基本工资:" + this.salary;
    }
}

public class JavaDemo { //主类
    public static void main(String[] args) {
        Emp emp = new Emp(89989L, "张三", "财务部", 6500.00);
        System.out.println(emp.getInfo());
    }
}

简单Java类

在开发与设计的过程之中,简单Java类都将作为一个重要的组成部分存在。
所谓的简单java类指的是可以描述某一类信息的程序类,例如:描述一个人、描述一本书,
并且在这个类之中并没有特别复杂的逻辑操作,只作为一种信息存储媒介存在。
对于简单Java类而言,其核心的开发结构如下:

  • 类名称一定要有意义,可以明确的描述某一类事物;。
  • 类之中的所有属性都必须使用private进行封装,同时封装后的属性必须要提供有setter、getter方法
  • 类之中可以提供有无数多个构造方法,但是必须要保留有无参构造方法;
  • 类之中不允许出现任何的输出语句,所有内容的获取必须返回;
    【非必须】可以提供有一个获取对象详细信息的方法,可以暂时定为getInfo();
class Dept {//类名称可以明确描述出某类事物
    private long deptNo;
    private String deptName;
    private String location;

    public Dept() {
    }//必须提供有无参构造方法

    public Dept(long deptNo, String deptName, String location) {
        this.deptNo = deptNo;
        this.deptName = deptName;
        this.location = location;
    }

    public void setDeptNo(long deptNo) {
        this.deptNo = deptNo;
    }

    public long getDeptNo() {
        return this.deptNo;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public String getDeptName() {
        return this.deptName;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getLocation() {
        return this.location;
    }

    public String getInfo() {
        return "【部门信息】部门编号:" + this.deptNo +
                ",部门名称:" + this.deptName +
                ",部门位置:" + this.location;
    }
}

public class JavaDemo {
    public static void main(String arg[]) {
        Dept dept = new Dept(1234L, "财务部", "北京");
        System.out.println(dept.getInfo());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值