Java成员属性与成员方法
概念
- 成员方法:出现在class(类)中的方法叫做成员方法。
- 成员属性:出现在class(类)中,方法之外的定义,叫做成员属性。(类似结构体中的结构体变量)
public class User(){
int A;
char B;
String C;
public void typeMoon(){
System.out.println("Type-moon");
}
}
//在这个类User中 A、B、C都是成员属性,typeMoon为成员方法
public class TestUser{
public static void main(String[] args){
User A = new User();
System.out.println(A.b.Uid);
/*
D:\A\B>java TestUser
Exception in thread "main" java.lang.NullPointerException
at TestUser.main(TestUser.java:4)
D:\A\B>
NullPointerException意思为空指针,此时Ai b我们并没有为他申请一块空间所以他会错误,b还是个空的null
*/
}
}
class User
{
int a;
Ai b;
}
class Ai
{
int Uid;
}
注意:
-我们所定义的每个class都需要为他new一个空间,和C++/C中的malloc相同,此时我们在Jvm的堆内存中申请了一块空间。
-char a = 'aa'不存在,因为char型只识别后面为一个字符。
char a = '字'中文也算一个字符,且中文在系统中占2个字节。
-int 型默认值为0
-char 型默认值为''空
-String 以及其他我们自定义的引用数据类型默认为null。
引用数据类型类似于指针,其所保存的一定是对象的首地址。
安全性
public class TestUser{
public static void main(String[] args){
User A = new User();
User a = A;
A.b.Uid = 6
System.out.println("A.b.Uid:" + A.b.Uid);
a.b.Uid = 1
System.out.println("a.b.UidL:" + a.b.Uid);
System.out.println("A.b.Uid:" + A.b.Uid);
/*
D:\A\B>java TestUser
A.b.Uid:6
a.b.UidL:1
A.b.Uid:1
由这里可以看出,Uid所存放的数据十分不安全,任何一个User类的变量只要把A地址赋给他就能任意的修改Uid的数据,十分的随意。
*/
}
}
class User
{
Ai b = new Ai();
}
class Ai
{
int Uid;
}
我们应该如何避免这种情况?
使用private修饰类中的变量和方法即可。
-private(不可修饰类):其他类不可访问被private修饰的方法和变量
public class TestUser{
public static void main(String[] args){
User A = new User();
A.Uid = 6;
System.out.println("A.b.Uid:" + A.Uid);
/*
D:\A\B>javac TestUser.java
TestUser.java:4: 错误: Uid 在 User 中是 private 访问控制
A.Uid = 6;
^
TestUser.java:5: 错误: Uid 在 User 中是 private 访问控制
System.out.println("A.b.Uid:" + A.Uid);
^
2 个错误
*/
}
}
class User
{
private int Uid;
}
此时我们如果想更改其中的Uid数值则只需要通过设置一个Public修饰的方法即可对Uid进行更改。
为什么要采取这个方式?
安全,因为这样就避免了对于数据的直接更改(防止混乱),我们需要更改Uid的值必须通过我们设置的这个Public的方法才能修改数值,规范了修改数据的操作。
如何理解:
这就相当于我们原先把一块黑板(黑板上写了Uid = 3)放在广场上,任何人都可以随意的改Uid的值是多少,而现在我们用private修饰相当于把它放在了一个房间里,public的方法就是这个房间的门,人们不能随意更改Uid的值,而必须通过这个门进来才能对Uid进行修改,我们是否把这个方法给别人就是决定是否给他人房间门的钥匙。
public class TestUser{
public static void main(String[] args){
User A = new User();
A.set(6);
int G = A.get();
System.out.println("A.b.Uid:" + G);
}
}
class User
{
private int Uid;
public void set(int id){
Uid = id;
}
public int get(){
return Uid;
}
}
此时即可修改与输出。
- 在内存中的运行原理
Test.java
public class Test{
public static void main(String[] args){
User user = new User();
user.student.address.setAddressName("ABC");
System.out.println("addressName:" + user.student.address.getAddressName());
}
}
User.java
public class User
{
Student student = new Student();
}
class Student
{
Address address = new Address();
}
class Address
{
private String addressName;
public void setAddressName(String AddressName){
addressName = AddressName;
}
public String getAddressName(){
return addressName;
}
}
堆图(待补充)