From ce1e47fe922dcd1de77968cf9bb902cb03a758fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=BF=8A=E5=93=B2?= <2361967167@qq.com> Date: Tue, 27 Dec 2022 12:42:02 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=A2=E5=90=91=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\220\206\347\263\273\347\273\237.md" | 252 ------- ...42\345\220\221\345\257\271\350\261\241.md" | 671 ++++++++++++++++++ 2 files changed, 671 insertions(+), 252 deletions(-) delete mode 100644 "24 \351\231\210\344\277\212\345\223\262/20221222 \345\255\246\347\224\237\347\256\241\347\220\206\347\263\273\347\273\237.md" create mode 100644 "24 \351\231\210\344\277\212\345\223\262/\351\235\242\345\220\221\345\257\271\350\261\241.md" diff --git "a/24 \351\231\210\344\277\212\345\223\262/20221222 \345\255\246\347\224\237\347\256\241\347\220\206\347\263\273\347\273\237.md" "b/24 \351\231\210\344\277\212\345\223\262/20221222 \345\255\246\347\224\237\347\256\241\347\220\206\347\263\273\347\273\237.md" deleted file mode 100644 index 377cc33..0000000 --- "a/24 \351\231\210\344\277\212\345\223\262/20221222 \345\255\246\347\224\237\347\256\241\347\220\206\347\263\273\347\273\237.md" +++ /dev/null @@ -1,252 +0,0 @@ -~~~java -//创建学生面向对象 -package project.studentSystem; - -public class Student { - // id name age address - private String id; - private String name; - private int age; - private String address; - - public Student() { - } - - public Student(String id, String name, int age, String address) { - this.id = id; - this.name = name; - this.age = age; - this.address = address; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } -} -~~~ - -~~~java -//主程序 -package project.studentSystem; - -import java.util.ArrayList; -import java.util.Scanner; - -public class StudentSystem { - public static void main(String[] args) { - ArrayList list = new ArrayList<>(); - while (true) { - System.out.println("----------欢迎来到闽大学生管理系统----------"); - System.out.println("1:添加学生"); - System.out.println("2:删除学生"); - System.out.println("3:修改学生"); - System.out.println("4:查询学生"); - System.out.println("5:退出"); - System.out.println("请输入您的选择"); - - //键盘录入 - Scanner sc = new Scanner(System.in); - String choose = sc.next(); - - switch (choose){ - case "1" -> addStudent(list); -// System.out.println("添加学生"); - - case "2" -> delStudent(list); -// System.out.println("删除学生"); - - case "3" -> updateStudent(list); -// System.out.println("修改学生"); - - case "4" ->queryStudent(list); -// System.out.println("查询学生"); - - case "5" -> { - System.out.println("退出"); -// break loop; - System.exit(0);//停止虚拟机运行(所有代码全部结束) - } - default -> System.out.println("没有这个选项"); - } - } - } - - - //添加学生 - //添加功能: - //键盘录入每一位学生信息并添加,需要满足ID唯一。 - public static void addStudent(ArrayList list){ - Scanner sc = new Scanner(System.in); - Student s = new Student(); - - System.out.println("请输入学生的ID:"); - String id = null; - while (true) { - id = sc.next(); - boolean flag = contains(list, id); - if (flag){ - //表示ID已经存在 - System.out.println("id已存在,请重新录入"); - - }else { - s.setId(id); - break; - } - } - - System.out.println("请输入学生的姓名:"); - String name = sc.next(); - s.setName(name); - - System.out.println("请输入学生的年龄:"); - int age = sc.nextInt(); - s.setAge(age); - - System.out.println("请输入学生的家庭住址:"); - String address = sc.next(); - s.setAddress(address); - - //将学生对象数据添加到集合 - list.add(s); - - //提示用户是否添加成功 - - } - - //删除学生 - //删除功能: - //键盘录入要删除的学生的ID - //需求:id存在,删除id。id不存在,提示不存在,并回到初始菜单。 - public static void delStudent(ArrayList list){ - Scanner sc = new Scanner(System.in); - System.out.println("请输入要删除的学生的id"); - String id = sc.next(); - //查询id在集合中的索引 - int index = getIndex(list, id); - //对index进行判断 - //如果等于-1,表示不存在,结束方法,返回初始菜单。 - if (index >= 0){ - //如果大于等于零,表示存在,直接删除 - list.remove(index); - System.out.println("id为:"+ id + "的学生删除成功"); - }else { - System.out.println("id不存在,删除失败"); - } - - } - - //修改学生 - //修改功能: - //键盘录入要修改的学生的ID - //需求:id存在,修改信息。id不存在,提示不存在,并回到初始菜单。 - public static void updateStudent(ArrayList list){ - Scanner sc = new Scanner(System.in); - System.out.println("请输入要修改学生的ID"); - String id = sc.next(); - int index = getIndex(list, id); - if (index == -1){ - System.out.println("要修改的id:" + id + "不存在,请重新输入"); - return; - } - - //当代码执行到这里,表示当前id存在 - //获取要修改id的学生对象 - Student stu = list.get(index); - - //输入修改信息 - System.out.println("请输入要修改的学生姓名"); - String newName = sc.next(); - stu.setName(newName); - - System.out.println("请输入要修改的学生年龄"); - int newAge = sc.nextInt(); - stu.setAge(newAge); - - System.out.println("请输入要修改的学生的家庭住址"); - String newAddress = sc.next(); - stu.setAddress(newAddress); - - System.out.println("学生信息修改成功"); - } - - //查询学生 - public static void queryStudent(ArrayList list){ - if (list.size() == 0) { - System.out.println("当前无学生信息,请添加后查询"); - //结束方法 - return; - } - //打印表头信息 - System.out.println("id\t\t姓名\t年龄\t家庭住址"); - //当代码执行到这,代表集合中是有数据的 - for (int i = 0; i < list.size(); i++) { - Student stu = list.get(i); - System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t" + stu.getAddress()); - } - } - - //判断id在集合中是否存在 - public static boolean contains(ArrayList list,String id){ -/* //循环遍历集合得到里面的每一个学生对象 - for (int i = 0; i < list.size(); i++) { - Student stu = list.get(i); - String sid = stu.getId(); - //拿到学生对象后,获取id并进行判断 - if (sid.equals(id)){ - //存在 true - return true; - } - } - //不存在 false - return false;*/ - return getIndex(list,id) >= 0; - } - - //通过id获取索引的方法 - public static int getIndex(ArrayList list,String id){ - //遍历集合 - for (int i = 0; i < list.size(); i++) { - //得到每一个学生对象 - Student stu = list.get(i); - //得到每一个学生对象的id - String sid = stu.getId(); - //拿着集合中的学生id跟要查询的id进行比较 - if (sid.equals(id)){ - //一样,返回索引 - return i; - } - } - //不存在的索引 - return -1; - } -} -~~~ - diff --git "a/24 \351\231\210\344\277\212\345\223\262/\351\235\242\345\220\221\345\257\271\350\261\241.md" "b/24 \351\231\210\344\277\212\345\223\262/\351\235\242\345\220\221\345\257\271\350\261\241.md" new file mode 100644 index 0000000..4eb0dab --- /dev/null +++ "b/24 \351\231\210\344\277\212\345\223\262/\351\235\242\345\220\221\345\257\271\350\261\241.md" @@ -0,0 +1,671 @@ +## 1. 类和对象 + +### 1.1 类和对象的理解 + +客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。 + +* 类 + * 类的理解 + * 类是对现实生活中一类具有共同属性和行为的事物的抽象 + * 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合 + * 简单理解:类就是对现实事物的一种描述 + * 类的组成 + * 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸) + * 行为:指事物能执行的操作,例如:手机事物(打电话,发短信) +* 类和对象的关系 + * 类:类是对现实生活中一类具有共同属性和行为的事物的抽象 + * 对象:是能够看得到摸的着的真实存在的实体 + * 简单理解:**类是对事物的一种描述,对象则为具体存在的事物** + +### 1.2 类的定义 + +类的组成是由属性和行为两部分组成 + +* 属性:在类中通过成员变量来体现(类中方法外的变量) +* 行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可) + +类的定义步骤: + +①定义类 + +②编写类的成员变量 + +③编写类的成员方法 + +```java +public class 类名 { + // 成员变量 + 变量1的数据类型 变量1; + 变量2的数据类型 变量2; + … + // 成员方法 + 方法1; + 方法2; +} +``` + +示例代码: + +```java +/* + 手机类: + 类名: + 手机(Phone) + + 成员变量: + 品牌(brand) + 价格(price) + + 成员方法: + 打电话(call) + 发短信(sendMessage) + */ +public class Phone { + //成员变量 + String brand; + int price; + + //成员方法 + public void call() { + System.out.println("打电话"); + } + + public void sendMessage() { + System.out.println("发短信"); + } +} + +``` + +### 1.3 对象的使用 + +* 创建对象的格式: + * 类名 对象名 = new 类名(); +* 调用成员的格式: + * 对象名.成员变量 + * 对象名.成员方法(); +* 示例代码 + +```java +/* + 创建对象 + 格式:类名 对象名 = new 类名(); + 范例:Phone p = new Phone(); + + 使用对象 + 1:使用成员变量 + 格式:对象名.变量名 + 范例:p.brand + 2:使用成员方法 + 格式:对象名.方法名() + 范例:p.call() + */ +public class PhoneDemo { + public static void main(String[] args) { + //创建对象 + Phone p = new Phone(); + + //使用成员变量 + System.out.println(p.brand); + System.out.println(p.price); + + p.brand = "小米"; + p.price = 2999; + + System.out.println(p.brand); + System.out.println(p.price); + + //使用成员方法 + p.call(); + p.sendMessage(); + } +} +``` + +### 1.4 学生对象-练习 + +* 需求:首先定义一个学生类,然后定义一个学生测试类,在学生测试类中通过对象完成成员变量和成员方法的使用 +* 分析: + * 成员变量:姓名,年龄… + * 成员方法:学习,做作业… +* 示例代码: + +```java +public class Student { + //成员变量 + String name; + int age; + + //成员方法 + public void study() { + System.out.println("好好学习,天天向上"); + } + + public void doHomework() { + System.out.println("键盘敲烂,月薪过万"); + } +} +/* + 学生测试类 + */ +public class StudentDemo { + public static void main(String[] args) { + //创建对象 + Student s = new Student(); + + //使用对象 + System.out.println(s.name + "," + s.age); + + s.name = "林青霞"; + s.age = 30; + + System.out.println(s.name + "," + s.age); + + s.study(); + s.doHomework(); + } +} +``` + +## 2. 对象内存图 + +### 2.1 单个对象内存图 + +* 成员变量使用过程 + +![1](\images\1.png) + +* 成员方法调用过程 + +![2](E:\BaiduNetdiskDownload\images\2.png) + +### 2.2 多个对象内存图 + +* 成员变量使用过程 + +![3](images\3.png) + +* 成员方法调用过程 + +![4](images\4.png) + +* 总结: + + 多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份 + +## 3. 成员变量和局部变量 + +### 3.1 成员变量和局部变量的区别 + +* 类中位置不同:成员变量(类中方法外)局部变量(方法内部或方法声明上) +* 内存中位置不同:成员变量(堆内存)局部变量(栈内存) +* 生命周期不同:成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而存在,醉着方法的调用完毕而消失) +* 初始化值不同:成员变量(有默认初始化值)局部变量(没有默认初始化值,必须先定义,赋值才能使用) + +## 4. 封装 + +### 4.1 封装思想 + +1. 封装概述 + 是面向对象三大特征之一(封装,继承,多态) + + **对象代表什么,就得封装对应的数据,并提供数据对应的行为** + +2. 封装代码实现 + 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 + 成员变量private,提供对应的getXxx()/setXxx()方法 + +### 4.2 private关键字 + +private是一个修饰符,可以用来修饰成员(成员变量,成员方法) + +* 被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作 + + * 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰 + * 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰 + +* 示例代码: + + ```java + /* + 学生类 + */ + class Student { + //成员变量 + String name; + private int age; + + //提供get/set方法 + public void setAge(int a) { + if(a<0 || a>120) { + System.out.println("你给的年龄有误"); + } else { + age = a; + } + } + + public int getAge() { + return age; + } + + //成员方法 + public void show() { + System.out.println(name + "," + age); + } + } + /* + 学生测试类 + */ + public class StudentDemo { + public static void main(String[] args) { + //创建对象 + Student s = new Student(); + //给成员变量赋值 + s.name = "林青霞"; + s.setAge(30); + //调用show方法 + s.show(); + } + } + ``` + +### 4.3 private的使用 + +* 需求:定义标准的学生类,要求name和age使用private修饰,并提供set和get方法以及便于显示数据的show方法,测试类中创建对象并使用,最终控制台输出 林青霞,30 + +* 示例代码: + + ```java + /* + 学生类 + */ + class Student { + //成员变量 + private String name; + private int age; + + //get/set方法 + public void setName(String n) { + name = n; + } + + public String getName() { + return name; + } + + public void setAge(int a) { + age = a; + } + + public int getAge() { + return age; + } + + public void show() { + System.out.println(name + "," + age); + } + } + /* + 学生测试类 + */ + public class StudentDemo { + public static void main(String[] args) { + //创建对象 + Student s = new Student(); + + //使用set方法给成员变量赋值 + s.setName("林青霞"); + s.setAge(30); + + s.show(); + + //使用get方法获取成员变量的值 + System.out.println(s.getName() + "---" + s.getAge()); + System.out.println(s.getName() + "," + s.getAge()); + + } + } + ``` + +### 4.4 this关键字 + +* this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题) + * 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量 + * 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量 + +```java +public class Student { + private String name; + private int age; + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setAge(int age) { + this.age = age; + } + + public int getAge() { + return age; + } + + public void show() { + System.out.println(name + "," + age); + } +} +``` + +## 5. 构造方法 + +### 5.1 构造方法概述 + +构造方法是一种特殊的方法 + +* 作用:创建对象 Student stu = **new Student();** + +* 格式: + + public class 类名{ + + 修饰符 类名( 参数 ) { + + } + + } + +* 功能:主要是完成对象数据的初始化 + +* 示例代码: + +```java +class Student { + private String name; + private int age; + + //构造方法 + public Student() { + System.out.println("无参构造方法"); + } + + public void show() { + System.out.println(name + "," + age); + } +} +/* + 测试类 + */ +public class StudentDemo { + public static void main(String[] args) { + //创建对象 + Student s = new Student(); + s.show(); + } +} +``` + +### 5.2 构造方法的注意事项 + +* 构造方法的创建 + +如果没有定义构造方法,系统将给出一个默认的无参数构造方法 +如果定义了构造方法,系统将不再提供默认的构造方法 + +* 构造方法的重载 + +如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法 + +* 推荐的使用方式 + +无论是否使用,都手工书写无参数构造方法 + +* 重要功能! + +可以使用带参构造,为成员变量进行初始化 + +* 示例代码 + +```java +/* + 学生类 + */ +class Student { + private String name; + private int age; + + public Student() {} + + public Student(String name) { + this.name = name; + } + + public Student(int age) { + this.age = age; + } + + public Student(String name,int age) { + this.name = name; + this.age = age; + } + + public void show() { + System.out.println(name + "," + age); + } +} +/* + 测试类 + */ +public class StudentDemo { + public static void main(String[] args) { + //创建对象 + Student s1 = new Student(); + s1.show(); + + //public Student(String name) + Student s2 = new Student("林青霞"); + s2.show(); + + //public Student(int age) + Student s3 = new Student(30); + s3.show(); + + //public Student(String name,int age) + Student s4 = new Student("林青霞",30); + s4.show(); + } +} +``` + +### 5.3 标准类制作 + +① 类名需要见名知意 + +② 成员变量使用private修饰 + +③ 提供至少两个构造方法 + +* 无参构造方法 +* 带全部参数的构造方法 + +④ get和set方法 + + 提供每一个成员变量对应的setXxx()/getXxx() + +⑤ 如果还有其他行为,也需要写上 + +### 5.4 练习1 + +需求: + + 定义标准学生类,要求分别使用空参和有参构造方法创建对象,空参创建的对象通过setXxx赋值,有参创建的对象直接赋值,并通过show方法展示数据。 + +* 示例代码: + +```java +class Student { + //成员变量 + private String name; + private int age; + + //构造方法 + public Student() { + } + + public Student(String name, int age) { + this.name = name; + this.age = age; + } + + //成员方法 + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setAge(int age) { + this.age = age; + } + + public int getAge() { + return age; + } + + public void show() { + System.out.println(name + "," + age); + } +} +/* + 创建对象并为其成员变量赋值的两种方式 + 1:无参构造方法创建对象后使用setXxx()赋值 + 2:使用带参构造方法直接创建带有属性值的对象 +*/ +public class StudentDemo { + public static void main(String[] args) { + //无参构造方法创建对象后使用setXxx()赋值 + Student s1 = new Student(); + s1.setName("林青霞"); + s1.setAge(30); + s1.show(); + + //使用带参构造方法直接创建带有属性值的对象 + Student s2 = new Student("林青霞",30); + s2.show(); + } +} +``` + +### 5.4 练习2 + +```java +public class User { + //1.私有化全部的成员变量 + //2.空参构造 + //3.带全部参数的构造 + //4.针对于每一个私有化的成员变量都要提供其对应的get和set方法 + //5.如果当前事物还有其他行为,那么也要写出来,比如学生的吃饭,睡觉等行为 + + private String username;//用户名 + private String password;//密码 + private String email;//邮箱 + private char gender;//性别 + private int age;//年龄 + + //空参构造方法 + public User() { + } + + //带全部参数的构造 + public User(String username, String password, String email, char gender, int age) { + this.username = username; + this.password = password; + this.email = email; + this.gender = gender; + this.age = age; + } + + //get和set + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public char getGender() { + return gender; + } + + public void setGender(char gender) { + this.gender = gender; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public void eat(){ + System.out.println(username + "在吃饭"); + } +} + +public class Test { + public static void main(String[] args) { + //写一个标准的javabean类 + //咱们在课后只要能把这个标准的javabean能自己写出来,那么就表示今天的知识点就ok了 + + + //利用空参构造创建对象 + User u1 = new User(); + //如果利用空参创建对象,还想赋值只能用set方法赋值 + u1.setUsername("zhangsan"); + u1.setPassword("1234qwer"); + u1.setEmail("itheima@itcast.cn"); + u1.setGender('男'); + u1.setAge(23); + //获取属性的值并打印 + System.out.println(u1.getUsername() + ", " + u1.getPassword() + + ", " + u1.getEmail() + ", " + u1.getGender() + ", " + u1.getAge()); + u1.eat(); + + System.out.println("============================="); + + //简单的办法 + //利用带全部参数的构造来创建对象 + //快捷键:ctrl + p + User u2 = new User("lisi","12345678","lisi@itcast.cn",'女',24); + System.out.println(u2.getUsername() + ", " + u2.getPassword() + + ", " + u2.getEmail() + ", " + u2.getGender() + ", " + u2.getAge()); + u2.eat(); + } +} + +``` \ No newline at end of file -- Gitee