类和对象
类:类规定了对象拥有的特征和行为.
对象:对象是具有属性和特征的实体.
单一职责原则
如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。
之所以会出现单一职责原则就是因为在软件设计时会出现以下类似场景:T负责两个不同的职责:职责 P1,职责 P2。当由于职责 P1 需求发生改变而需要修改类 T 时,有可能会导致原本运行正常的职责P2 功能发生故障。也就是说职责 P1 和 P2被耦合在了一起。
解决办法:遵守单一职责原则,将不同的职责封装到不同的类或模块中。分别建立两个类 T1、T2,使 T1 完成职责 P1 功能,T2 完成职责 P2 功能。这样,当修改类 T1 时,不会使职责 P2 发生故障风险;同理,当修改 T2 时,也不会使职责 P1 发生故障风险。
Java内存管理之堆和栈
栈:每个方法(Method)在执行时,都会创建一个栈帧,用于存储局部变量表、操作数、动态链接、方法出口信息等。
需要注意,栈中所存储,多用于保存局部信息的值,譬如:方法体中的基本数据类型定义的变量、对象的引用(也称为对象实例)等。当局部作用范围结束时,栈内信息立即自动释放。
当存储内容是由基本数据类型(byte、short、int、long、float、double、char、boolean)声明的局部变量时,在栈中存储的是它们对应的具体数值。
当存储的是局部的对象的引用(定义在方法体中的引用类型的变量),存储的是具体对象在堆中的地址。当然,如果对象的引用没有指向具体的空间,则是null。
堆:用来存放动态产生的数据,比如new出来的对象。当对象使用结束,并确定已无实例引用指向堆空间时,JVM才会依据相关垃圾回收机制进行资源回收,完成堆内资源释放,也就是说,并不是方法结束,方法内涉及到的堆空间就会立即释放,这也是与栈管理不同的地方。
此时,需要注意,创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类拥有各自的成员变量,存储在堆中的不同位置,但是同一个类不同实例的之间共享该类的方法,并不是每创建一个对象就把成员方法复制一次。
示例:
1 public classCat {2
3 String name;//昵称
4 int month;//年龄5
6 //方法
7 public void run(double weight){//跑动
8 System.out.println("小猫已经"+weight+",快去跑步");9 }10 }
1 public classCatTest {2
3 public static voidmain(String[] args) {4 //对象实例化
5 Cat one = newCat();6 double wh = 200;7 one.run(wh);8 }9 }
执行流程:
JVM自动寻找main方法,执行第一句代码,创建一个Cat类的实例one,在栈中分配一块内存,存放一个指向堆区对象的地址譬如0x111111。(如图1)
创建一个double型的变量wh,由于是基础数据类型,直接在栈中存放double对应的值200。 (如图1)
当调用one对象的run方法,并以wh为参数传入方法时,JVM检测到方法参数weight,作为方法局部变量,也会放入栈中并将wh的值200复制给weight。(如图2)
当完成run方法调用后,立即释放局部变量weight所占用的栈空间。 (如图3)
main方法运行结束,立即释放栈中one,wh的空间,而堆中对象空间,则会当确定无引用指向后,由垃圾回收机制进行回收,不会立即释放资源。(如图4)
(图1)
(图2)
(图3)
(图4)