【Java学习笔记】2015.1.5

1.classpath中的“.”表示当前的路径,因此配置classpath时要注意不能忘了“.”。若是不注意,会出现cmd下运行程序时,.java文件能够编译可是不能运行;
通常的classpath配置以下:
.;%JAVA_HOME%/lib/tool.jar;%java_home%/lib/rt.jar

 之因此提到这个,是由于在作后面程序的测试时,犯了这个错误,我在配置classpath时忘掉了“.”,因而一直报 NoClassDefFoundError的错误,而后发现是本身没有把当前路径加入到java的classpath,jvm固然找不到我编译好的class。java

2.关于Java主类中main方法里args的做用:
       args这里一样是用于传递参数,举例说明。假设咱们的demo是Member_and_local.java,代码以下:
public class Member_and_local {
  public static void main(String[] args){
    //测试main函数传参
        System.out.println( "第1个参数是"+args[0]+" 第2个参数是"+args[1]+" 第3个参数是"+args[2]);
    }
}

  在咱们用cmd命令行运行java程序时,通常状况下,首先 javac Member_and_local.java 编译,而后 java Member_and_local 运行,其实args给咱们提供了一个传递参数的接口。只要咱们代码中有相应的处理,能够在后面加上参数运行,例如图1中,咱们执行java Member_and_local 李根 1 232,这样咱们在程序中就能够经过args[0]来访问字符串“李根”,args[1]来访问“1”,args[2]来访问“232”程序员

       图1.args使用测试          jvm

运行结果如上,第一次运行没有添加参数,程序报错,缘由是:在没有参数输入时,我在程序中调用了args[0]、args[1]、args[2],固然指针溢出,而添加参数后,正常输出。
另外,咱们能够设置不一样的参数类型,好比把String换成int,能够得到int型的参数;
Public static void main( String[] int[] args){}
综上,args是便于程序员作传参的一种方法。
 
3.局部变量和成员变量
我不知道java里怎么准肯定义这两种变量,可是个人理解以下:
局部变量:是指在 全部方法中定义的变量(包括main方法),它只在方法执行过程当中有效,存在于栈中, 必须先作初始化才能调用,方法结束后,会被清空。
成员变量:也叫全局变量,是指在类中定义的变量,存在于堆中;它在整个类中都有效,只要类不被回收,它就一直存在,而且会自动初始化。
成员变量又可分为:类变量和实例变量
  (1)类变量:又叫静态变量,用static修饰,它能够直接用类名调用,也能够用对象调用,并且全部对象的同一个类变量都是共享同一块内存空间的。
  (2)实例变量:不用static修饰,它只能经过对象调用,并且全部对象的同一个实例变量是共享不一样的内存空间的。
 
下面举例说明:
a.局部变量要初始化,成员变量会自动初始化
public class Member_and_local {
    public static void main(String[] args){
        //测试局部变量
        //error: local variables must be initialed
        String name;
        int age;
        boolean sex;
        System.out.println( name+age+sex);
    }
}

此段程序会报错,由于name,age,sex是main方法中的局部变量在不初始化时会编译不经过,由于它未初始化函数

而成员变量则不一样,咱们用以下代码测试:测试

public class Member_and_local {
    public static void main(String[] args){
        Human ligen = new Human();
        ligen.getInfo();
    }
}
class Human{
    public static int population;
    private boolean sex;
    private String name;
    private int age;
    private Human partner;
    private double height;
    public void getInfo(){
        System.out.println( this.population+" "+this.sex+" "+this.name+" "+this.age);
        System.out.println( " "+this.partner+" "+this.height);
    }
}    

咱们定义了一个Human类,而且定义了6种不一样类型的成员变量,他们均未初始化,可是咱们使用getInfo()方法直接访问成员变量,结果并未出错,而是以下this

0 false null 0 null 0.0
那么能够看出各个类型的默认值以下表:
类型(Type) int double String(Object) Human(Object) boolean
默认值(default) 0 0.0 null null false
其余类型能够在使用时具体查询,可是这里咱们仍是养成良好的习惯,将成员变量自动初始化。
 
b.类变量能够用类名或者对象实例访问,实例变量只能用对象实例访问(类方法,实例方法同理)。用static关键字标注。
public class Member_and_local {
    public static void main(String[] args){        
        //测试类变量和实例变量
        System.out.println(Human.population);
        Human ligen = new Human();
        System.out.println(ligen.population);        
    }
}
class Human{
    public static int population;
    public Human(){
        this.population += 1;
    }
}

结果为0 1;说明类变量能够同时被类对象,实例对象访问。spa

 

4.引用中存放的不是对象地址,可是存放的内容能够找到对象的堆地址;命令行

public class Member_and_local {
    public static void main(String[] args){
        //查看引用中存放的是什么
        Human ligen = new Human();
        System.out.println(ligen);
    }
}

结果为指针

Human@459189e1

这个内容不是地址,可是应该能够用于寻找ligen这个对象的地址。修正:准确是 ligen.getClass().getName() + "@" + 16进制哈希码。code

 

5.java参数的值传递和引用传递

java中方法的参数有多是基本变量int,long,boolean等,也多是普通包装类对象String,Object等。在作参数传递时,前者是值传递,也就是将原变量复制一份传给参数;后者是引用传递,则是将对象的引用复制一份传递给参数;这么一来就会致使一些问题,若是该方法对传入的参数作改变,值传递是不会影响原变量,可是引用传递则会影响原变量

相关文章
相关标签/搜索