Java内存图解、Private私有化
内存图解
虚拟机中的内存区域划分:所谓的内存区域划分也只是程序界给出的一种虚拟的概念
-
栈 程序运行的区域,效率最高,方法的调用执行,基本数据类型定义(局部变量)
-
堆 用于存储引用数据类型的区域
-
方法区 所有类的方法都在方法区
-
计数器 当前线程所执行的字节码的行号指示器
-
本地方法区 执行native修饰的方法
public class Test{
public static void main(String[] args){
User user1 = new User();
user1.setName("张飞");
user1.setAge(12);
User user2 = new User();
user2.setName("赵云");
user2.setAge(13);
String name1 = user1.getName();
int age2 = user2.getAge();
System.out.println(name1+"--"+age2);
}
}
class User{
public String name;
public Int age;
public void setName(String newName){
name = newName;
}
public String getName(){
return name;
}
public void setAge(int newAge){
age = newAge;
}
public int getAge(){
return age;
}
}
private私有化
调用者:通常说的是其它类(除了本身之外的类)
限制方案:缩小属性的可见范围,只能在本类中可见,其他类中不可见
思问题考:非静态的属性和方法只能通过对象进行调用,然后呢,通过对象去调用方法给属性进行赋值是赋值的一种方法,发现也可以通过对象直接调用属性来进行赋值操作,因此,就考虑两者之间有什么区别?
public class PrivateDemo{
public static void main(String[] args){
User user = new User();
System.out.println(user.age);//0
user.age = 13;
System.out.println(user.age);//13
user.setAge(11111);
System.out.println(user.age);//11111
}
}
class User{
public int age;
public String name;
public void setAge(int newAge){
age = newAge;
}
public int getAge(){
return age;
}
}
思考后的结果:如果是通过对象调用属性进行赋值,那么,调用者可以随意的去修改属性值,这种操作是不安全的,然后发现,使用方法的形式可以添加约束来限制调用者可赋值的一些规则。
public class PrivateDemo{
public static void main(String[] args){
User user = new User();
System.out.println(user.age);//0
user.age = 13;
System.out.println(user.age);//13
user.setAge(11111);
System.out.println(user.age);//11111
}
}
class User{
public int age;
public String name;
public void setAge(int newAge){
if(newAge>0 && newAge<130){
age = newAge;
}
}
public int getAge(){
return age;
}
}
需要处理的问题:如何能够避免让调用者去随意的修改属性值,其实就是如何能避免调用者查找到类中的具体属性,然后暴露出一些规则,让调用者可以进行正常的使用?
方案:将属性私有化,并提供带有规则的公共的方法以供调用者使用
public class PrivateDemo{
public static void main(String[] args){
User user = new User();
System.out.println(user.age);//0
user.age = 13;
System.out.println(user.age);//13
user.setAge(11111);
System.out.println(user.age);//11111
}
}
class User{
private int age;
private String name;
public void setAge(int newAge){
if(newAge>0 && newAge<130){
age = newAge;
}
}
public int getAge(){
return age;
}
}