todo java_TODO java疑问

java 疑惑-关于方法调用的参数是基本类型和引用类型的差别

: 这里不会导致main中dw空指针的原因,是因为方法中调用的是对象的引用,main中也是对象的引用。两个引用并不是同一个。

class DataWrap

{

int a;

int b;

}

public class ReferenceTransferTest

{

public static void swap(DataWrap dw)

{

// 下面三行代码实现dw的a、b两个成员变量的值交换。

// 定义一个临时变量来保存dw对象的a成员变量的值

int tmp = dw.a;

// 把dw对象的b成员变量值赋给a成员变量

dw.a = dw.b;

// 把临时变量tmp的值赋给dw对象的b成员变量

dw.b = tmp;

System.out.println("swap方法里,a成员变量的值是"

+ dw.a + ";b成员变量的值是" + dw.b);

// 把dw直接赋为null,让它不再指向任何有效地址。

dw = null;

//System.out.println(dw.a+""+dw.b);

}

public static void main(String[] args)

{

DataWrap dw = new DataWrap();

dw.a = 6;

dw.b = 9;

swap(dw);

//dw=null;

System.out.println("交换结束后,a成员变量的值是"

+ dw.a + ";b成员变量的值是" + dw.b);

}

}

这里方法的最后释放了dw,指向空,但是调用方法之后,再次输出dw的a,b,可以得到输出值。

但是如果是使用注释的任意一句话,都会提示说该句有一个nullpoint异常。

不懂

为了理解这个过程,重写了一个小demo:

e19840c873dc0cfd1cbf359eb796f0f6.png

具象了一下疑问,做了demo改进。

方法中调用的基本类型,在方法内部操作数据,是copy的数据,数据的修改仅在方法内部生效,方法外部的实际值没有修改;

方法中调用的引用类型,在方法内部操作引用类型,是copy的对象的地址,对该地址的数据操作,对该地址的实际值有修改;

对该copy的地址进行操作,对实际的地址没有修改;

650a307e6534c875d0d02f53a6b540a3.png

MyClass myClass=new MyClass();

new的时候在堆中新建了一个对象。这个对象是MyClass的实例。其中myClass是该对象的引用。

TODO java-疑问 round函数源码看不懂

看不懂,改天研究?如果记得的话

public static long round(double a) {

long longBits = Double.doubleToRawLongBits(a);

long biasedExp = (longBits & DoubleConsts.EXP_BIT_MASK)

>> (DoubleConsts.SIGNIFICAND_WIDTH - 1);

long shift = (DoubleConsts.SIGNIFICAND_WIDTH - 2

+ DoubleConsts.EXP_BIAS) - biasedExp;

if ((shift & -64) == 0) { // shift >= 0 && shift < 64

// a is a finite number such that pow(2,-64) <= ulp(a) < 1

long r = ((longBits & DoubleConsts.SIGNIF_BIT_MASK)

| (DoubleConsts.SIGNIF_BIT_MASK + 1));

if (longBits < 0) {

r = -r;

}

// In the comments below each Java expression evaluates to the value

// the corresponding mathematical expression:

// (r) evaluates to a / ulp(a)

// (r >> shift) evaluates to floor(a * 2)

// ((r >> shift) + 1) evaluates to floor((a + 1/2) * 2)

// (((r >> shift) + 1) >> 1) evaluates to floor(a + 1/2)

return ((r >> shift) + 1) >> 1;

} else {

// a is either

// - a finite number with abs(a) < exp(2,DoubleConsts.SIGNIFICAND_WIDTH-64) < 1/2

// - a finite number with ulp(a) >= 1 and hence a is a mathematical integer

// - an infinity or NaN

return (long) a;

}

}

TODO java-疑惑-system.in和system.out似乎不能自由切换????

上代码:

while ((inputStr = br.readLine()) != null)

{

System.out.println("请输入1~"+BOARD_SIZE+"的数字");

Matcher m1 =p1.matcher(inputStr);

if(!m1.matches()){

System.out.println("请输入数字坐标,用,隔开");

continue;

}

}

原意想要在循环中先在控制台显示字符,然后再获取输入并判断。

实际上控制台进入循环后,会一直等输入,等到了输入之后,再输出。

TODO java-疑问 之前一直在类里面的方法加上static修饰,让其他的类能方便的调用,static到底有什么好处和坏处呢????

疑问

之前一直在类里面的方法加上static修饰,让其他的类能方便的调用,今天在做题目的时候,发现不加static方法,创建一个类的对象,使用对象来调用方法,也是可以的。

那加了static有什么优缺点呢?

TODO java-疑惑-在程序中,start一个线程,是主线程在start吗?

这段代码中,报错内容是 main这个thread出错了。

是说start这个事情,是main在负责吗?不是sd这个实例导致的吗???

Exception in thread "main" java.lang.IllegalThreadStateException

at java.lang.Thread.start(Unknown Source)

at chapter16.StartDead.main(StartDead.java:22)

package chapter16;

public class StartDead extends Thread{

private int i;

public void run(){

for(;i<100;i++){

System.out.println(getName()+" "+i);

}

}

public static void main(String[]args){

StartDead sd = new StartDead();

for(int i = 0;i<100;i++){

System.out.println(Thread.currentThread().getName()

+" "+i);

if(i ==20){

sd.start();

System.out.println(sd.isAlive());

}

System.out.println(Thread.currentThread().isAlive());

if(i>20&&!sd.isAlive()){

sd.start();//导致 main 出现illegalThreadStateException

}

}

}

}

TODO java-有疑惑的代码

import java.util.Arrays;

import java.util.function.*;

/**

* Description:

*
网站: 疯狂Java联盟

*
Copyright (C), 2001-2016, Yeeku.H.Lee

*
This program is protected by copyright laws.

*
Program Name:

*
Date:

* @author Yeeku.H.Lee kongyeeku@163.com

* @version 1.0

*/

public class ArraysTest2

{

public static void main(String[] args)

{

int[] arr1 = new int[]{3, -4 , 25, 16, 30, 18};

// 对数组arr1进行并发排序

Arrays.parallelSort(arr1);

System.out.println(Arrays.toString(arr1));

int[] arr2 = new int[]{3, -4 , 25, 16, 30, 18};

Arrays.parallelPrefix(arr2, new IntBinaryOperator()

{

// left代表数组中前一个所索引处的元素,计算第一个元素时,left为1

// right代表数组中当前索引处的元素

public int applyAsInt(int left, int right)

{

return left * right;

}

});

System.out.println(Arrays.toString(arr2));

int[] arr3 = new int[5];

Arrays.parallelSetAll(arr3 , new IntUnaryOperator()

{

// operand代表正在计算的元素索引

public int applyAsInt(int operand)

{

return operand +1;

}

});

System.out.println(Arrays.toString(arr3));

}

}

TODO java-遗留问题-annotation/swing/io/jdbc/awt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值