第7节:面向对象进阶

记录现阶段,觉得有用的知识点

封装

用 权限修饰符 来控制访问权限。

推荐用 private 权限修饰符控制(只有自己本类才可以操作),自己最了解, 不让类以外的东西来操作他们。

权限修饰符

子类 不同包
public
protected
default
private

this 关键字

代表对象。

在构造函数里面,如果要用 this( …… ) 来调用其他构造函数,这个语句必须放在 第1行。

static 关键字

  • static 可以修饰 成员变量、方法、代码块、内部类。

  • 当类被加载到内存时,static修饰的静态变量就存储到了 方法区中。

  • 可以把 static 的变量或方法,看成是类的变量或方法。

    所有对象共用的。只要类被加载了,static就存在了(public static void main( ){ })。

    推荐用 类名来访问 static 的方法,用对象名来访问 非static 的方法。

  • 可能有种情况:当用 static 方法时,还没有创建出来对象。

    所以在 静态方法中,不能调用 非静态的方法(需要用对象来访问的方法)。

  • java中包的概念,就像我们平常接触的 文件夹 的概念。

    代表着一个路径,这个路径 必须能从 CLASSPATH 开始搜索并发现。

    可以解决命名冲突问题。

  • 一个 .java 文件,第一就用 package 关键字,声明了该文件夹所在的包。

    使用 import 关键字导入其他的包。

  • 同包下面的类(同文件夹下面的文件),是同一级的,可以直接拿来用。

    java.lang 这个包下面的类 也可以直接拿来用。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADPb537c-1588056319157)(C:\Users\ADMINI~1\AppData\Local\Temp\1588047814596.png)]

代码块

  • 代码块的类型: 普通的代码块、构造的代码块、静态的代码块。
    同步代码块(之后多线程时再来学习)

  • 在 创建(new)一个对象的时候,代码块 和 构造函数的执行顺序:

    静态代码块 —> 构造代码块 —> 构造函数

    ​ 如果在 类 里,有计数的需求,就可以用 构造代码块,而不用在每个构造函数里都写些相同的语句。。。

/** * 代码块 */
public class PersonDemo3 {
   
    public static void main(String[] args) {
   
        Person3 person3 = new Person3();
       	System.out.println("===================================");

        {
   
            System.out.println("普通的代码块,在执行流程中出现的代码块。。。。");
        }

        Person3 person = new Person3();
    }
}

class Person3{
   
    private String name;
    private String age;

    {
   
        System.out.println("放在构造函数前的 构造代码块。。。");
        System.out.println("构造的代码块: 相当于类中的一个成员,不是在 “执行流程中的”。。。。");
    }

    public Person3() {
   
        System.out.println("构造函数执行体。。。。");
    }

    static {
   
        System.out.println("静态的代码块,用 static 修饰的代码块。。。。");
        System.out.println("随着类被加载时执行,因为是静态 static,只执行一次。");
    }

    {
   
        System.out.println("放在构造函数后的 构造代码块。。。");
        System.out.println("构造的代码块: 相当于类中的一个成员,不是在 “执行流程中的”。。。。");

    }
}

编译之后:

Person3.class 内容:

class Person3 {
   
    private String name;
    private String age;

    public Person3() {
   
        System.out.println("放在构造函数前的 构造代码块。。。");
        System.out.println("构造的代码块: 相当于类中的一个成员,不是在 “执行流程中的”。。。。");
        System.out.println("放在构造函数后的 构造代码块。。。");
        System.out.println("构造的代码块: 相当于类中的一个成员,不是在 “执行流程中的”。。。。");
        System.out.println("构造函数执行体。。。。");
    }

    static {
   
        System.out.println("静态的代码块,用 static 修饰的代码块。。。。");
        System.out.println("随着类被加载时执行,因为是静态 static,只执行一次。");
    }
}

PersonDemo3.class 内容:

public class PersonDemo3 {
   
    public PersonDemo3() {
   
    }

    public static void main(String[] args) {
   
        new Person3();
        System.out.println("===================================");
        
        System.out.println("普通的代码块,在执行流程中出现的代码块。。。。");
        new Person3();
    }
}

运行截图:

win10 显示桌面的快捷键: win+d。

有时候 窗口打开的太多了,想直接就回到桌面上。。。