11-this调用本类方法

2020-10-21  本文已影响0人  c88bc9f9d088

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

范例:调用类中的普通方法

class Person {  //定义一个类
    private String name;   //人员的姓名
    private int age;       //人的年龄

    //方法名称与类名称相同,并且无返回值定义
    public Person(String name,int age){   //定义有参构造
        this.setName(name);
        setAge(age);    //加与不加都表示本类方法
    }
    
    public void tell(){
        System.out.println("姓名:"+name+"、年龄:"+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 JavaDemo {   //主类
    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){
        System.out.println("****一个新的Person类对象实例化****");
        this.name = name;
    }
    public Person(String name,int age){   //定义有参构造
        System.out.println("****一个新的Person类对象实例化****");
        this.name = name;
        this.age = age;
    }
    
    public void tell(){
        System.out.println("姓名:"+name+"、年龄:"+age);
    }
}
public class JavaDemo {   //主类
    public static void main(String [] args){
        Person per = new Person("王五",38);
        per.tell();
    }
}

如果要想评价一个代码的好坏:

利用this()构造调用优化:

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.name = name;
        this.age = age;
    }
    
    public void tell(){
        System.out.println("姓名:"+name+"、年龄:"+age);
    }
}
public class JavaDemo {   //主类
    public static void main(String [] args){
        Person per = new Person("王五");
        per.tell();
    }
}

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

public Person(){
        this("hahaha",10);   //无参调多参构造
        System.out.println("****一个新的Person类对象实例化****");
    }
    public Person(String name){
        this();     //调用本类无参构造
        this.name = name;
    }
    public Person(String name,int age){   //定义有参构造
        this(name);     //调用本类单参构造
        this.name = name;
        this.age = age;
    }

    此时的程序在进行编译的时候将会直接出现错误提示:告诉用户,出现了构造方法的递归调用。

    构造方法互相调用案例:
    现在要求定义一个描述有员工信息的程序类,该类中提供有:编号、姓名、部门、工资,在这个类之中提供有四个构造方法:

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;
    }
    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 JavaDemo {   //主类
    public static void main(String [] args){
        Emp emp = new Emp(7369L,"李兴华","财务部",7500.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;
    }
    //setter、getter 略
    public String getInfo(){
        return "雇员编号:" + this.empno + 
               "、雇员姓名:" + this.ename +
               "、所在部门:" + this.dept +
               "、基本工资:" + this.salary;
    }
}

    代码的任何位置上都可能有重复,所以消除重复的代码是先期学习之中最需要考虑的部分。

上一篇 下一篇

猜你喜欢

热点阅读