zoukankan      html  css  js  c++  java
  • 《Java编程思想》笔记 第二章 一切都是对象

    1.对象存储位置

    1. 对象的引用存在栈中,对象存在堆中。new 出来的对象都在堆中存储。栈的存取速度较快。
    2. 所有局部变量都放在栈内存里,不管是基本类型变量还是引用类型变量,都存储在各自的方法栈中;
    3. 但是引用类型变量所引用的对象(包括数组,普通Java对象)则总是存储在堆内存中。
    4. 基本类型的包装器类 如 Integer 可以在堆中创建一个非基本对象,用来表示基本类型。
    5. 也可以使用 Integer i = 1, Java SE5的自动包装功能将自动的将基本类型转换为包装器类型

    2.创建新的数据类型

    1. Java中所做的全部工作就是 定义类,生产类的对象,以及发送消息给对象,对象只能由类产生。
    2.  类中有字段和方法。字段可以是基本类型也可以是某类的对象,通过引用和对象通信,如果是引用则一定要初始化该引用,使其于一个实际对象关联。
    3. 对于类内的字段叫类的成员变量,方法内的字段叫局部变量,局部变量的作用域是这个方法。
    4. 一切对变量的修改表达式都在方法中进行,而不能出现在类中,类中只能定义字段和方法。而对变量的定义在类中方法中都可以。
       class A {
              int i = 1; //定义类的字段为基本类型,并初始化为1
               // i = 2; //错误,不能在类中出现表达式
      
              B b; //字段为对象的引用,未初始化,运行时自动初始化为null
              B c = null;// 字段为对象的引用,初始化为null,即该引用c未指向任何对象
              B d = new B();//字段为对象的引用,初始化并指向B类的一个实例
              //初始化的地方,方法不仅仅是上面的2种
          }
      
          class B {
              
          }
    5. 变量作为类的成员时(变量作为类的字段,不在方法中)即使不初始化,编译器也会给定一个默认值,确保得到初始化。
      基本类型及其对应数组类型 默认值
      boolean false
      char  null
      byte (byte)0
      short (short)0
      int 0
      long 0L
      float 0.0f
      double 0.0d
    6. 在C语言中,char类型占一个字节,在Java中char类型占2个字节。 所以Java中char可以存汉字,而C语言中Char不能存汉字。
    7. 唯一标识(区别)一个方法的就是方法签名,即 方法名参数列表。不依据方法返回类型区分。方法中定义一个局部变量 如 int x 必须要初始化,编译器不会默认初始化为0,运行时会报错 
    8. 创建一个类只是描述了这个类的外观和行为,并没有为其分配存储空间,只有当new之后才会在堆中分配内存空间来存放数据。

    3. 局部变量与成员变量

    public class NO1 {
        public static int a = 2;//类成员变量作用域整个类
        public static int b = 3;//类成员变量作用域整个类
        public  int c = 30;//成员变量作用域整个类
    
        public static void main(String[] args) {
            NO1 no1 = new NO1();//局部变量作用域是整个main方法
            no1.f(a, b);//把ab的值传入方法。
            System.out.println(a);
            System.out.println(b);
            no1.g(no1);// 复制一份执行no1引用传递给方法
        }
    
        /*方法接收的参数其实也是方法的局部变量如 a b */
        void f(int a, int b) {
            //int a = a;
            //int b = b;
            int c = 0;//局部变量
            a = a + b;//这里的a没有this它就是方法的参数,而不是成员变量
            b = a + b + 1; // 成员变量a b 只是和成员变量重名而已,并不会改变成员方法的值
            c = a + b;
            System.out.println(c);
        }
        void g(NO1 no){ //no也是局部变量
            //NO1 no = no;
            System.out.println(no.c);//此时no指向传递进来的对象。
            no = new NO1();// 局部变量no被指向其他对象
        }
    }

    4.  static关键字

    •  只有new之后会为数据分配存储空间,如果只想为某一个特定域分配空间,或者某个方法分配空间,而不通过new,那就使用static关键字,static域或者方法可以不用通过对象去调用,尽管它一定定义在类中。
    public class MyDemo {
    
        public static void main(String[] args) {
            A.i++; //通过类名直接引用变量i
            A.staticMethod();//通过类名不创建对象直接调用静态方法
            //A.method();//非静态成员不能直接引用
            A st1 = new A();
            A st2 = new A();
            System.out.println(st1.i == st2.i);//true
            
        }
    
    }
    
    class A {
        static int i = 1; //static 字段
        static{
            //static 方法块
        }
        
        static void staticMethod(){
            //static 方法
        }
        
        void method(){
            //非 static 方法
        }
    }

    通过 

    System.out.println(st1.i == st2.i);//true

    看出 static字段对于每个类来说都共享一份存储空间,而非静态字段则是每个对象都有各自的存储空间

    5. 注释

    6.编码风格

    • 参考《阿里巴巴Java开发手册》
  • 相关阅读:
    PDA智能程序访问WebService,报告“未能建立与网络的连接”
    VS2008中开发智能设备程序的一些总结收藏
    Error: The INF file contains Unicode characters that could not be converted correctly
    在vs2008工程中制作cab包
    linux专题三之如何悄悄破解root密码(以redhat7.2x64为例)
    linux专题一之文件描述符、重定向、管道符、tee命令
    linux的计划
    如何安装RHEL7.2x64 即红帽7.2虚拟机?
    快速排序及查找第K个大的数。
    来来来,做道题,一起防老年痴呆
  • 原文地址:https://www.cnblogs.com/mibloom/p/9040333.html
Copyright © 2011-2022 走看看