构造器和this关键字
  TEZNKK3IfmPf 2023年11月13日 27 0

构造器练习

1. 构造器接上部分course-33

2. 构造方法练习 243

在前面定义的 Person 类中添加两个构造器:

第一个无参构造器:利用构造器设置所有人的 age 属性初始值都为 18

第二个带 pName 和 pAge 两个参数的构造器:使得每次创建 Person 对象的同时初始化对象的 age 属性值和 name 属性值。 分别使用不同的构造器,创建对象.

public class Test34
{
  public static void main(String[] args)
  {
    Person p1 = new Person();//无参构造器
    System.out.println("p1的信息name="+p1.name+"  age="+p1.age);//null 18

    Person p2 = new Person("jack",22);
    System.out.println("p2的信息name="+p2.name+"  age="+p2.age);//jack 22
  }
}
class Person
{
  String name;//默认null
  int age;//默认0
  // 第一个无参构造器:利用构造器设置所有人的 age 属性初始值都为 18 
  public Person()
  {
    age=18;
  }
  //第二个带 pName 和 pAge 两个参数的构造器
  public Person(String pName,int pAge)
  {
    name=pName;
    age=pAge;
  }
}

3. 对象创建的流程分析(重点) 244

3.1 经典面试题

构造器和this关键字

构造器和this关键字

4. this关键字 245-246

4.1 问题引出

构造器和this关键字

构造器和this关键字

例如: this.name 就是当前对象属性

4.2 例

//this关键字  245
public class Test34
{
  public static void main(String[] args)
  {
    Dog dog1 = new Dog("大壮",3);//对象 //当前对象
    dog1.info();
  }
}
class Dog
{
  String name;//属性
  int age;//属性
  //构造器
  // public Dog(String dName,int dAge)
  // {
  //  name=dName;
  //  age=dAge;
  // }

  //如果我们构造器的形参,能够直接写成属性名,就更好了 
  //但是出现了一个问题,根据变量的作用域原则 
  //构造器的 name 是局部变量,而不是属性 
  //构造器的 age 是局部变量,而不是属性
  //==> 引出 this 关键字来解决
  public Dog(String name,int age)
  {
    this.name=name;//this.name 就是当前对象的属性 name  //当前对象是指谁在调用这个构造器谁就是当前对象
    this.age=age;//this.age 就是当前对象的属性 age
  }

  //成员方法,输出信息
  public void info()
  {
    System.out.println(name+"\t"+age+"\t");
  }
}

5. this深入理解 247-248

构造器和this关键字

public class Test34
{
  public static void main(String[] args)
  {
    Dog dog1 = new Dog("大壮",3);//对象 
    System.out.println("dog1的hashCode="+dog1.hashCode());//hashCode()可以返回对象的一个值,类似于地址但不是地址
    dog1.info();

    System.out.println("============");
    Dog dog2 = new Dog("大花",8);//对象 
    System.out.println("dog2的hashCode="+dog2.hashCode());
    dog2.info();
  }
}
class Dog
{
  String name;//属性
  int age;//属性

  //如果我们构造器的形参,能够直接写成属性名,就更好了 
  //但是出现了一个问题,根据变量的作用域原则 
  //构造器的 name 是局部变量,而不是属性 
  //构造器的 age 是局部变量,而不是属性
  //==> 引出 this 关键字来解决
  public Dog(String name,int age)
  {
    this.name=name;//this.name 就是当前对象的属性 name  //当前对象是指谁在调用这个构造器谁就是当前对象
    this.age=age;//this.age 就是当前对象的属性 age
    System.out.println("this.hashcode="+this.hashCode());
  }

  //成员方法,输出信息
  public void info()
  {
    System.out.println("this.hashCode="+this.hashCode());
    System.out.println(name+"\t"+age+"\t");
  }
}

6. this注意事项 249

1) this 关键字可以用来访问本类的属性、方法、构造器

2) this 用于区分当前类的属性和局部变量

3) 访问成员方法的语法:this.方法名(参数列表);

4) 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)

5) this 不能在类定义的外部使用,只能在类定义的方法中使用。

6.1 访问成员方法的语法:this.方法名(参数列表);

public class Test34
{
  public static void main(String[] args)
  {
    T t1 = new T();
    t1.f2();//结果调用f2一次,f1两次
  }
}
class T
{
  public void f1()
  {
    System.out.println("f1()..方法");
  }

  public void f2()
  {
    System.out.println("f2()..方法");
    //调用本类的f1方法
    //第一种方式
    f1();
    //第二种方式
    this.f1();
  }
}

6.2 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)

public class Test34
{
  public static void main(String[] args)
  {
    T t2 = new T();
    t2.f3();

  }
}
class T
{
  String name="jack";//属性
  int age=18;

