1.类和对象
类:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。
对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)。
面向对象完成具体功能的操作的三步流程(非常重要)
步骤1:创建类,并设计类的内部成员(属性、方法)
步骤2:创建类的对象。比如:Phone p1 = new Phone();
步骤3:通过对象,调用其内部声明的属性或方法,完成相关的功能
2.对象内存解析
举例:
class Person { //类:人
String name;
int age;
boolean isMale;
}
public class PersonTest { //测试类
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "赵同学";
p1.age = 20;
p1.isMale = true;
Person p2 = new Person();
p2.age = 10;
Person p3 = p1;
p3.name = "郭同学";
}
}
内存解析图:
堆:凡是new出来的结构(对象、数组)都放在堆空间中。
对象的属性存放在堆空间中。
对象名中存储的是什么呢?
答:对象地址
3.成员变量和局部变量在内存中存储的位置不同
(1)实例变量:堆 (2)局部变量:栈。p1,p2,p3都是。
4.方法调用内存分析
方法没有被调用的时候,都在方法区中的字节码文件(.class)中存储。
方法被调用的时候,需要进入到栈内存中运行。方法每调用一次就会在栈中有一个入栈动作,即给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值。
当方法执行结束后,会释放该内存,称为出栈,如果方法有返回值,就会把结果返回调用处,如果没有返回值,就直接结束,回到调用处继续执行下一条指令。
栈结构:先进后出,后进先出。
public static void main(String[] args) {
Person p1 = new Person();
p1.name = “杰克";
p1.age = 24;
p1.gender = '男';
p1.eat();
p1.sleep(6);
p1.interests("编程");
}
5. 对象数组(难)
数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用类型中的类时,我们称为对象数组。
对象数组内存解析
6.可变参数方法
当定义一个方法时,形参的类型可以确定,但是形参的个数不确定,那么可以考虑使用可变个数的形参。
1.可变参数方法的使用与方法参数部分使用数组是一致的,二者不能同时声明,否则报错。
比如 public void print(int ... nums)和 public void print(int[ ] nums)
2.方法的参数部分有可变形参,需要放在形参声明的最后
public void print(int i ,int ... nums) ,两个参数不能交换位置。
3.在一个方法的形参中,最多只能声明一个可变个数的形参
7.参数传递机制:值传递
Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
8.权限修饰符:public、protected、缺省、private。具体访问范围如下:
修饰符 | 本类内部 | 本包内 | 其他包的子类 | 其他包非子类 |
private | √ | × | × | × |
缺省 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
9.什么叫封装性?
Java规定了4种权限修饰符,分别是:private、缺省、protected、public。我们可以使用4种权限修饰符来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小。
举例:
> 场景1:私有化(private)类的属性,提供公共(public)的get和set方法,对此属性进行获取或修改
> 场景2:将类中不需要对外暴露的方法,设置为private
> 场景3:单例模式中构造器private的了,避免在类的外部创建实例。
理论:程序设计的原则之一
理论上:
-`高内聚`:类的内部数据操作细节自己完成,不允许外部干涉;
(Java程序通常以类的形态呈现,相关的功能封装到方法中。)
-`低耦合`:仅暴露少量的方法给外部使用,尽量方便外部调用。
(给相关的类、方法设置权限,把该隐藏的隐藏起来,该暴露的暴露出去)
10.在类的属性中,可以有哪些位置给属性赋值?
① 默认初始化
② 显式初始化
③ 构造器中初始化
④ 通过"对象.属性"或"对象.方法"的方式,给属性赋值
顺序:① - ② - ③ - ④
上述中的①、②、③在对象创建过程中,只执行一次。
④ 是在对象创建后执行的,可以根据需求多次执行。
11.JavaBean
JavaBean是一种Java语言写成的可重用组件。
所谓JavaBean,是指符合如下标准的Java类:
-
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、set方法
12.Java 的引用类型有哪几种?
类、数组、接口;枚举、注解、记录
13.Java中内存结构的划分
-
Java中内存结构划分为:
虚拟机栈、堆、方法区
;程序计数器、本地方法栈-
虚拟机栈:以栈帧为基本单位,有入栈和出栈操作;每个栈帧入栈操作对应一个方法的执行;方法内的局部变量会存储在栈帧中。
-
堆空间:new 出来的结构(数组、对象):① 数组,数组的元素在堆中 ② 对象的成员变量在堆中。
-
方法区:加载的类的模板结构。
-
14.对象存在Java内存的哪块区域里面?
堆空间
15.构造方法和普通方法的区别
编写代码的角度:没有共同点。声明格式、作用都不同。
字节码文件的角度:构造器会以<init>()方法
的形态呈现,用以初始化对象。
16.无参构造器和有参构造器的的作用和应用
用来初始化Java类,提供类的初始化和实例化,以便调用
17.成员变量与局部变量的区别
属性 vs 局部变量
-
声明的位置
-
内存中存放的位置
-
作用域
-
权限修饰符
-
初始化值
-
生命周期
-
-
-
-
-
属性 <=> 成员变量 <=>field <=> 字段、域