美文网首页
11-this调用本类方法

11-this调用本类方法

作者: c88bc9f9d088 | 来源:发表于2020-10-21 09:22 被阅读0次

    除了调用属性之外,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 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();
    }
}

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

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

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

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

  • 【无参构造】编号定义为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;
    }
    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;
    }
}

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

相关文章

  • 11-this调用本类方法

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

  • [iOS]三个问题全面理解runtime

    问题1.分类方法跟本类同名,调用时,会调用谁,如果调用分类的话,那如何调用本类的同名方法? 参考文章:runtim...

  • this引用

    this 有三个作用: 使用this调用本类的成员变量 调用本类中的其他方法 调用构造方法 注意: 在类里面,引用...

  • java你也安全了

    本类若想调用本类的方法,被调用方法需申明为static。顺便说,静态方法不能被重写,如果子类中有一个像重写父类静态...

  • Java this vs super

    1. this vs super this 表示当前对象引用,调用本类(包括继承)的属性、方法、本类构造方法 su...

  • 第四天___②

    this 属性调用 从实际使用角度来讲this可以做三件事: 调用本类属性 调用本类方法(包含普通与构造) 表示当...

  • JavaScript零散知识点

    继承 super 在子类中调用super,会调用父类的方法; 不用super,则会覆盖父类的方法。调用本类中的方法。

  • 继承

    super() 用于调用父类的构造方法 this() 用于调用本类中的构造方法 覆盖 覆盖父类的方法 应保持与...

  • JAVA 集合框架(三)排序

    对Array的排序 同过Arrays的sort方法。 基本类型的排序 调用Arrays.sort(基本类型数组);...

  • This

    this吃透的话是需要时间的,让人头疼 this的三件事情:1.调用本类的属性,2.调用本类的方法(普通与构造)3...

网友评论

      本文标题:11-this调用本类方法

      本文链接:https://www.haomeiwen.com/subject/oirsmktx.html