菜鸟必须了解的两个常识

先锋音讯小胡

先锋音讯小胡

2016-02-19 17:04

今天图老师小编给大家展示的是菜鸟必须了解的两个常识,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

  一,对象(object)与引用(reference)

  有许多书籍,对于对象与引用之间的关系一直语焉不详,甚至有的干脆是错误的说法,我们必须对这个问题

  有个清晰的了解.

  我们知道:

  A a = new A();

  产生一个A类型的对象,a是这个对象的的一个引用,即a指向heap中真正的对象,而a和其他基本数据类型

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  一起存放在stack中.也就是object通过reference操控,在底层的话,a更象一个指针.

  对于有些书本所说,a就是对象,初学者的话也没什么大问题,因为对a的操作,就是对a指向的对象的操作.

  问题是,当a的指向发生改变时,a就是对象的说法就不能适应程序设计的需要.

  让我们来看一个简单的程序:

  

class A
{
private int i=0;
public void setI(int x)
{
i=x;
}
public int getI(){
return i;
}
}
public class MyRef1 {
public static void main(String[] args) {
A a=new A();
A b=new A();
a.setI(10);
b.setI(15);
System.out.println("a的i="+a.getI());
System.out.println("b的i="+b.getI());
a=b;
a.setI(20);
System.out.println("a的i="+a.getI());
System.out.println("b的i="+b.getI());
}
}

  我想,大家对于程序的输出应该认为是:

  a的i=10

  b的i=15

  a的i=20

  b的i=15

  第一,第二行应该没什么异义,第三行是对a设置后i的值,问题是,第四行是不会输出i=15的,正确结果是:

  i=20

  因此,a,b都是对对象的引用,当我们将b的引用赋予a时,a已经重新指向了b,对指向发生改变后的a的操作,

  就是对b的操作.

  当然,那些坚持"a,b就是对象"说法的人,还是可以解释这个问题:对啊,a对象"变成"了b对象,没有什么,很

  正常啊.

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  那么,我们再来看:

  我们知道,java通过final来定义常量:

  final int i=10;

  当我们对一个常量重新赋值时,会发生编译错误:

  i=5;//编译不通过

  我们也可以通过final来定义常量对象:

  final A a = new A();

  这样的话,我们将不能对a重新赋值.

  如果a本身是个对象,那么,这个对象就不能发生改变,其实,a只不过是一个引用,它只能指向原来指向的对象,

  并不是说它所指的对象的状态不能改变,因此,我们可以通过不改变a原来的指向的情况下对对象状态进行改

  变,看程序:

  

class A
{
private int i=0;
public void setI(int x)
{
i=x;
}
public int getI(){
return i;
}
}
public class MyRef1 {
public static void main(String[] args) {
final A a = new A();
System.out.println(a.getI());
a.setI(8);
System.out.println(a.getI());
}
}

  如果a本身是个对象,那么,根本就不可能

  a.setI(8);

  而实际a是一个引用,程序可以编译并运行:

  显示:8

  总之,java通过renfence来操控object,是深入学习java知识的基础,例如下面一点:

  二,java参数是值(value)传递还是引用(reference)传递

  我们先看程序:

  

public class MyRef2 {
static int x=10;
static int y=20;
public static void fangfa(int i)
{
i++;
x=i;
}
public static void main(String[] args) {
System.out.println("x="+x);
System.out.println("y="+y);
MyRef2.fangfa(y);
System.out.println("x="+x);
System.out.println("y="+y);
}
}

  显然,将显示:

  x=10

  y=20

  x=21

  y=20

  y的值并没有发生改变,MyRef2.fangfa(y)使用的仅仅是y的值,里面的i++也不会作用到y本身.

  显然,java的参数是值传递,但是,为什么会有引用传递的说法呢?

  看下面这个程序:

  

class A
{
private int i=0;
public void setI(int x)
{
i=x;
}
public int getI(){
return i;
}
}
public class MyRef1 {
public static void setA1(A newA,int t)
{
newA.setI(t);
}
public static void main(String[] args) {
A a=new A();
System.out.println(a.getI());
MyRef1.setA1(a, 30);
System.out.println(a.getI());
}
}

  按照值传递的说法,MyRef1.setA1(a, 30);将使用a所指的对象的一个复件,最终对这个对象没有作用

  而事实是,方法对这个对象起了作用,程序将显示0,30.那么,java参数是值传递是不是错误了呢?

  老爹告诉你:no!

  我们要记住,a只不过是对象的reference,而reference的复件与原来的reference指向的是同一个对象

  我们对复件的操作,与对a的操作一样,最终还是对指向对象的操作,因此,java的参数,只有值传递.

展开更多 50%)
分享

猜你喜欢

菜鸟必须了解的两个常识

编程语言 网络编程
菜鸟必须了解的两个常识

男人必须了解的五个健身常识

男人 健身 男人养生
男人必须了解的五个健身常识

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

男人健身必须了解5个常识

男人 健身 男人养生
男人健身必须了解5个常识

Oracle体系结构前必须掌握的两个概念

编程语言 网络编程
Oracle体系结构前必须掌握的两个概念

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何健身效果最好?男人健身必须了解5个常识

运动健身
如何健身效果最好?男人健身必须了解5个常识

腌肉的两个吃法

营养价值
腌肉的两个吃法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

CSS编码差异 导致IE6不能正常解析CSS文件

CSS编码差异 导致IE6不能正常解析CSS文件

win10磁盘100%占用怎么办

win10磁盘100%占用怎么办
下拉加载更多内容 ↓