java工具类调用问题。 代码如下 为啥运行结构还是 a=2,b=5. 没有进行交换?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java工具类调用问题。 代码如下 为啥运行结构还是 a=2,b=5. 没有进行交换?相关的知识,希望对你有一定的参考价值。

/*
工具类ArrayTool
功能:对任意一个数组进行操作,找出最大、最小值;
可用选择法、冒泡法进行排序;
*/
public class ArrayTool

/*找出数组中元素的最大值*/

public static int Max(int[] arr)

int max=0;
for (int i=1;i<arr.length;i++ )

if(arr[i]>arr[max])
max=i;

return arr[max];

/*找出数组中元素的最小值*/
public static int Min(int[] arr)

int min=0;
for (int i=1;i<arr.length;i++ )

if(arr[i]<arr[min])
min=i;

return arr[min];

/*选择法排序*/
public static void selectSort(int[] arr)

for(int i=0;i<arr.length-1;i++)

for(int j=i+1;j<arr.length;j++)

if(arr[j]<arr[i])
swap(arr[i],arr[j]);



/*冒泡法排序*/
public static void bubbleSort(int[] arr)

for(int i=0;i<arr.length-1;i++)

for(int j=i+1;j<arr.length-1;j++)
if(arr[j+1]<arr[j])
swap(arr[j],arr[j+1]);


/*交换两个数*/
public static void swap(int x,int y)

int z;
z=x;
x=y;
y=z;

/*打印数组*/
public static void print(int[] arr)

System.out.print("[");
for (int x=0;x<arr.length ;x++ )

if(x<arr.length-1)
System.out.print(arr[x]+",");
else
System.out.print(arr[x]);

System.out.print("]"+"\n");



/*主函数类*/
class ArrayToolDemo

public static void main(String[] args)

int arr[]=3,5,7,9,1,58,2,4;
int max = ArrayTool.Max(arr);
/*System.out.println("max="+max);
int min= ArrayTool.Min(arr);
System.out.println("min="+min);
ArrayTool.print(arr);
ArrayTool.selectSort(arr);
*/
int a=2,b=5;
ArrayTool.swap(a,b);
System.out.println("a="+a+",b="+b);


你这样写明显不能交换,先看看你写的交换方法把。
/*交换两个数*/
public static void swap(int x,int y)

int z;
z=x;
x=y;
y=z;


你这个形参的值改变,根本不会影响到实参数值的变化,
int a=2,b=5;
ArrayTool.swap(a,b);
得到a的值仍然为2,b仍然为5.你需要把方法改成对象的引用,因为参数传递引用可以改变引用指向的对象状态,比如采用数组就可以办到。
但你的main需要改变,这里我就不写了。在java中建议不要这样写
参考技术A 你的函数是实现不了将两数交换的,你想想c语言的指针吧。public static void swap(int x,int y)

int z;
z=x;
x=y;
y=z;
参考技术B 你传过去的是a和b,但是经过函数调用,ab的值并没有变化啊!a还是等于2,b还是等于5,不知道这么说你能不能懂! 参考技术C java参数按值传递,变量本身不变。可把System.out.println("a="+a+",b="+b);
放到方法swap(a,b)中看看;结果会不一样
java基本功不牢 多看
参考技术D 厉害

Object在其子类中,为啥不能调用clone()???

package test;

public class C extends Object

void test()
Object object = new Object();
object.clone();//The method clone() from the type Object is not visible

Object类对象是无法被clone的,至少当引用obj被声明为Object类的时候,你不能这么做...
因为Java中并不是所有的类都可以被克隆(而且JDK中还描述说不能保证某些类clone的结果x.clone()!=x绝对成立),所以Object类对象无法调用clone()...
还有super不是指Object而是指其父类的引用。
由于clone是object类的一个protected方法,代码中不能直接调用它
子类只能受保护的clone方法克隆他自己,为此必须重新定义clone方法,
并将其设为public,一般情况下,建议实现cloneable标记接口,并通过调用super.clone()方法。
参考技术A protected修饰,只能在该类中或同包类中调用,你这里是在你的C类中!!当然看不见Object类的clone。另外,Object对象好像是不能克隆的,因为Object类的克隆方法只能在Object类或同包类中调用,但你不能在jdk里面乱写 参考技术B 你要用clone()方法,必须将C实现Cloneable标记接口才可以,我觉得你应该这个测试
public class C extends Object implements Cloneable

void test()
C c= new C();
C c2=(Object) c.clone();//The method clone() from the type Object is not visible

参考技术C 因为你的例程不是在java.lang包中,protected类型只能在本包和子类中访问。 参考技术D 可以参考这个问题:
http://stackoverflow.com/questions/1138769/why-is-the-clone-method-protected-in-java-lang-object

以上是关于java工具类调用问题。 代码如下 为啥运行结构还是 a=2,b=5. 没有进行交换?的主要内容,如果未能解决你的问题,请参考以下文章

在java 中子类对象为啥不能比父类对象有更严格的访问权限?

java中请问如何等待一个线程结束在运行其他的代码?

Java 反射之调用运行时类中指定的属性

java中,当实例化子类时会递归调用父类中的构造方法。这个说法对么?为啥

Java虚拟机详解------类文件结构

Object在其子类中,为啥不能调用clone()???