面向对象 - 内存分析、封装、继承
深入认识面向对象
狂神说Java BV12J41137hu
创建对象内存分析
在主函数中,main() 也是方法中的一个,因此 main() 存在于堆中的方法区(存放类和静态方法static的地方),main() 方法中的常量也是存在于这里的。
执行过程分析
在栈的执行过程中,由于需要执行
main() - > Pet dog = new Pet()
- > dog.shout()
-> dog.name = "xxxx"
-
new 可以视为由栈 引用变量名deg,并在堆中初始化一个Pet对象,并对其参数赋初始值
-
dog.shout() 视为堆中的 dog对象,调用其模板Pet 类中的静态方法 shout()
-
dog.name 及之后的对象赋值,可以理解为 main() 方法区中的常量池赋值给 dog对象,都是在堆中完成的
-
堆的方法区中有一块叫做“静态方法区”,也即包含
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
好处
-
保护数据:可以通过封装的方法避免写入了不合法的值,进而防止破坏系统。
-
隐藏代码的实现细节
-
统一接口,都是 get/ set
-
增加系统的可维护性
方法的重载
其实就是方法的传递参数列表: 数量、类型 变化了
继承
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()等等