⚾️ 封装

面向对象三大特征之一

什么是封装

封装是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式


怎么隐藏对象的属性

想要隐藏对象的属性,只需要在定义属性的前面加上一个关键字private即可

怎么提供公共的访问方式?

就是在类中写上几个setXXX()和getXXX()即可

🤽‍♀️ private关键字

private关键字是一个修饰符,代表私有的意思,可以修饰成员变量和成员方法和构造方法,提供安全性

private关键字的特点?
被private修饰的成员变量和成员方法只能在本类中使用,不能在其他类中使用

加上private关键字之后的标准代码该如何写?

  1. class Person {
  2. private String name; //加private起到封装的作用
  3. private int age;
  4. private String sex;
  5. public void setName(String n) {
  6. name = n;
  7. }
  8. public void setAge(int a) //变量名不够见命知义
  9. age = a;
  10. }
  11. public void setSex(String s) {
  12. sex = s;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public String getSex() {
  21. return sex;
  22. }
  23. }

🏆 this关键字

this代表对象的引用,哪个对象调用this所在的方法,this就代表哪个对象

this.name=对象名.name

this关键字有什么用?

  1. 它可以解决局部变量隐藏成员变量的问题
  2. 可以调用本类中的成员变量和成员方法和构造方法

加上this关键字之后的标准代码如何写呢?

  1. class Person {
  2. private String name;
  3. private int age;
  4. private String sex;
  5. public void setName(String name) {
  6. this.name = name;
  7. }
  8. public void setAge(int aage) {
  9. this.age = aget;
  10. }
  11. public void setSex(String sex) {
  12. this.sex = sex;
  13. }
  14. public String getName() {
  15. return this.name; //因为只有一个name,所有可以省略this不写
  16. }
  17. public int getAge() {
  18. return this.age;
  19. }
  20. public String getSex() {
  21. return this.sex;
  22. }
  23. }

image.png

🎻 构造方法

方法名和类名相同,和普通方法的格式不一样的特殊的方法

构造方法的定义格式

  1. 修饰符 类名(形参,...) {
  2. 执行语句;
  3. }
  4. public Person() {
  5. }

构造方法的作用

  1. 用来创建对象 ```java public class Demo2 { public static void main(String[] args) {
    1. Dog dog = new Dog(); //调用Dog()方法创建对象
    } }

class Dog { public Dog() { } public Dog(int a, int b) { } }

  1. 2. 用来对象的属性进行初始化
  2. <a name="pNu5I"></a>
  3. ## 构造方法的特点
  4. 1. 构造方法没有返回值类型
  5. 1. 构造方法没有返回值
  6. 可不可以有return关键字?<br />可以有renturn,但一般不写
  7. 3. 构造方法的名字一定要和类名相同
  8. 普通方法的名字可不可以和类名相同?<br /> 可以的
  9. <a name="yspwO"></a>
  10. ## 构造方法的注意事项
  11. 1. 如果我们没有手动写构造方法的话,系统会默认带一个无参构造。如果我们手动写了构造方法的话,系统默认带的无参构造就消失了
  12. 2. 构造方法也是方法,既然是方法,就会满足方法的重载,也就说一个类中可以写多个构造方法
  13. ```java
  14. class Person {
  15. public Person() {
  16. }
  17. public Person(String name) {
  18. }
  19. public Person(i nt age) {
  20. }
  21. public Person(String name,int age) {
  22. }
  23. }

