一 面向对象(上二)
1 类和对象的理解与关系
- 类是对一类事物的描述,是抽象概念的定义 = 抽象概念的人
- 对象是实际存在的该类事物的每个个体 = 实实在在的人
1.1 两者关系
对象是对类的实例化(new),由类派生出来的。
更模糊的讲,就是对图纸(类)的实现(实例化)
如:车的图纸造出宝马奔驰。
🐱 和🐕。
模糊的人概念,比如“人”这个字 与 实际的一个有名字的 人,比如你的同学朋友。
高级通俗点来讲,我们跟控制台去交互,需要先造一个类,API给我们提供好了,叫XXX类,我们真正去实行的时候,我们需要创建XXX类的对象,通过这个对象去操作他的功能方法,去完成我们跟控制台的交互
个人认为与C语言的结构体有点类似的,无非是C编译的时候就会分配内存空间,而Java里面多了一个new关键词用来申明分配内存空间。C的时候要实现什么功能都需要自己写,而Java好像就是把常用的都已经封装好了,无需再去写一些小的功能函数,可以直接调用。
2 JVM内存结构
源代码编译完之后,生成一个或多个字节码元件
JVM中的类加载器和解释器对字节码元件进行解释运行。
JVM 中的栈包括 虚拟机栈和本地方法栈
-
虚拟机栈为 JVM 执行 Java 方法服务
-
本地方法栈为 JVM 使用到的 Native 方法服务
Native 方法是什么?
JDK 中有很多方法是使用 Native 修饰的。Native 方法不是以 Java 语言实现的,而是以本地语言实现的(比如 C 或 C++)。
-
虚拟机栈是我们平时所说的栈。存储了局部变量表、操作数栈、动态连接和方法出口等信息。局部变量表中存储了基本数据类型(boolean、byte、char、short、int、float、long、double)的局部变量(包括参数)、和对象的引用(String、数组、对象等),但是不存储对象的内容。
-
堆存储了使用new关键字创建的对象(其中对象的属性应是非static修饰的)
-
方法区存储已被虚拟机加载的类信息、常量(常量池)、静态变量(静态域)、即时编译器编译后的代码。更具体的说,静态变量+常量+类信息(版本、方法、字段等)+运行时常量池存在方法区中。
3 内存解析的说明
-
引用类型的变量,只可能存储两类值:null 或 地址值(含变类型)
Phone p = new Phone(); System.out.println(p);//com.miaojie.java.Phone@15db9742
-
对象数组的内存解析
4 回顾 变量分类
4.1 按照数据类型
4.2 按照类中声明位置
5 匿名对象
5.1 概念
我们创建的对象,没有显式的赋给一个变量名,即匿名对象
5.2 特征
匿名对象只能调用一次
5.3 使用
mall.show(new Phone());
class TestDemo{
public static void main(String[] args){
Phone p = new Phone();
//匿名对象的使用
PhoneMall mall = new PhoneMall();
mall.show(new Phone());//!!!
}
}
class PhoneMall{
public void show(Phone phone){
phone.sendEmail();
phone.playGame();
}
}
class TestDemo{
public static void main(String[] args){
//有名对象
Phone p = new Phone();
p.sendEmail();
p.playGame();//同一个对象
//匿名对象
//1.
new Phone().sendEmail();
new Phone