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;
	}

}

堆图(待补充)