一个类中写多个构造方法的作用

  1. 可以根据不同的需求来调用不同的构造方法 ```java class Child { String name; int age;

    public Child() {}

    public Child(String name) {

    1. this.name = name;

    }

    public Child(int age) {

    1. this.age = age;

    }

    public Child(String name, int age) {

    1. this.name = name;
    2. this.age = age;

    } }

class Demo { public static void main(String[] args) { //需求:孩子出生时候,没有姓名没有年龄 Child c1 = new Child(); System.out.println(c1.name + “…” + c1.age);//null…0

  1. //需求:孩子出生时候,有姓名,但是没年龄
  2. Child c2 = new Child("张三");
  3. System.out.println(c2.name + "..." + c2.age);//张三...0
  4. //需求:孩子出生时候,有姓名,有年龄
  5. Child c3 = new Child("哪吒", 18);
  6. System.out.println(c3.name + "..." + c3.age);//哪吒...18
  7. }

}

  1. 2. 有参的构造方法可以给属性赋值
  2. ```java
  3. class Person {
  4. private String name;
  5. private int age;
  6. public Person() {
  7. }
  8. public Person(String name, int age) {
  9. this.name = name;
  10. this.age = age;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public String getName() {
  16. return this.name;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. public int getAge() {
  22. return this.age;
  23. }
  24. }
  25. class Demo {
  26. public static void main(String[] args) {
  27. /*
  28. Person p = new Person();
  29. p.setName("tom");
  30. p.setAge(18);
  31. */
  32. Person p = new Person("tom", 18);
  33. }
  34. }

通过有参构造给属性赋值和通过setXXX给属性的区别

  1. setXXX方式赋值可以使用N多次

有参构造方式赋值只能使用一次

  1. 有参构造方式是先天的

setXXX方式是后天的

加上构造方法之后的标准代码怎么写?

  1. class Person {
  2. private String name;
  3. private int age;
  4. public Person() {}
  5. public Person(String name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. //其他方法
  22. public void eat() {
  23. System.out.println("吃饭");
  24. }
  25. }

在我们创建对象的时候,内存中做了哪些事情

  1. class Person {
  2. String name = "tom";
  3. int age = 18;
  4. public Person() {
  5. name = "jerry";
  6. age = 19;
  7. }
  8. }
  9. class Demo {
  10. public static void main(String[] args) {
  11. Person p = new Person();
  12. System.out.println(p.name + "..." + p.age);
  13. }
  14. }

image.png

  1. 默认初始化
  2. 显示初始化
  3. 构造方法初始化

五子棋

JavaFX
画棋盘

有舞台(Stage)
舞台上有场景(Scene)
场景中有画板(Pane)
五子棋盘画在画板中

  1. package com_2;
  2. import javafx.application.Application;
  3. import javafx.scene.Scene;
  4. import javafx.scene.layout.Pane;
  5. import javafx.scene.shape.Line;
  6. import javafx.stage.Stage;
  7. public class MyApplication extends Application {
  8. @Override
  9. public void start(Stage stage) throws Exception {
  10. //创建画板对象
  11. Pane pane = new Pane();
  12. //创建线条对象
  13. Line line = new Line(50, 50, 50, 550);
  14. Line line1 = new Line(50, 50, 550, 50);
  15. //将线条放到画板上
  16. /*
  17. pane.getChildren():获取到一个容器
  18. .add(line):将线条放到容器中
  19. */
  20. pane.getChildren().add(line);
  21. pane.getChildren().add(line1);
  22. //创建场景对象,并且将画板放到场景中
  23. Scene scene = new Scene(pane, 600, 600);
  24. //将场景放到舞台上
  25. stage.setScene(scene);
  26. //展示大舞台
  27. stage.show();
  28. }
  29. //程序执行的入口
  30. public static void main(String[] args) {
  31. launch(args);
  32. }
  33. }
  34. /*
  35. class Scene {
  36. public Scene(A) {
  37. }
  38. public Scene(A,B,C) {
  39. }
  40. }
  41. class Stage {
  42. public void show() {
  43. }
  44. }*/

🥅 static关键字

它是一个修饰符,代表静态的意思,它可以修饰成员变量和成员方法,不能修饰构造方法,

static关键字的特点

  1. 被static所修饰的成员是随着字节码文件对象的加载而加载,所以是优先于对象存在于内存中
  2. 被static所修饰的成员被该类下所有的对象所共享

image.png

  1. 被static所修饰的成员可以通过类名.直接调用
    1. 类名.属性名;
    2. 类名.方法名();

static关键字的注意事项

  1. 静态方法中不能有this关键字
  2. 静态方法中可以调用静态成员变量和静态成员方法,但是不可以调用非静态的成员变量和调用方法

非静态方法中可以调用静态的成员变量和成员方法,也可以调用非静态的成员变量和成员方法

  1. class Pig {
  2. String name:
  3. static int age;
  4. public static void eat() {
  5. drink();
  6. sleep(); //编译报错,非静态方法
  7. System.out.printin(age);
  8. System.out.printin(name);//编译报错,非静态属性
  9. }
  10. public static void drink() {
  11. }
  12. bublic void sleep() {
  13. }
  14. }