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());
       }
   }

总结:

今天的知识点理解起来比较容易,能够跟着老师一步步进行。课上的两个大练习对我来说总有想不到的地方,晚上的作业我并没有像以前一样着急去写,而是让自己有一个大框架再分开几类解决问题,用我所学的知识最大限度的完成,但是我在多个对象是分析时有些混乱,在不断修改中,出现的错误越来越少直至完成,真是一件令人愉快的事情,像我昨天所说一心一意的努力学习,沉下心来提升自己,才能有所收获!

posted @ 2022-07-19 23:57  刘世琦  阅读(54)  评论(0)    收藏  举报