  public T()//无参构造器
  {
    //这里访问T(String name,int age)
    //访问构造器语法:this(参数列表);必须放置在第一条语句(后面讲解)
    this("jack",100);
    System.out.println("T()构造器");
  }

  public T(String name,int age)
  {
    System.out.println("T(String name,int age)构造器");
  }

  public void f3()
  {
    //this 关键字可以用来访问本类的属性、方法、构造器 
    //传统方法
    System.out.println("name="+name+" age="+age);
    //this方法
    System.out.println("name="+this.name+" age="+this.age);
  }
}

7. this练习 250

定义 Person 类,里面有 name、age 属性,并提供 compareTo 比较方法,用于判断是否和另一个人相等,提供测试类TestPerson 用于测试, 名字和年龄完全一样,就返回 true, 否则返回 false

public class Test35
{
  public static void main(String[] args)
  {
    Person p1 = new Person("mary",20);
    Person p2 = new Person("smith",30);
    System.out.println("p1和p2比较的结果="+p1.compareTo(p2));//其中p1就代表this指向的姓名年龄,把p2传给p
  }
}
class Person
{
  String name;
  int age;
  //构造器
  public Person(String name,int age)
  {
    this.name=name;
    this.age=age;
  }
  //compareTo比较方法
  public boolean compareTo(Person p)//这里的p接收传来的p2值
  {
    //名字年龄完全一样
    if(this.name.equals(p.name)&&this.age==p.age)
    {
      return true;
    }
    else
    {
      return false;
    }
  }
}

8. 本章练习

8.1 例1 251

编写类A01,定义max方法实现求某个double数组的最大值,并返回

//编写类A01,定义max方法实现求某个double数组的最大值,并返回
public class Test35
{
  public static void main(String[] args)
  {
    A01 a01 = new A01();
    double arr[] = {1.0,4.7,1.8};
    Double res = a01.max(arr);
    if (res!=null) 
    {
      System.out.println("最大值="+res);//4.7
    }
    else
    {
      System.out.println("arr输入有误,arr不能是null,或者{}");
    }
  }
}
class A01
{
  //分析
  //类名A01
  //方法名max
  //形参double arr[]
  //返回值 double
  public Double max(double arr[])//Double大写的是一种包装类是可以放回null的
  {
    //保证arr至少有一个元素
    if(arr!=null && arr.length>0)//先判断arr不等于空,然后在判断length是否>0
    {
    double max = arr[0];//假定第一个元素就是最大
    for(int i=0;i<arr.length;i++)
    {
      if(max<arr[i])
      {
        max=arr[i];
      }
    }
    return max;
    }
    else
    {
      return null;
    }
  }
}

8.2 例2 252

编写类A02,定义方法find,实现查找某字符是否在字符串数组中,并返回索引,如果找不到,返回-1

//编写类A02,定义方法find,实现查找某字符是否在字符串数组中,并返回索引,如果找不到,返回-1
public class Test35
{
  public static void main(String[] args)
  {
    String str[]={"jack","tom","july","smith"};
    A02 a02 = new A02();
    int index = a02.find("tom",str);
    System.out.println("查找的下标index="+index);
  }
}
class A02
{
  //分析
  //类名A02
  //方法名find
  //形参(String,String[])
  //返回值int
  public int find(String findstr,String str[])
  {
    //直接遍历,找到返回下标
    for(int i=0;i<str.length;i++)
    {
      if(findstr.equals(str[i]))
      {
        return i;
      }
    }
    return -1;
  }
}

8.3 例3 253

编写类 Book定义方法updatePrice,实现更改某本书的价格,具体:如果价格>150,则更改为150,如果价格>100,更改为100,否则不变

//编写类 Book定义方法updatePrice,实现更改某本书的价格,
//具体:如果价格>150,则更改为150,如果价格>100,更改为100,否则不变
public class Test35
{
  public static void main(String[] args)
  {
    Book book = new Book("西游记",300);
    book.info();
    book.updatePrice();//更新价格
    book.info();
  }
}
  //分析
  //类名Book
  //属性price,name
  //方法名updatePrice
  //形参()
  //返回值void
  //提供一个构造器
class Book
{
  String name;
  double price;
  public Book(String name,int price)//构造器
  {
    this.name=name;
    this.price=price;
  }
  public void updatePrice()
  {
    if(this.price>150)
    {
      this.price=150;
    }
    else if(this.price>100)
    {
      this.price=100;
    }
  }
  //显示书籍信息
  public void info()
  {
    System.out.println("书名="+this.name+" 价格="+this.price);
  }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月12日   85   0   0 关键字c语言
  TEZNKK3IfmPf   2023年11月15日   33   0   0 关键字C++
  TEZNKK3IfmPf   2023年11月13日   71   0   0 反射构造器
  TEZNKK3IfmPf   2024年05月17日   58   0   0 关键字python
  TEZNKK3IfmPf   2023年11月13日   56   0   0 关键字final
TEZNKK3IfmPf