声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)
封装是面向对象的思想的特性,主要分为一下四类:
对属性进行封装 对方法进行封装 对类进行封装 对项目进行封装
我们这里就举一个具体讲解:
写一个类,类下面的成员变量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
人类
猫类
以上,就是今天的所有知识点了。今天的知识点要稍微难一点,确实没那么好理解。我当时懂了,也能敲出作业,但是一个国庆没看,现在还不是就又忘记了,今天写这篇文章的时候都比之前速度慢很多,就是没有理解透彻的原因。
所以大家一定多看多敲多熟悉。