菜鸟必须了解的两个常识

2016-02-19 17:04 6 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

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

  有个清晰的了解.

  我们知道:

  A a = new A();

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

  一起存放在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

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

  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对象,没有什么,很

  正常啊.

  那么,我们再来看:

  我们知道,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参数是值传递是不是错误了呢?

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

  老爹告诉你:no!

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

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

来源:http://www.tulaoshi.com/n/20160219/1614055.html

延伸阅读
http://educationiseverywhere.pushstage.ca/ 这是一个日本东芝电脑相关的一个培训网站,整体风格充满着趣味,flash的动画做得非常精彩,尤其在froshed栏目里,翻出的书页象立体折纸的感觉几可乱真. 这是AU Design 和 YAMAHA 合作的乐器手机概念设计的原型网站, 3段折叠的那款,还有可以拉成四面体的手机,似乎是可以打碟的,超有意思。 http:/...
FunctionCompFile(F1asstring,F2asstring)asboolean Dimissameasboolean OpenF1ForBinaryAs#1 OpenF2ForBinaryAs#2 issame=True IfLOF(1)LOF(2)Then issame=False Else whole&=LOF(1)10000'numberofwhole10,000bytechunks part&=LOF(1)Mod10000'remainingbytesatendoffile buffer...
如何正确减肥?想要有效减肥,对减肥的正确认识不可少,想要减肥要了解这些。 1.肌肉和赘肉会互换 答:肌肉是肌纤维,肥肉是脂肪组织,两者不会相互转换的。请放心使用。减肥时,加入重训可帮助提升代谢,可以事半功倍,所以不用等变瘦。 2.运动完不可以马上吃东西 答:运动后黄金39分钟内是最佳吸收时间,...
标签: 营养价值
野葛菜是一种野菜,它还叫江剪刀草、野油菜,它营养价值比较高,有很多的人喜欢吃野葛菜,但是大家不知道怎么吃,今天图老师小编为大家准备了野葛菜鱼汤的食谱,如果您比较感兴趣,就和图老师小编一起去看一看吧~ 野葛菜 它生长在山野间,喜水沟边生长,嫩叶可食用,一年中都可采摘。 本品为十字花科植物焊菜和无瓣焊...
两个MySql服务的应用 一、如何在同一系统中安装两个MySql服务。 安装一个5.0版本的,再安装一个5.1版本的就可以了。我用的是mysql-5.0.45-win32.zip和mysql-5.1.28-rc-win32。其中注意的是,把后安装的配置端口号码改成不是3306,不然会和前一版本的端口号冲突。 二、应用: 今天备份数据库的时候,用5.1版本,导出出过程,5.1服务自动...

经验教程

400

收藏

88
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部