构造器/this:
什么时候用构造器赋值?
- 看创建对象是为了干什么?
- 如果说创建对象仅仅是为了调用这个类的方法,建议使用无参构造器
- 如果说创建对象的时候需要使用到对象的某个属性,可以使用构造器赋值
ublic class Ch01 {
public static void main(String[] args) {
// person是Person类的对象,是Person类的实例
Person person = new Person();
// 对象有什么功能?
// 对象可以调属性,可以调方法
// 对象调用的属性和方法
person.name = "小明";
person.age = 20;
// person.eat();
Car car = new Car();
car.brand = "奔驰";
car.color = "黑色";
// car.run();
// person.travel(car);
// p2出生,就会有name,age,wife
Wife wife = new Wife();
wife.name = "李四";
wife.age = 25;
// p2一创建出来,所有的属性都会跟着初始化
Person p2 = new Person("张三",25,wife);
// p3一创建出来,就只有name和age,没有wife
Person p3 = new Person("王五",26);
}
}
this关键字
-
this代表的是当前类的对象,this代表的是当前方法的调用者
-
this既然是代表方法的调用者,它实际上和对象的作用是一样的
-
既可以调属性,也可以调方法。
-
一个类中可以有什么?
-
属性,方法,构造器
-
this不能用在static方法中。
-
开发中,this通常用在什么位置!
-
通常用在赋值,构造器赋值。
调用构造器
不需要写任何的名字
this调用构造器的要求
1、必须在构造器中使用this调用构造器
2、必须是第一句话(第一行代码)
无参构造器
租借关系,不写在成员变量,声明局部变量
例子1
有一个Person类,有name,age属性
有一个Debit类,有cardId,password,balance(余额)属性
Person类有一个开户的方法,openAccount,in(余额增加),out(余额减少,取款时要判断余额)Debit类中有一个显示银行卡信息的方法。
赋值的方式:
1.构造器(建议)
2.直接通过.属性的方式赋值
分析:
开户:给Person类的Debit属性赋值,Debit初始化时需要给cardId,password,balance赋值
最终在Demo类中测试相关功能
加功能:键盘输入,存款和取款需要比对密码。
加键盘输入:
哪些地方是需要我们来输入的?
1.密码,余额
2.存多少钱
3.取多少钱
在哪里写键盘输入Scanner写在哪里?
Scanner应该出现在main里
demo类
public class Demo {
public static void main(String[] args) {
Person person = new Person("张三",25);
Debit debit = new Debit("665544998877",123456,100);
person.openAccount(debit);
person.in(151);
person.out(200);
person.out(100);
}
}
Person类
public class Person {
String name;
int age;
Debit debit;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void openAccount(Debit debit) {
this.debit = debit;
// 开户成功,显示一下开户信息
debit.show();
show();
}
public void in(double money) {
// 存款:修改余额并且重新赋值
debit.balance += money;
System.out.println("存款成功!余额为:" + debit.balance);
}
public void out(double money) {
// 取款:修改余额并且重新赋值
if(money <= debit.balance){
debit.balance -= money;
System.out.println("取款成功!余额为:" + debit.balance);
}else {
System.out.println("余额不足!余额为:" + debit.balance);
}
}
public void show() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
public boolean valid(int pass){
if(pass == debit.password){
return true;
}
return false;
}
}
Debit类
public class Debit {
String cardId;
int password;
double balance;
public Debit(){}
public Debit(String cardId, int password, double balance) {
this.cardId = cardId;
this.password = password;
this.balance = balance;
}
public void show() {
System.out.println("卡号:" + cardId + ",余额:" + balance);
}
2.0版本
public class Demo02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Person person = new Person("张三",25);
for(;;){
System.out.println("请选择功能:1.开户 2.存款 3.取款");
String flag = sc.next();
switch (flag) {
case "1":
System.out.println("请输入账户密码:");
int password = sc.nextInt();
System.out.println("请输入余额:");
double balance = sc.nextDouble();
Debit debit = new Debit("654987",password,balance);
person.openAccount(debit);
break;
case "2":
System.out.println("请输入密码:");
int pass = sc.nextInt();
// 接下来要去比对密码。
// 存款的时候需要比对密码
// 取款也需要比对密码
// 既然两个地方都需要比对密码,那我们可以把类似功能的代码封装成一个方法
// 如果说一堆的方法都需要重复使用,我们还可以把一堆的方法封装成一个类
boolean b = person.valid(pass);
if(b){
System.out.println("请输入存款金额:");
double money = sc.nextDouble();
person.in(money);
} else {
System.out.println("密码有误,无法存款!");
}
break;
case "3":
System.out.println("请输入密码:");
int pass1 = sc.nextInt();
boolean b1 = person.valid(pass1);
if(b1){
System.out.println("请输入取款金额:");
double money = sc.nextDouble();
person.out(money);
} else {
System.out.println("密码有误,无法取款!");
}
break;
}
}
}
}
封装
面向对象的特征:封装
1.代码层面
(1)属性私有化,所有的属性都要使用private封装
(2)提供一个公有的set,get方法。
getter方法能够按照客户的期望返回格式化的数据
setter方法可以限制和检验setter方法传入的参数是否合法
隐藏对象的内部结构
正确定义一个类:
(1)所有的属性私有化
(2)每个属性都有对应的setter、getter方法
2.思想层面
privte私有性;封装,别的类不可以随意调用,用setAge getAge
public static void main(String[] args) {
Person jack = new Person(); //new 一个对象jack
jack.setAge(23); //调用setAge方法,设置age的值
int i = jack.getAge(); //得到age的值赋给i
System.out.println("jack age is:"+i);
}
}
set 是设置 get是得到
你上面的setAge是设置变量age的值,而getAge是得到变量age的值,
这样做的好处是,只要你new Person 对象,就可以用对象来点这些方法。
今日总结:
this代表当前类的对象,代表方法的调用者,通常用在构造器赋值,
-
set方法赋值。当形参名和成员变量的名相同时,赋值操作。
-
2.封装,思想封装,把一堆重复执行的代码封装成方法。把一堆重复执行的
-
方法封装成一个类。
-
3.封装,代码层次的封装,所有的属性私有化。private,每个属性提供对应的
-
setter和getter方法。
-
以后我们的赋值操作:
-
1.不再使用对象.属性的方式
-
2.使用构造器
-
3.setter方法
-
习惯:必须保证每个类都有一个无参构造器
构造器:了解,基本会用知道怎么用,但是不熟练
This 用法:基本理解,但是做题的时候需要理解一会,
封装:用法了解,用的时候赋值时容易思路乱
今日学习心得:
知识点了解,但是没有消化掉,自己学习效率比较低,知识运用的不好感觉理解不透彻
原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/275532.html