声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)
往期回顾
Java学习day06:面向对象基础,构造方法,成员/局部变量_凌~风的博客-CSDN博客
Java学习day05:排序,选择、冒泡、快速、二分、杨辉三角-CSDN博客
Java学习day04:数组(知识点+习题详解)_凌~风的博客-CSDN博客
......
封装是面向对象的思想的特性,主要分为一下四类:
对属性进行封装 对方法进行封装 对类进行封装 对项目进行封装
我们这里就举一个具体讲解:
写一个类,类下面的成员变量String name;
只需要通过对象.属性 = 初始化值;进行赋值。这样存在一定的隐患:比如说有人对age赋值1000,数据不符合常规
这个时候我们就可以对属性进行封装:
1.对成员变量加修饰符 private
2.在类中书写 set和get方法进行对属性的赋值和取值
private修饰符可以把修饰的变量变成私有的,此时就无法再在main方法里通过对象.变量 进行赋值,而只能用set方法赋值,get方法取值,此时就可以在set方法里限制age的值使其符合规范
- class Pig {
- private String name;
- private int age;
-
- //依靠set方法进行赋值了 赋值是没有返回值的
- public void setName (String name) {
- this.name = name;
- }
- //有规律 在赋值的时候 set变量名字 小驼峰的命名规则
- public void setAge (int age) {
- //可以控制变量值的范围 大小
- if (age < 0 || age > 100) {
- this.age = 0;
- } else {
- this.age = age;
- }
-
- }
- //书写get方法
- public String getName() {
- return name;
- }
- public int getAge () {
- return age;
- }
- }
- public class Demo3 {
- public static void main(String[] args) {
- Pig pig = new Pig();
- pig.setName("猪刚鬣");
- pig.setAge(-90);
- System.out.println(pig.getName() + ":" + pig.getAge());
- }
- }
同时记得,除了可以用set方法赋值以外,还可以用有参构造赋值,两个中选一个就行,另外idea中用alt+insert快捷键可以之间创建set和get方法,而且在项目实际开发中,其实都不会写set和get方法,直接就用封装好的
可以看到不管是在无参构造里打印的this还是在main方法里打印的对象,最后都是内存地址,且都是一样的
- class Rabbit {
- String name;
- int age;
-
- public Rabbit(String name, int age) {
- //this();//在调用无参构造
- this.name = name;
- this.age = age;
- }
- public Rabbit() {
- //这个this 就是rabbit1
- System.out.println(this);//代表的当前的对象 打印的是一个内存地址
- }
- }
- public class Demo6 {
- public static void main(String[] args) {
- Rabbit rabbit1 = new Rabbit();
- System.out.println(rabbit1);
-
- /**
- * com.qfedu.b_fengzhuang.Rabbit@15db9742 this
- com.qfedu.b_fengzhuang.Rabbit@15db9742 rabbit1
-
- */
- Rabbit rabbit2 = new Rabbit();
- System.out.println(rabbit2);
-
- /**
- * com.qfedu.b_fengzhuang.Rabbit@6d06d69c this
- com.qfedu.b_fengzhuang.Rabbit@6d06d69c rabbit2
-
- */
- }
- }
this这个关键只能在方法(成员方法和构造方法)中使用。
- class Person {
- String name;
- int age;
-
- //验证第一个 this关键字可以在构造方法中调用成员变量
- public Person () {
- this.eat();
- this.name = "狗蛋";
- }
- //验证第二个 this关键在成员方法中调用成员变量
- public void eat () {
- //在方法中可以使用this.变量
- this.name = "老邢";
- System.out.println(name + "在吃饭");
- this.test();
- }
- public void test () {
- System.out.println("细细打");
- }
-
- }
- public class Demo1 {
- public static void main(String[] args) {
- Person person = new Person ();
- System.out.println(person.name);
- //person.eat();
- }
-
- }
注意执行顺序,在main方法里new的时候,就执行了构造方法,而构造方法里又会执行其他方法,同时后执行的会覆盖前面先执行的,把代码执行逻辑理顺就是,没有什么难的
只能在构造方法中调用构造方法,而且this()只能在构造方法中放在第一行
能不能在成员方法中调用构造方法?不能!!!
- class Dog {
- String name;
- int age;
- public Dog() {
- System.out.println("123");
- //this("styb", 8);
- }
- public Dog(String name, int age) {
- this();
- System.out.println("有参构造");
- }
- }
- public class Demo2 {
- public static void main(String[] args) {
- //需求:实例化对象dog 要求将有参构造这四个字打印出来
- Dog dog = new Dog("goudan", 12);
- //Dog dog = new Dog();
- }
-
- }
此时会先打印123,再换行打印有参构造
可以是八大基本数据类型,String,数组,类对象也是可以的
- class Teacher {
- //command的参数是一个类对象
- public void command (Student stu) {
- stu.coding();
- }
- }
- class Student {
- String name;
- public void coding () {
- System.out.println(name + "敲代码");
- }
- }
- public class Demo1 {
- public static void main(String[] args) {
- Student student = new Student();
- student.name = "骚磊";
- Teacher teacher = new Teacher();
- //在teacher方法中去调用student对象的一个方法
- //最终打印的结果是 student类下面的方法
- teacher.command(student);
- }
-
- }
这段代码的执行逻辑如下:
1. 首先,在`main`方法中创建了一个`Student`对象,并给其`name`属性赋值为"骚磊"。
2. 然后,创建了一个`Teacher`对象。
3. 接下来,调用`Teacher`对象的`command`方法,并将之前创建的`Student`对象作为参数传入。
4. 在`command`方法中,使用参数`stu`来调用`Student`对象的`coding`方法。
5. 在`coding`方法中,使用`System.out.println`打印出`name`属性的值以及"敲代码"。
6. 最终,控制台输出的结果为"骚磊敲代码"。
总结起来,这段代码的主要逻辑是通过`Teacher`类的`command`方法来调用`Student`类的`coding`方法,并在控制台输出结果。通过这种方式,实现了两个类之间的交互和协作。
再给大家举个例子,大家自行理解下面这个
- class Person {
- public void feed (Dog dog) {
- dog.eat();
- }
- }
- class Dog {
- public void eat () {
- System.out.println("狗在吃饭");//牛彩云
- }
- }
- public class Demo2 {
- public static void main(String[] args) {
- Dog dog = new Dog();
- Person person = new Person();
- person.feed(dog);
- }
-
- }
这部分主要是理解,多理解,就是说,把一个类实例化出来的对象,作为一个参数传给了一个方法,这也就意味着,这个方法里可以用对象去调用类相关的属性
一个类对象可以当成另外一个类的成员变量
紧紧围绕者一个点:赋值和取值 只是针对于属性 的
如果大家有点懵逼的,建议先清楚一下几个概念:类、对象、属性、行为、成员变量、局部变量。想清楚了再回头来看这个知识点
- class Person1 {
- private String name;
- private Cat1 cat1;//一个类对象可以作为另外一个类的属性来使用
- //碰到private修饰的属性有set和get的想法
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Cat1 getCat1() {
- return cat1;
- }
- public void setCat1(Cat1 cat1) {
- this.cat1 = cat1;
- }
-
- }
- class Cat1 {
- private String name;
- private char sex;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public char getSex() {
- return sex;
- }
- public void setSex(char sex) {
- this.sex = sex;
- }
-
-
- }
- public class Demo2 {
- public static void main(String[] args) {
- //要对Person1对象的属性进行赋值
- Person1 person1 = new Person1();
- person1.setName("老万");
- Cat1 cat1 = new Cat1();
- cat1.setName("小万");
- cat1.setSex('母');
- person1.setCat1(cat1);
- //取值
- //通过 人取猫的值
- System.out.println(person1.getName());//获取人的名字
- System.out.println(person1.getCat1());//获取猫对象
- System.out.println(person1.getCat1().getName());//获取猫的名字
- System.out.println(person1.getCat1().getSex());
- }
- }
这段代码的执行逻辑如下:
1. 首先,在`main`方法中创建了一个`Person1`对象,并给其`name`属性赋值为"老万"。
2. 然后,创建了一个`Cat1`对象,并给其`name`属性赋值为"小万",`sex`属性赋值为'母'。
3. 接下来,将之前创建的`Cat1`对象作为参数传入`Person1`对象的`setCat1`方法中,将其设置为`Person1`对象的`cat1`属性。
4. 然后,通过`Person1`对象的`getName`方法获取`name`属性的值,并使用`System.out.println`打印出来。
5. 通过`Person1`对象的`getCat1`方法获取`cat1`属性的值,即一个`Cat1`对象,并使用`System.out.println`打印出来。
6.通过`Person1`对象的`getCat1`方法获取`cat1`属性的值,即一个`Cat1`对象,并调用该对象的`getName`方法获取`name`属性的值,并使用`System.out.println`打印出来。
7.最后,通过`Person1`对象的`getCat1`方法获取`cat1`属性的值,即一个`Cat1`对象,并调用该对象的`getSex`方法获取`sex`属性的值,并使用`System.out.println`打印出来。
总结起来,这段代码的主要逻辑是通过`Person1`类的对象来设置和获取其属性的值,其中`cat1`属性是一个`Cat1`类的对象。通过调用对象的方法和访问对象的属性,实现了对属性值的设置和获取,并在控制台输出结果。通过这种方式,实现了类与类之间的关联和交互。
以上就是今天所有的知识点,下面做题:
1.部门类、员工类、部门类下面有员工
2.成年人类、孩子类、玩具类
3.老师类、学生类、老师带了很多学生 把学生存倒数组中 STudent[] stus = new Student[6];
建议初学者都敲一敲,而且是不看我的答案,先自己敲,很多东西看着会,实际自己上手敲的时候往往会出错。另外题解肯定不止一个,我也只是记录其中一种,大家大可寻找更优解,同时我基本没写注释,希望大家还是多自己思考原因。
1.
- //部门类
- class Department {
- private String depId;//部门id
- private String deptName;//部门的名字
- private Employee employee;//部们下面的员工
- public String getDepId() {
- return depId;
- }
- public void setDepId(String depId) {
- this.depId = depId;
- }
- public String getDeptName() {
- return deptName;
- }
- public void setDeptName(String deptName) {
- this.deptName = deptName;
- }
- public Employee getEmployee() {
- return employee;
- }
- public void setEmployee(Employee employee) {
- this.employee = employee;
- }
-
-
- }
- //员工类
- class Employee {
- private String name;//员工的名字
- private int age;//员工的年龄
-
- private char sex;//员工的性别
-
- 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 char getSex() {
- return sex;
- }
-
- public void setSex(char sex) {
- this.sex = sex;
- }
-
-
- }
- public class Demo1 {
- public static void main(String[] args) {
- //创建Employee对象
- Employee employee = new Employee();
- employee.setName("张三");
- employee.setAge(28);
- employee.setSex('男');
- //先创建部门对象
- Department department = new Department();
- //对department对象属性进行赋值
- department.setDepId("0001");
- department.setDeptName("研发部");
- department.setEmployee(employee);
- //以上是在赋值
- //取值
- //想要部门的id
- System.out.println(department.getDepId());
- //想要获取部门的名字
- System.out.println(department.getDeptName());
- //想要获取部门下面的员工对象,会打印的啥? 会打印的是地址!!!
- System.out.println(department.getEmployee());
- //能够获取出来employe对象了。
- //能不能获取emplopyee对象的属性值呢?
-
- System.out.println("员工的名字:" +department.getEmployee().getName());
- System.out.println("员工的年龄:" + department.getEmployee().getAge());
- System.out.println("员工的性别:" + department.getEmployee().getSex());
- }
-
- }
2.
- class Adult {
- private String name;//成年人的名字
- private Child child;//成年人下面的孩子对象
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Child getChild() {
- return child;
- }
- public void setChild(Child child) {
- this.child = child;
- }
-
- }
- class Child {
- private String name;
- private int age;
- private Toy toy;
- 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 Toy getToy() {
- return toy;
- }
- public void setToy(Toy toy) {
- this.toy = toy;
- }
-
- }
- class Toy {
- private String name;//玩具的名字
- private double price;//玩具的价格
- private String kind;//玩具的种类
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public double getPrice() {
- return price;
- }
- public void setPrice(double price) {
- this.price = price;
- }
- public String getKind() {
- return kind;
- }
- public void setKind(String kind) {
- this.kind = kind;
- }
-
- }
- public class Demo3 {
- public static void main(String[] args) {
- Toy toy = new Toy();
- toy.setName("骚奥特曼");
- toy.setPrice(67.8);
- toy.setKind("皮套");
- Child child = new Child();
- child.setName("小骚磊");
- child.setAge(1);
- child.setToy(toy);
- Adult saolei = new Adult();
- saolei.setName("骚磊");
- saolei.setChild(child);
- //以上都是在赋值
- //取值
- //需求
- //通过成年人找到孩子的名字
- //saolei.getChild()获取孩子对象 .getName
- System.out.println(saolei.getChild().getName());//获取孩子的名字
- System.out.println(saolei.getChild().getAge());//获取孩子的年龄
- //通过成年人获取玩具的种类 名字 价格的
- System.out.println(saolei.getChild().getToy().getName());
- System.out.println(saolei.getChild().getToy().getKind());
-
- }
-
- }
3.
- class Teacher {
- private String name;//老师的姓名
- private char sex;
- private int age;
- //老师下面有很多的学生 Student[] stus = new Student[3];
- private Student[] student;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public char getSex() {
- return sex;
- }
- public void setSex(char sex) {
- this.sex = sex;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public Student[] getStudent() {
- return student;
- }
- public void setStudent(Student[] student) {
- this.student = student;
- }
-
-
- }
- class Student {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- }
- public class Demo2 {
- public static void main(String[] args) {
- Student[] stus = new Student[2];//现在数组是一个空的
- //对数组进行赋值
- Student student = new Student();
- student.setName("骚磊");
- Student student2 = new Student();
- student2.setName("老万");
- stus[0] = student;
- stus[1] = student2;
- //脑海里面 想到stus是一个容器 数组, 里面已经放了两个值了
- //两个对象
-
- Teacher teacher = new Teacher();
- teacher.setName("老邢");
- teacher.setAge(89);
- teacher.setSex('女');
- //现在setStudent的参数是一个数组
- //stus里面有值了 两个对象student
- teacher.setStudent(stus);
-
- //以上都是在赋值
- //取值
- Student[] students = teacher.getStudent();
- for (int i = 0; i < students.length; i++) {
- System.out.println(students[i].getName());
- }
-
- }
-
- }
最后再给大家一个题,大家可以尝试做做
4.
需求:
两个宠物一个狗一个猫宠物饿了,需要主人给宠物喂食
1.不同的宠物吃的不同
2.不同的宠物吃完食体力值增加
3.主人和狗玩游戏 接飞盘的游戏。狗体力值减去10,但是会和主人的亲密度提升5
4.主人和猫玩游戏 滚毛球。猫体力值减去12 ,但是会和主人的亲密度提升7
人类
猫类
以上,就是今天的所有知识点了。今天的知识点要稍微难一点,确实没那么好理解。我当时懂了,也能敲出作业,但是一个国庆没看,现在还不是就又忘记了,今天写这篇文章的时候都比之前速度慢很多,就是没有理解透彻的原因。
所以大家一定多看多敲多熟悉。
加油吧,预祝大家变得更强!