关于变量、对象(类)、String类的理解与区分
2017-12-18 23:00
447 查看
(1)什么是变量?
变量的本质就是内存单元。
如何理解以下语句:
含义:申明了一个变量名为a的int型变量,在申明的同时分配了内存单元,并将int型数值6,存入了该内存单元。
含义:将内存单元b中的值5,存入内存单元a中,覆盖掉原有的值6。
测试代码:
运行结果:
(2)什么是对象和类?
对象是由静态的属性和动态的行为组成。
类是一组具有相同属性和行为的对象的抽象。
在Java程序语言中,类包括了成员变量和成员方法,按照类的访问权限分为:public、protected、default、private四种权限设置。
public为公用,面向所有的类都可以访问。
protected为保护,除了外部包的类不能访问外,其他都能访问。
default为默认,只有类内部和本包类可以访问。
private为私有,只有类内部可以访问。
如何理解下面这段代码:
Test类:
这段代码中:
含义:Test test1 是申明一个Test类的对象引用变量,new 是创建一个实例对象,并分配内存空间,Tset(1)是构造方法,初始化对象。
先来看一下这段代码的运行结果:
从结果可以看到,tset1对象的x值仍然是1。
这个方法并没有将test2 对象的内容复制给test1,没有像两个变量之间的赋值一样执行。
如何理解?
因为在这个方法中,传递的参数test1和test2只是对象引用的副本,并不是对象的本身。
这条代码的含义是将test1对象引用指向了test2,并没有对原本的test1所指向的对象进行内容上的改变,所以当方法执行完,并没有改变任何东西,因为方法中传的参数是两个对象引用的副本,执行完方法后等于是被销毁了,也不会对原本的引用产生影响,原本的test1仍然指向原来的对象。
如果将change()方法改成,如下:
并添加一个set方法:
输出语句改为:
运行结果:
首先在change()方法中,将test1的引用指向了test2引用指向的对象,通过对象引用调用setX()方法后,修改的对象是test2指向的对象内容,所以在输出test2引用所指向对象的x值时,结果为3。
(3)String类
在用String类字符串时我们经常遇到这样的问题,比如下面这段代码:
运行结果:
从结果中分析发现,str字符串并没有被追加一个“abc”的字符串,为什么呢?
首先要理解String并不是一种数据的基本类型,而是一个类,所以下面这条语句:
等于是创建了一个str引用指向的对象。因为在创建String对象,即一个字符串时,默认字符串的长度是不可变的,所以当执行下面这条代码:
相当于创建了一个新的字符串对象——“abcabc”,并让str引用指向它。
在下面这个方法中:
首先将字符串引用str的副本作为参数传入,用对象的概念去理解,在方法体中执行的结果只是将这个副本引用指向了一个新的对象——“abcabc”,并没有对原本的对象进行改变,当执行完这个方法,str引用的副本被销毁,原来的str还是指向原来的字符串对象——“abc”,所以两次输出的字符串都为“abc”。
变量的本质就是内存单元。
如何理解以下语句:
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”。
相关文章推荐
- java学习心得:关于对象与引用变量的关系的理解
- 关于Java两种同步方法的理解(代码块级同步对象设置)
- java中栈.堆.常量池和关于String类的理解
- php中引用&的真正理解-变量引用、函数引用、对象引用
- 关于面向对象与面向过程(面向结构)的区分
- 关于引用变量的生命周期如何影响对象的生命周期
- PHP面向对象之旅:深入理解static变量与方法
- 关于引用对象的使用的一点小理解
- 黑马程序员------面向对象(No.1)(面向对象的理解、成员变量、局部变量、匿名对象)
- 《iOS应用程序开发方法与实践》答疑-关于对象创建、self、成员变量与属性
- php中引用&的真正理解-变量引用、函数引用、对象引用
- 关于JAVA面向对象基础整理以及个人的理解(适合初学者阅读)
- php中引用&的真正理解-变量引用、函数引用、对象引用
- 谈谈自己对js闭包,执行上下文,作用域链,活动对象AO,变量对象VO的理解
- 深入理解JavaScript系列(12):变量对象(Variable Object)
- 深入理解JavaScript系列(12):变量对象(Variable Object)
- 关于Js OOP编程 创建对象的一些理解。
- 深入理解javascript内部原理(2): 变量对象(Variable object)
- java中如何理解多个对象共享同一个静态成员变量(多个实例的static变量会共享同一块内存区域)
- 关于父类引用指向子类对象在javaee中的理解(初学)