请帮看下java代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请帮看下java代码相关的知识,希望对你有一定的参考价值。

public class Pass
static int j=20;
public static void main (String args[])
int i=10;
Pass p = new Pass();
p.amethod(i);
System.out.println(i);
System.out.println(j);


public void amethod (int x)
x=x*2;
j=j*2;



为什么运行的结果是10
40啊

我以为是20
40

首先,你要知道,变量i是局部变量,j是静态的全局变量。
其次,你要明白,在Java中,基本类型的参数,如int、float、char等,都是按值传递的,而对象,如String等是按引用传递,跟C++里面的按地址传递类似。
最后解释:在amethod()方法中,你传递了参数i,并在方法内部分别为i和j的值乘以2,然而,在方法体内部,i的确是编程了20,j也变成了40.
但是,出了该方法体,当回到main方法时,i的值是没有改变的,因为刚刚是按值传递的,在main中i的值依旧是10,而j因为是静态变量,自然对它的作用是有效的。
所以,最后的结果就如你所见了。
最后,推荐一个Java基础群:84994654
参考技术A public class Pass
static int j=20;//静态
public static void main (String args[])
int i=10;
Pass p = new Pass();//这里:j=20(外部静态变量),p.i=10;
p.amethod(i);
System.out.println(i);
System.out.println(j);


public void amethod (int x)
x=x*2;//这里的x是什么?是参数!参数在函数体里进行赋值是没有意义的原来定义的x是不变的。要么你return x;所以结果是x=10
j=j*2;

参考技术B 看好了:
p.amethod(i);调用的是下面的这段代码,对吧
public void amethod (int x)
x=x*2;
j=j*2;

那你有没有看到这个方法有返回i的值的吗?你只是把i=10的值传给了x,但是并没有改变i的值啊。
那为什么j的值会改变呢?
因为你在这里定义的j为全局变量。
明白了吗?
参考技术C amethod方法做了两件事,第一件是把传进来的参数值*2,第二件是静态变量的值*2,但是,x = x * 2 ;第一条语句实际上改变的是参数x的值,但不会影响到i,因为amethod的参数是传值,而不是传址。

也就是说传到amethod方法里的x只是和i的值相等罢了,而不是i本身,所以i依然是10
参考技术D 很简单,i是全局变量,j是局部变量 第5个回答  2009-10-23 引用传递和值传递的问题,建议你看看这方面的资料

java操作oracle程序,高手帮看下这程序?

import java.sql.*;
public class TestBatch

private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String USER = "scott";
private static final String PASSWORD = "scott";

public TestBatch()


public static void main(String[] args)
try
Class.forName(DRIVER);

Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
boolean flag = conn.getAutoCommit();//帮忙解释下这句程序是什么意思?
try
String sql1 = "update emp set sal=2444 where empno=7902";
String sql2 = "update emp set sal=2445 where empno=7934";
stmt.addBatch(sql1);
stmt.addBatch(sql2);
conn.setAutoCommit(false);//这句程序是什么意思?
stmt.executeBatch();
conn.commit();
System.out.print("更新成功");
catch (SQLException ex)
conn.rollback();
System.out.println("更新失败,已全部回滚");
ex.printStackTrace();
finally
conn.setAutoCommit(flag);//这句程序是什么意思?
stmt.close();
conn.close();


catch (ClassNotFoundException ex)

catch (SQLException ex)





1.高手帮忙看下这程序错误在哪里了?
2.帮我看下程序注释部分那句程序是什么意思?
3.能帮我把这程序改对嘛?
运行时报下面这个错误:
更新失败,已全部回滚
java.sql.BatchUpdateException: 批处理中出现错误: ORA-04098: 触发器 'SCOTT.RESTRICT_SAL' 无效且未通过重新验证

at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:415)
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:455)
at oracle.jdbc.driver.OracleStatement.executeBatch(OracleStatement.java:3957)
at com.jd.TestBatch.main(TestBatch.java:26)

1 和你程序代码无关,错误是因为emp 定义了触发器,需要按照触发器的规则去更新数据才可以成功执行,否则就报出以上错误,具体要看你数据库里emp表上定义的触发器到底是怎么写的/
2 第1句是判断当前的conn的自动提交类型是true还是flase,如果true,则执行一句自动commit一次;第2行注释是强行将conn设置为false,就是手动提交,这样保证执行的事务性,在方法最后自己写commit,要么都成功,要么都失败,这也是代码开发时很好的习惯。
3 需要根据你的触发器规则去update数据,不是任意的数据都可以更新,有时候还可能要更新别的表数据这个触发器才能绕过追问

明白了,谢谢了啊。你在打开我又发了个程序,你再帮我看下我那个程序,就是有重新提了个问题。你帮忙看下我那个问题。

追答

问题在哪。。。

追问

就是还是我这个名字,我又刚添加了个问题,名字叫:高手帮忙看下,这java程序是什么意思?
你不能再搜索我这个用户下面的所有提问问题吗?或者你直接在百度知道里搜索:高手帮忙看下,这java程序是什么意思。这个就出来我的问题了。

参考技术A boolean flag = conn.getAutoCommit();//帮忙解释下这句程序是什么意思?
查看当前是否设置了默认事务模式-自动提交,即执行一个sql(增删改)提交一次;

conn.setAutoCommit(false);//这句程序是什么意思?
设置了新的事务提交方式,就是不自动提交了。用户自己控制事务,所以之后才有 conn.commit();语句。

conn.setAutoCommit(flag);//这句程序是什么意思?
这句写在finally里面。就是,在这段代码执行完以后,将事务设置回执行这段代码之前的方式。之前是自动提交的,就设置回自动提交,用户控制的就设置回用户控制。

至于你更新数据失败的原因,触发器SCOTT.RESTRICT_SAL定义于表emp.sal上,你可查看下该触发器逻辑是否正确,与上述代码执行无关。
参考技术B conn.setAutoCommit(false); 设置它为非自动提交,我们老师是这样解释的。 参考技术C 那句意思是是否自动提交更新。

另外错误的原因是:数据库中定义的触发器 'SCOTT.RESTRICT_SAL' 有编译错误

以上是关于请帮看下java代码的主要内容,如果未能解决你的问题,请参考以下文章

【java】帮看一个LinkedList的小代码。万分感谢!!

高手帮看一下搜索代码,搜索数字及字母时没问题,输入中文搜索就是乱码。

PartitionMagic 8.0报错启动不了,专家帮看下

语法的几个问题 帮看下 thank!!very

帮看下这句css中的波浪号是啥意思

求大神 关于 pandas请帮我看下 线面这段代码 我用 jupyter notebook 运行 显示 错误