189 8069 5689

java代码解说 java编程代码

java代码解析

一楼的说的够全面了,不过稍有误解.

我们提供的服务有:成都做网站、网站设计、外贸营销网站建设、微信公众号开发、网站优化、网站认证、黑河ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的黑河网站制作公司

再来表示抱歉,我对编程语言中的中文名词非常不了解,所以如果以下的回复对你的阅读或者理解造成困难,请见谅.

1.首先,要明白这个问题的答案,需要了解call (pass) by value 和 call (pass) by reference 的区别.简单来说:

call by value通常是复制这个parameter的值去另外一块内存里,然后传给function, 所以在method/function里边对这个变量的所有变更,实际上都是对复制过来的镜像进行操作,不会对原本的variable有任何影响.

call by reference是将parameter的reference传给function,简单点理解就是直接把variable传给function.所以说这个variable的值是可以被function改变的.这个用法在c/c++中非常常见,用法是variable_name.

2.再来,在Java里边,你可以很简单的理解为: Java中只有call by value, 也就是说,所以所有传给function的parameter本身都不会被改变. (这是最简单直白的理解,当然也有另一种常从sun的人那边听到的说法:Java是call by value + call by reference by value)

3.那么现在的问题就是为什么第二个结果是2了. 首先说一下sun官方的解释: 对于reference type在作为parameter/argument的时候,也是call by value, 但是在你拥有足够权限时(比方说那个变量是public的, 不是final的等等各种符合的情况),可以修改这个object中fields的值(也就是属于这个object(严谨点讲是an instance of the object) 内部的变量, 在你的例子中, ko 里边的 a 就是一个field, 所以update(ko)会使ko.a变成2).

4.如果你是一个有过c/c++学习经验的人或者你以上的解释很难理解,以下这种说法或许更适合你 (当然了,这只是大多包括我在内有c经验的人的一种理解方式)

这里可以引入一个新的概念,pointer. 这是一种比较特殊的变量,它内部所储存的东西,其实只是另外一个变量的内存地址. 如果对内存没有概念,你可以把它简单理解为是风筝的线轴,虽然看它本身看不出什么端倪,但是顺着摸过去总会找到风筝,看到它是什么样子. 以pointer方式理解Java的人,通常会说: Type variable = new Type(); 这个过程中,最后生成的这个variable其实就是一个pointer,而不是instance本身.

在Java中, 有c/c++经验的人通常认为Java是call by value.同时,当一个变量用在储存reference type的时候,实际上储存的是它的pointer,这也一样可以解释为什么ko.a会有2这个结果,因为虽然pointer被传到function里边时,本身是call by value,无法被改变.但这并不影响function本身对这个pointer指向的object的内容做任何改变. 当然,再次声明,这只是一种帮助有c/c++经验的人理解的方法. Sun本身严正声明Java里边没有pointer这个东西的存在.

5. 再来解释一下为什么说楼上所说的(或者说楼上引用的)理解略有偏差.

引用"我们上面刚学习了JAVA的数据类型,则有:值类型就是按值传递的,而引用类型是按引用传递的" 这句话很明显的有两点错误. 第一点,如果我上面所说的,Java是没有call by reference的.

第二点,暂且假设Java里边是有call by reference的, 这句话依然不成立.

Java中的变量有两种类型: primitive types 和 reference type.

primitive type包括byte, short, int, long, char, boolean, float和double.

而这8种之外的所有的,都是reference type.

下面是一段对你的贴上来的code的一点延伸,希望可以帮助你更好的理解Java中的argument / parameter到底是如何运作的.

public class Test {

public static void main(String[] args) {

int a = 1;

Koo koo = new Koo();

Object o = new Integer(1);

Koo newKoo = new Koo();

update(a);

update(koo);

update(o);

update(newKoo);

newUpdate(newKoo);

System.out.println(a);

System.out.println(koo.a);

System.out.println(o);

System.out.println(newKoo.a);

}

static void update(int a) {

a++;

}

static void update(Koo koo) {

koo.a++;

}

static void update(Object o) {

o = (int) (Integer.parseInt(o.toString()) + 1);

}

static void newUpdate(Koo koo) {

koo = new Koo();

}

}

class Koo {

int a = 1;

}

