2017 - 10 -14 java基础

1 java程序为了提高程序的效率,就对数据进行了不同的空间分配。
  具体划分为五个内存空间
  栈:存放的是局部变量
  堆:存放的是所有new出来的东西
  方法区:(类的方法,静态等)
  本地方法区:(和系统相关)
  寄存器:(CPU使用)

  局部变量:在方法定义中或者方法声明上的变量都称为局部变量

  int[] arr = new int[3]
  System.out.println(arr);//地址值
  System.out.println(arr[0]);// 0
  System.out.println(arr[1]);// 0
  System.out.println(arr[2]);// 0

     栈                           堆
                               new int[3]
 int[] arr  <-------  0x0001(地址)
                                  0  0
                                  1  0
                                  2  0 

堆内存的特点:
A:每一个new出来的东西都有地址值
B:每个变量都有默认值
     byte,short,int,long 0
     float,double  0.0
     char '\u00000'
     boolean false
     引用类型 null

C:使用完毕就变成了垃圾,但是并没有立即回收。会在垃圾回收器空闲的时候回收。

栈内存的数据用完就释放掉。例如:


 int a = 100;
 System.out.println(a);
}

2  数组动态初始化和静态初始化
  动态:
  int[] arr = new int[3];
  arr[0] = 1;
  静态:
  int[] arr = new int[]{1,2,3}
  简化后:
  int[] arr = {1,2,3}

3 数组操作的两个常见小问题  
  编译时不报错,运行报错
  int[] arr = {1,2,3};
  System.out.println(arr[3]);
  //(ArrayIndexOutOfBoundsExceptin)数组索引越界异常越界
  //原因:访问了不存在的索引

  arr = null;
  System.out.println(arr[0]);
  //(NullPointerException)空指针异常
  //原因:数组已经不再指向堆内存了,而你还用数组名去访问元素
  作用:请自己把所用的场景Exception结尾的问题总结一下,以后遇到就记录下来。

4 二维数组
  A:
  int[][] arr = new int[3][4];
  arr[1][1] = 100;
  B:
  int[][] arr = new int[2][];
  arr[0] = new int[1];
  arr[1] = new int[2];
  arr[2] = new int[3];
  arr[1][1] = 100;
  C:
  int[][] arr = {{1,2,3},{4,5},{6}};


5 一个对象的内存图



6 成员变量和局部变量的区别

  A:位置不同
    成员变量:在类中方法外
    局部变量:在方法定义中或者方法声明上
  B:内存中的位置不同
    成员变量:在堆内存
    局部变量:在栈内存
  C:生命周期不同
   成员变量:随着对象的创建而存在,随着对象的消失而消失
   局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
  D:初始化时不同
   成员变量:有默认初始化值
   局部变量:没有默认初始化值,必须定义,赋值,然后才能使用

  注意事项:
       局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用就近原则。

  class Variable{
    //成员变量
    int num = 10;
    //int num; //0

    public void show(){
     //int num2 = 20;//局部变量
     //可能尚未初始化变量num2
     //int num2; 没有默认值
       int num2 = 20;
       System.out.println(num2);

       int num = 100;  
       System.out.println(num); // 100  采用就近原则
      }
}


7  匿名对象
   就是没有名字的对象

   匿名对象的应用场景:
   A:调用方法,仅仅只调用一次的时候。
       注意:调用多次的时候,不适合。
       那么,这种匿名对象调用有什么好处吗?
         1.匿名对象调用完毕就是垃圾,可以被垃圾回收器回收。
   B:匿名对象可以作为实际参数传递
   
   //带名字的对象
   Student s = new Student;
   s.show();
   s.show();

   //匿名对象
   //new Student()
   //匿名对象调用方法
   new Student().show();
   new Student().show();// 这里其实是重新创建了一个新的对象

   //匿名对象作为实际参数传递
   StudentDemo sd = new StudentDemo();
   //Student ss = new Student();
   //sd.method(ss);//这里的s是一个实际参数
   //匿名对象
   sd.method(new Student());

   //再来一个
   new StudentDemo().method(new Student());

8 static
  (所以感觉作用两点,成员变量和成员方法)
  (成员变量  被对象共享)
  (成员方法  即不用建立对象而调用类的方法)
    (可以修饰内部类,但主类不能)
    (静态方法只能访问静态成员)
    (静态方法不能被重写,静态变量是变量不是常量,可以被改变,对所有对象都有影响)
   (目前看到的修饰:变量(成员变量和局部变量)、方法、代码块、内部类 )
  针对多个对象有共同的这样的成员变量,java提供了static 
  static的特点:(它可以修饰成员变量,也可以修饰成员方法)
    A:随着类的加载而加载
      回想main方法。。。
    B:优先于对象存在
    C:被类的所有对象共享
        举例:我们班上的学生应该共用一个班级编号
          如果某个成员变量是所有对象共享的没那么它就应该定义为静态的
    D:可以通过类名调用
         其实它本身也可以通过对象名调用

    静态修饰的内容一般我们称其为:与类相关的,类成员


9 main方法的格式讲解
  public static void main(String[] args)

  public:公共的,访问权限是最大的,由于main方法是被jvm调用,所以权限要够大
  static:静态的,不需要创建对象,通过类名就可以,方便jvm的调用
  void:因为我们曾经说过,方法的返回值是返回给调用者的,而main方法是被jvm调用,返回给jvm没有意义
  main:是一个常见的方法入口,(我)见过的语言都是以main为入口
  String[] args:这是一个字符串数组,值去哪里了?
        这个东西到底有什么用?怎么给值?
          这个东西早起是为了接受键盘录入的数据的
         java MainDemo hello world
   http://blog.csdn.net/yxmaomao1991/article/details/50507177
发布了31 篇原创文章 · 获赞 2 · 访问量 9205
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章