course-34 b站243:面向对象基础(构造器)
构造器练习
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 经典面试题
4. this关键字 245-246
4.1 问题引出
例如: 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
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);
}
}