20220719 第二组 刘世琦 学习记录
Java 面向对象
(今日知识)
-
1. this关键字(掌握)
-
2. 构造器(掌握)
-
3. 封装(掌握)
-
4. get和set(掌握)
思维导图
1. this关键字
当创建一个对象成功后(在构造方法调用前,对象已经创建成功),虚拟机(JVM)会动态的分配一个引用,该引用指向的就是当前对象,这个引用的名字叫做this。
在成员方法中:
谁调用这个方法,那么this就指向那个对象。
在构造方法中:
this指向新创建的那个对象。
this关键字主要应用:
this调用本类中的成员变量;
this调用本类中的成员方法;
this调用本类中的其它构造方法。
1.this可以调用的结构:
属性;方法;构造器。
2.this修饰属性和方法:
(1) this理解为:
①当前对象;
②或当前正在创建的对象。
(2)规则及注意事项:
①在类的方法中,我们可以使用"this.属性 "或"this.方法"的方式。
调用当前对象的属性和方法。
但是,通常情况下,我们都选择省略"this.".
②特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。
③在类的构造器中,我们可以使用"this.属性 "或"this.方法"的 方式。
调用当前正在创建的对象的属性和方法。
但是,通常情况下,我们都选择省略"this.".
特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。
3.this调用构造器:
①在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器。
②构造器中不能使用"this(形参列表)"方式,调用自己。
③如果一个类中,有n个构造器,最多有n-1个构造器中,使用了"this(形参列表)"方式。
④规定:"this(形参列表)"方式,必须声明放在当前构造器首行。
⑤构造器内部,最多只能声明一个"this(形参列表)"方式,用来调用其他构造器 。
举例:
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.setAge(1);
System.out.println(p1.getAge());
}
}
class Person{
//属性
private String name;
private int age;
//构造器
public Person() {
}
public Person(String name) {
this();
this.name = name;//this关键字的使用:不可省略,加上后,表示此变量是属性。
}
public Person(int age) {
this();
this.age = age;
}
//方法
public void setName(String name) {
this.name = name; //this关键字的使用:不可省略,加上后,表示此变量是属性。
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age; //this关键字的使用
}
public int getAge() {
return this.age;//this关键字一般省略。
}
}
this内存原理
2. 构造器
3. 封装
首先我们来看一个例子:
public class People {
int age;
String name;
}
public class Test {
public static void main(String[] args) {
People people = new People();
people.name = "张三";
people.age = 28;
System.out.println(people.name);
System.out.println(people.age);
people.age = -1000;
System.out.println(people.age);
}
}
人怎么可能有负数的年龄,这样很不合理。其他类随便访问,而且随便修改值,这样很不安全。
为什么要封装?好处是?
封装把复杂的事物变成简单的事物,通过一个操作入口。
封装之后才会形成真正的对象,真正的独立体。
封装意味着可以重复使用,适应性强、安全性高。
封装步骤:
所有属性私有化,使用private关键字就行修饰。(private表示私有,修饰的数据只能在本类中访问)
有private修饰但是其它类访问怎么办——>使用getter/setter方法
4. set和get
今日知识总结:
* 1.this代表当前类的对象,代表方法的调用者,通常用在构造器赋值, * set方法赋值。当形参名和成员变量的名相同时,赋值操作。 * 2.封装,思想封装,把一堆重复执行的代码封装成方法。把一堆重复执行的 * 方法封装成一个类。 * 3.封装,代码层次的封装,所有的属性私有化。private,每个属性提供对应的 * setter和getter方法。 * 以后我们的赋值操作: * 1.不再使用对象.属性的方式 * 2.使用构造器 * 3.setter方法 * 习惯:必须保证每个类都有一个无参构造器
今日习题:
1. 需求:
有一个Person类,有name,age属性
有一个Debit类,有cardId,password,balance(余额)属性
Person类有一个开户的方法,openAccount,in(存款,余额增加),out(取款,余额减少,取款时要判断余额)
Debit类中有一个显示银行卡信息的方法。
赋值的方式:
1. 构造器(建议)
2. 直接通过.属性的方式赋值
Person类:
package com.gyc.morning1;
import java.util.Date;
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.xx();
xx();
}
public void xx(){
System.out.println(" 姓名: "+name+" 年龄: "+age);
}
public void in( int s){
debit.balanec+=s;
System.out.println("存入"+s+"元");
debit.xx();
xx();
}
public boolean vaild(int pass){
if (pass==debit.password){
return true;
}
return false;
}
public void out( int s){
if (debit.balanec>=s) {
debit.balanec -= s;
System.out.println("取出"+s+"元");
debit.xx();
xx();
}else {
System.out.println("余额不足");
}
}
}
Debit类:
package com.gyc.morning1;
public class Debit {
int cardId;
int password;
int balanec;
public Debit() {
}
public Debit(int cardId, int password, int balanec) {
this.cardId = cardId;
this.password = password;
this.balanec = balanec;
}
public void xx( ) {
System.out.print(" 银行卡的卡号是:"+this.cardId+" 余额是:"+this.balanec);
}
}
Demo测试类:
package com.gyc.morning1;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Debit debit = new Debit();
Person person = new Person("伟大", 21);
int pass;
a:
for (; ; ) {
System.out.println("请选择功能 1:开户 2:取款 3:存款 ");
int anInt3 = scanner.nextInt();
switch (anInt3) {
case 1:
System.out.println("输入密码");
int anInt1 = scanner.nextInt();
debit = new Debit(622848, anInt1, 200);
person.openAccount(debit);
continue a;
case 2:
b:
for (; ; ) {
if (debit.cardId == 0) {
System.out.println("请先去创建用户");
continue a;
}
System.out.println("输入密码");
pass = scanner.nextInt();
boolean vaild = person.vaild(pass);
if (vaild) {
System.out.println("输入取款金额:");
int inMoney = scanner.nextInt();
person.out(inMoney);
continue a;
}
System.out.println("输入错误");
continue b;
}
case 3:
c:
for (; ; ) {
if (debit.cardId == 0) {
System.out.println("请先去开户");
continue a;
}
System.out.println("输入密码");
pass = scanner.nextInt();
boolean vaild = person.vaild(pass);
if (vaild) {
System.out.println("输入存款金额:");
int outMoney = scanner.nextInt();
person.in(outMoney);
continue a;
}
continue c;
}
}
}
}
}
2.需求
注册和登录!
封装:属性一定要私有化,提供公有的set、get方法
1、创建一个User类,username和password
2、创建一个Employee类,id和name
3、Demo类。
登录:
输入账号和密码,然后去数组中比对,
遍历数组,分别比对账号和面,如果比对成功,则输出登录成功,则输入账号或密码错误!
注册:
用户名不能重复!
遍历,用户名和数组中的用户名比对一下
User类:
package com.gyc.afternoon.test;
public class User {
private int username;
private int password;
public int getUsername() {
return username;
}
public void setUsername(int username) {
this.username = username;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
}
测试类:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Dem0 dem0 = new Dem0();
User[] users = new User[1];
User[] users1 = new User[1];
User user;
int index = 0;
a:
for (; ; ) {
System.out.println("请选择功能 1:注册 2:登录 3:查询");
String flag = scanner.next();
switch (flag) {
case "1":
users = dem0.kuo(users, users1);
System.out.println("请输入账户:");
int username = scanner.nextInt();
boolean b = false;
c:
for (int i = 0; i < users.length; i++) {
if (users[i] == null) {
continue c;
}
if (username == users[i].getUsername()) {
b = true;
break;
}
}
if (b == false) {
System.out.println("请输入密码:");
int password = scanner.nextInt();
user = new User();
user.setPassword(password);
user.setUsername(username);
users[index] = user;
System.out.println("账户:" + users[index].getUsername() + "密码:" + users[index].getPassword());
index++;
continue a;
} else {
System.out.println("用户名重复");
continue a;
}
case "2":
b:
for (; ; ) {
System.out.println("请输入账户:");
int username1 = scanner.nextInt();
System.out.println("请输入密码:");
int password1 = scanner.nextInt();
for (int i = 0; i < users.length; i++) {
if (username1 == users[i].getUsername() && password1 == users[i].getPassword()) {
System.out.println("登陆成功");
continue a;
} else {
continue;
}
}
System.out.println("账户或密码错误,请重新输入");
continue b;
}
case "3":
dem0.bl(users);
break a;
}
}
}
public User[] kuo(User[] users, User[] users1) {
while (users[users.length - 1] != null) {
users1 = new User[users.length + 1];
for (int i = 0; i < users.length; i++) {
users1[i] = users[i];
}
users = users1;
}
return users;
}
public void bl(User[] arr) {
for (User user : arr) {
System.out.println("账户:" + user.getUsername() + "密码:" + user.getPassword());
}
}
总结:
今天的知识点理解起来比较容易,能够跟着老师一步步进行。课上的两个大练习对我来说总有想不到的地方,晚上的作业我并没有像以前一样着急去写,而是让自己有一个大框架再分开几类解决问题,用我所学的知识最大限度的完成,但是我在多个对象是分析时有些混乱,在不断修改中,出现的错误越来越少直至完成,真是一件令人愉快的事情,像我昨天所说一心一意的努力学习,沉下心来提升自己,才能有所收获!