/*

o = (int) (Integer.parseInt(o.toString()) + 1); 这一行中的(int)纯粹是多余的,是否有这个casting对code本身没有任何影响. 如果你高兴也可以用

o = new Integer(Integer.parseInt(o.toString()) + 1);

或者干脆

o = Integer.parseInt(o.toString()) + 1;

*/

以上这些code运行之后会得到1 2 1 2的结果. 后面两个结果可以很好的说明, 即使对objects (reference type variables) 来看, Java所应用的也并不是call by reference. 否则的话,以上code运行结果应该是1 2 2 1

希望你可以真正理解这个新的例子中,产生1212这个结果的原因,从而对Java中的arguments有一个系统全面的认识.

图片是相关资料的链接,知道里貌似不能加网址

java 的代码详解

class Person{//Persion类

String name;//String类变量,未初始化,默认null

int age;//int类变量,默认0

public Person()//Person类的无参构造方法,一般用来初始化变量,如之前的name。 比如有时候需要定义人这个类特有的属性,会说话,那么一般会在无参构造函数里面写上canTalk=true;

{

}

public Person(String name,int age)//Person类的有参构造方法,参数name和age,和类变量name、age无关

{

this.name=name;//this指Persion类,就是把于传过来变量name赋值给之前的类变量name

this.age=age;//同上

}

public String talk(){//具有String返回值的方法,调用它的时候会得到String返回值

return "我是"+this.name+",今年"+this.age+"岁";//调用talk的时候用String a=talk();的形式,a的值就是"我是"+this.name+",今年"+this.age+"岁"

}

}

public class TestObjectArray{//TestObjectArray公共类,java文件的文件名需和公共类值相同,这段代码必须出现在TestObjectArray.java文件中

public static void main(String[] args){//主方法,程序的入口

Person[] p={new Person("张三",25),new Person("李四",30),new Person("王五",35)};//实例化Persion类,用人这个类来举例,每个人都有相同的一些特性,但每个人不同特性的属性值不同,如年龄的大小不同,实例化就相当于产生不同的人。这里是用数组的形式实例化

for(int i=0;ip.length;i++){//根据p的长度循环

System.out.println(p[i].talk());//p[1]时,会调用Persion类里面的talk()函数,并且传入的参数是 "张三",25 ,那么会显示:"我是张三,今年25岁" 。System.out.println()换行显示括号内的内容

}

}

}

java代码解读

第一个if是判断searchkey是不是空的,如果不是空的,就追加到name字段作为查询条件,like模糊查询

接着第二个if判断如果status的值不为空,就追加到status作为条件

如果status为空,走else分支,从userContext中获取到employee对象,接着判断,如果它的角色不是manager的话

把这个对象的id拿出来,作为seller.Id的条件进行查询

java代码详解

public static String getDoGetURL2(String url, String charset)

throws Exception {

// 创建httpclinet对象,进行http请求

HttpClient httpClient = new HttpClient();

// 设置超时连接时间

httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(

5000);

// 使用get方法访问url

GetMethod getMethod = new GetMethod(url);

// 设置get请求超时连接

getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);

// 应该是重新发送get请求时的处理对象

getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,

new DefaultHttpMethodRetryHandler());

// 存储服务器端响应数据

String response = "";

try {

// get请求过后的状态码,像服务器端有404或者200等等

int statusCode = httpClient.executeMethod(getMethod);

// 如果状态码不为SC_OK,输出错误信息

if (statusCode != HttpStatus.SC_OK) {

System.err.println("Method failed: "

+ getMethod.getStatusLine());

}

// 拿到get请求头部信息

Header[] headers = getMethod.getResponseHeaders();

for (Header h : headers)

System.out

.println(h.getName() + "------------ " + h.getValue());

// 拿到响应数据

byte[] responseBody = getMethod.getResponseBody(); // 读取为字节数组

// 对响应数据进行字符集编码

response = new String(responseBody, charset);

System.out.println("----------response:" + response);

} catch (HttpException e) {

System.out.println("Please check your provided http address!");

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

// 最后释放http连接

getMethod.releaseConnection();

}

// 返回响应数据

return response;

}


文章名称:java代码解说 java编程代码
转载来于:http://cdxtjz.com/article/dosppeg.html

其他资讯