您的位置:首页 > 其它

关于变量、对象(类)、String类的理解与区分

2017-12-18 23:00 447 查看
(1)什么是变量?

变量的本质就是内存单元。

如何理解以下语句:

int a =6;


含义:申明了一个变量名为a的int型变量,在申明的同时分配了内存单元,并将int型数值6,存入了该内存单元。

int a = 6;
int b = 5;
a=b;


含义:将内存单元b中的值5,存入内存单元a中,覆盖掉原有的值6。

测试代码:

public class Test {
public static void main(String[] args) {
int a = 6;
int b = 5;
a = b;
System.out.printf("a的值为:%d\n",a);
}
}


运行结果:



(2)什么是对象和类?

对象是由静态的属性和动态的行为组成。

类是一组具有相同属性和行为的对象的抽象。

在Java程序语言中,类包括了成员变量和成员方法,按照类的访问权限分为:public、protected、default、private四种权限设置。

public为公用,面向所有的类都可以访问。

protected为保护,除了外部包的类不能访问外,其他都能访问。

default为默认,只有类内部和本包类可以访问。

private为私有,只有类内部可以访问。

如何理解下面这段代码:

Test类:

public class Test {
private int x;

public int getX() {
return x;
}

public Test(int x) {
this.x = x;
}

public static void main(String[] args) {
Test test1 = new Test(1);
Test test2 = new Test(2);
change(test1,test2);
System.out.println(test1.getX());
}
public static void change(Test test1,Test test2){
test1 = test2;
}

}


这段代码中:

Test test1 = new Test(1);


含义:Test test1 是申明一个Test类的对象引用变量,new 是创建一个实例对象,并分配内存空间,Tset(1)是构造方法,初始化对象。

先来看一下这段代码的运行结果:



从结果可以看到,tset1对象的x值仍然是1。

public static void change(Test test1,Test test2){
test1 = test2;
}


这个方法并没有将test2 对象的内容复制给test1,没有像两个变量之间的赋值一样执行。

如何理解?

因为在这个方法中,传递的参数test1和test2只是对象引用的副本,并不是对象的本身。

test1 = test2;


这条代码的含义是将test1对象引用指向了test2,并没有对原本的test1所指向的对象进行内容上的改变,所以当方法执行完,并没有改变任何东西,因为方法中传的参数是两个对象引用的副本,执行完方法后等于是被销毁了,也不会对原本的引用产生影响,原本的test1仍然指向原来的对象。

如果将change()方法改成,如下:

public static void change(Test test1,Test test2){
test1 = test2;
test1.setX(3);
}


并添加一个set方法:

public void setX(int x) {
this.x = x;
}


输出语句改为:

System.out.println("test1对象的x值为:"+test2.getX());


运行结果:



首先在change()方法中,将test1的引用指向了test2引用指向的对象,通过对象引用调用setX()方法后,修改的对象是test2指向的对象内容,所以在输出test2引用所指向对象的x值时,结果为3。

(3)String类

在用String类字符串时我们经常遇到这样的问题,比如下面这段代码:

public class Test {
public static void main(String[] args) {
String str = "abc";
System.out.println(str.toString());
change(str);
System.out.println(str);
}

/**
* 将字符串追加一个字符串
* @param str
*/
private static void change(String str) {
str += "abc";
}
}


运行结果:



从结果中分析发现,str字符串并没有被追加一个“abc”的字符串,为什么呢?

首先要理解String并不是一种数据的基本类型,而是一个类,所以下面这条语句:

String str = "abc";


等于是创建了一个str引用指向的对象。因为在创建String对象,即一个字符串时,默认字符串的长度是不可变的,所以当执行下面这条代码:

str += "abc";


相当于创建了一个新的字符串对象——“abcabc”,并让str引用指向它。

在下面这个方法中:

private static void change(String str) {
str += "abc";
}


首先将字符串引用str的副本作为参数传入,用对象的概念去理解,在方法体中执行的结果只是将这个副本引用指向了一个新的对象——“abcabc”,并没有对原本的对象进行改变,当执行完这个方法,str引用的副本被销毁,原来的str还是指向原来的字符串对象——“abc”,所以两次输出的字符串都为“abc”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string 对象 class 内存
相关文章推荐