浅拷贝
arr = arr1 是将arr1指向堆中的地址
数组排序
Arrays.sort(arr)方法用来给数组排序
第四章 类与对象
类的个体 = 类的实例 =类的对象
person x1 =new person()可以理解为照着图纸创造一个个体
这一部分是在磁盘中实现的,JDK进行编译,JRE将.class文件里的内容翻译成c或汇编,进入方法区(内存中)
加static的都是可以通过类.定位到的
原因:如果我们想操作一个资源的话这个资源一定是存在的,静态的方法或变量会在方法区为自己申请一个内存
栈里存着很多的小栈
在内存中的实现即为
x3 “=”的是x1堆中的地址
基本类型存储左右两侧是存在一起的,等号左侧叫句柄,值伴随句柄存在
引用类型的句柄和值是肯定的不在一起的因为引用类型的存储空间是无法预估的。
上半部分放在这一块的不算占内存,算是设计
change 方法中的地址交换 与 main中的无关
方法的调用还是压栈
引用类型传参传的是堆中的地址 ,不影响原来对象所指向的堆得地址
如果想改变其他方法里的值,需要对堆中数据进行操作
更改器,访问器保障线程安全
public 修饰的变量能被所有类直接访问和更改,一个线程更改了public修饰的变量会影响到其他线程,破坏线程危险
private 修饰的变量只能用访问器访问,一般的访问器的实现方式
用一个新的字符串变量arr2去接受arr,这样不会改变原arr中的数据,当线程执行getArr()方法时,堆中出现arr2,当方法执行完后getArr()方法出栈,堆中的arr被销毁,所以不会影响到原数组,不会造成线程安全。
控制可读写
raiseSalary 方法有两个参数。 第一个参数称为隐式 ( implicit ) 参数, 是出现在方法名前的
Employee 类对象。第二个参数位于方法名后面括号中的数值,这是一个显式 ( explicit) 参
数 ( 有些人把隐式参数称为方法调用的目标或接收者。
)
this 代表这个方法所属的对象
需要获得或设置实例域的值。因此,应该提供下面三项内容:
一个私有的数据域;
一个公有的域访问器方法;
一个公有的域更改器方法
final面试点
被final进行修饰的变量只能进行一次赋值
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
final防止指令重排序,保证多线程下的线程安全
evaluations 不会再指示其他stringbuilder类对象,但他里边的属性是可以变得
按值调用 (call by value) 表示方法接收的是调用者提供的值。而按引用调用 ( call by reference)
表示方法接收的是调用者提供的变量地址。
Java 程序设计语言总是采用按值调用。也就是说, 方法得到的是所有参数值的一个拷
贝,特别是,方法不能修改传递给它的任何参数变量的内容。
对象引用是按值传递的。
下面总结一下 Java 中方法参数的使用情况:
•一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
•一个方法可以改变一个对象参数的状态。
•一个方法不能让对象参数引用一个新的对象
引用类型:堆中的地址是值
基本类型=右边的值就是值
栈中地址是引用
重载
方法名字可以一样但参数不一样.
方法名一样,但返回类型不一样不算重载
在方法里声明的变量没有默认值
域: 属性
显示域初始化
通过重载类的构造器方法,可以采用多种形式设置类的实例域的初始状态。确保不管怎
样调用构造器,每个实例域都可以被设置为一个有意义的初值,这是一种很好的设计习惯。
隐式调用
调用其他构造方法,写在第一行
初始化块
在new过程中可以称为初始化一个实例,是对对象的初始化
初始化块谁在上边谁先执行
public class Person { public Person(){ System.out.println("构造方法"); } { System.out.println("块1"); } { System.out.println("块2"); } }
输出:
块1
块2
构造方法
面试点
对象的初始化顺序: 静态初始化块 初始化块 构造方法
静态的优先级最高
存在没有先后顺序,但初始化有先后顺序
private int age; private int height; public Person(){ System.out.println("构造方法"); } static{ System.out.println("静态块1"); } { System.out.println(height); System.out.println("块1"); }
这样不会报错
{ System.out.println(height); System.out.println("块1"); } private int height;
这样会保存
非静态块里可以用静态属性,但静态块里不能使用非静态属性
因为静态块在进入内存时就有地址,而非静态属性需要在new之后才能在内存中存在
静态的只初始化一次,因为静态的属于类
public class Person { private int age; public Person(String cc){ System.out.println("构造方法"+cc); } static{ System.out.println("静态块1"); } static{ System.out.println("静态块2"); } static Person xx= new Person("2"); { System.out.println("块1"); } { System.out.println("块2"); } }
静态块1
静态块2
块1
块2
构造方法2
块1
块2
构造方法1
person1进入先执行静态初始化块 然后执行静态构造方法xx,xx因为静态只能执行一次所以只执行初始化
栈(stack):存放基本类型的变量数据和对象的引用,栈描述的是方法执行的内存模型,JVM为每个线程创建一个栈,用于存放线程执行方法的基本信息,栈的存储特性为“先进后出、后进先出”,大家可以理解为一个形象化的弹夹。栈由系统自动分配,速度块,是一块连续的空间。
堆(heap):存储的全部是对象(包括数组等),每个对象都包含一个与之对应的class的信息。JVM只有一个堆,被所有线程所共享,堆是一个不连续的内存空间,分类灵活,但速度较慢。
方法区(method area):又叫静态区,跟堆一样,JVM只有一个方法区,被所有线程所共享。方法区包含所有的类信息和静态变量、静态常量以及字符串常量。