zoukankan      html  css  js  c++  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:

     

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

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

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

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

    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: * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> * <br/>Copyright (C), 2001-2016, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>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

  • 相关阅读:
    异步nodejs代码的同步样子写法样例
    npm用法及离线安装方法
    javascript 事件相关使用总结01
    python wsgi PEP333 中文翻译
    android webview 播放 video经验总结
    javascript面向对象的写法03
    javascript面向对象的写法02
    Nginx在Windows下的基本介绍安装以及基本使用
    window7下 cmd命令行 Mysql导出表结构 + 表数据
    【一】Spark基础
  • 原文地址:https://www.cnblogs.com/zhizhiyin/p/8491135.html
Copyright © 2011-2022 走看看