面向对象 - 内存分析、封装、继承

深入认识面向对象

狂神说Java BV12J41137hu

创建对象内存分析

在主函数中,main() 也是方法中的一个,因此 main() 存在于堆中的方法区(存放类和静态方法static的地方),main() 方法中的常量也是存在于这里的。

执行过程分析

在栈的执行过程中,由于需要执行

main() - > Pet dog = new Pet() - > dog.shout() -> dog.name = "xxxx"

  1. new 可以视为由栈 引用变量名deg,并在堆中初始化一个Pet对象,并对其参数赋初始值

  2. dog.shout() 视为堆中的 dog对象,调用其模板Pet 类中的静态方法 shout()

  3. dog.name 及之后的对象赋值,可以理解为 main() 方法区中的常量池赋值给 dog对象,都是在堆中完成的

  4. 堆的方法区中有一块叫做“静态方法区”,也即包含static 修饰前缀的方法,静态方法是和类一起加载的 —— 无论是哪个对象都可以调用静态方法

代码块

Pet.java

package oop.app.ram;

public class Pet {
    String name;
    int age;

    public Pet() {
    }

    public void shout() {
        System.out.println("叫了一声");
    }
}

Application.java

package oop.app.ram;

public class Application {
    public static void main(String[] args) {
        Pet dog = new Pet();
        dog.name = "旺财";
        dog.age = 3;
        dog.shout();

        System.out.println(dog.name);
        System.out.println(dog.age);
        //叫了一声
        //旺财
        //3
    }
}

封装

程序设计追求“高内聚低耦合”, 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合,仅暴露少量的方法给外部使用。

分装(数据的隐藏),通常应禁止直接访问一个对象中数据的实际标识(啰嗦了,不让直接访问对象数据),而应通过接口来访问。

一句话概括: 属性私有,get/set

好处

  1. 保护数据:可以通过封装的方法避免写入了不合法的值,进而防止破坏系统。

  2. 隐藏代码的实现细节

  3. 统一接口,都是 get/ set

  4. 增加系统的可维护性

方法的重载

其实就是方法的传递参数列表: 数量、类型 变化了

继承

extends,子类是父类的拓展

好处

  • 提高代码的复用性
  • 让类与类之间产生了关系,是多态的前提

通常意义上的继承

父类

package oop.app.extendsdemo;

public class Person {
}

子类继承

package oop.app.extendsdemo;

public class Student extends Person{
}

组合

把类当成自己的一个属性(这里还不知道有啥用)

package oop.app.extendsdemo;

public class Teacher{
    Person person;
}

特点

能够拿到父类的所有方法(记得是 public 和 protected)

能够拿到父类的所有变量,一般叫做类的属性(猜测是方法外的 类变量 和 实例变量)

Person.java

package oop.app.extendsdemo;

public class Person {
    private int money = 100;
    protected int age;

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Student.java

package oop.app.extendsdemo;

public class Student extends Person{
}

Application.java

package oop.app.extendsdemo;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.setMoney(50);
        System.out.println("money:" + student.getMoney());// money:50
        student.setAge(3);
        System.out.println("age:" + student.getAge());// age:3

    }
}

IDEA快捷键

将光标定位到 Person.java文件中,能够看到Person类上有个蓝色圆环↓的图标,显示被 Student继承

Person.java文件中使用快捷键Ctrl + H,打开Person视角的继承树

可以看到上图中,最上方 是 Object(java.lang)

java中,所有的类都默认直接或者间接继承 Object 类,也就是自己写的类都会有默认的方法 getClass()、hashCode()等等

posted @ 2021-12-14 20:07  jentreywang  阅读(92)  评论(0)    收藏  举报