美文网首页java基础 集合 特性
Java基础之数据类型、内存、修饰符、代码块

Java基础之数据类型、内存、修饰符、代码块

作者: sunhaiyu | 来源:发表于2016-12-11 19:37 被阅读28次

    Java 数据类型

    • 基本数据类型

      • 数值:int、short、long
      • 字符:char
      • 布尔:boolean
    • 引用数据类型

      • class(类)
      • interface(接口)
      • 数组[]
    • 所占字节数1 byte= 8 bits

      • int:4字节
      • char: 规定2字节。若使用UTF-8编码,数字和英文等占1个字节,中文3个字节;若用GBK编码,中文是2个字节
      • float:4字节
      • short:2字节
      • long:8字节
      • double:8字节

    注意:Java中整数默认的是Int,小数默认double

    float f = 2.3; // 2.3默认为double,不能转为float,可能丢失精度
    float f = 2.3f; // true 末尾加f,表示这是一个float型
    
    long l = 12343565475989778034; // false, 默认为int,但是超出了范围
    long l = 12343565475989778034l; // 末尾加l,表示这是long型
    

    但是如下代码第一行是正确的。

    byte b = 4; // 默认int,但经过检查4是在byte型范围内的,发生int -> byte的隐式强转
    b =  b + 3; // false,和为int,int型不能赋值给byte
    // aa和bb都是变量,其和不能确定是否在范围内
    byte aa = 3;
    byte bb = 4;
    byte cc = aa + bb; // false
    
    byte cc = 3 + 4; // 但若明确给出常量,则true
    
    • 变量(局部)仅在一对{}内有效,然后被销毁。局部代码块,可以决定局部变量的生命周期。
    {
      int a = 3;
    }
    System.out.println(a); // false, 已经出了这对{},被销毁了
    
    • switch语句
    // 若不加break,从匹配到的那个case开始,之后如果都没break,都执行,不会跳出
    switch (expression) {
      case x: 
        code;
        break;
      case y:
        code;
        break;
      default:
        code;
        break
    }
    

    函数重载和重写(覆写@Override)

    • 函数重载
      • 同一个类中
      • 同名
      • 参数不同,或者类型不同
      • 函数重载和返回类型无关
    • 函数覆写(@Override)
      • 继承了父类或者实现了借口,有事需要Override父类的方法,定义子类特有的方法。
      • 返回类型,参数列表,函数名都一致。修饰符一般也一致,总的来说,除了内部实现全部一样。

    数组--引用类型

    • 数组的定义
    int[] a = {1, 23, 3};
    int[] b = new int[4]; // 此种定义方式必须指定数组长度
    int[] c = new int[]{1, 2, 3}; // 一般不这么写
    
    
    • 二维数组
    int[][] arr2= new int[3][]; // 至少给第一维指定长度
    // 每行的列数相同,3行2列
    int[][] = arr2 = new int[3][2];
    // 每行列数不一样
    int[][] arr2= new int[3][];
    arr2[0] = new int[2]; // 第1行
    arr2[1] = new int[3]; // 第2行
    arr2[2] = new int[4]; // 第3行
    

    栈内存和堆内存

    • 栈内存:存储的是局部对象,作用域结束就被释放
    • 堆内存:存储的是数组和对象,凡是new建立的都在堆内存中
    int[] arr = new int[3];
    // 这句右边new一个引用数据到堆内存,给三个值默认初始化为0
    // a指向这个数组对象,即地址。也可以说new出来的数组把它的地址给了arr
    // arr = null; 表示空,不绑定地址了
    
    int[] a = new int[3];
    int[] b = new int[5];
    a = b; // 把b的地址绑定到a,a和b都指向b的地址了
    
    System.out.println(arr); // 打印的是地址,格式为"[I@number",表示int,number为16进制表示的地址
    

    访问修饰符

    • public:任何类任何包都可以访问
    • private:仅限于当前类中访问
    • default(什么修饰符都不写,默认):同一个包的都可以访问,不同包的子类也不能访问
    • protected:同一个包,不同包只有子类可访问。(范围比default大一点)

    public static void main(String args[])

    这是固定格式!

    为什么必须这样写?

    • public:外界(JVM)调用main()函数,为了方便访问,设为最高权限

    • static:静态函数,非类成员函数,无需new新对象就可通过类名.main()直接调用。

    • void:main()函数就是执行任务,不需要返回什么值。

    • main():JVM识别main()字样,当满足public static void main(String args[])这样的写法时,则把其当成程序的入口开始执行。

    • String args[]:命令行参数,规定必须要有

    public static void abc(String args[]) // 函数名不是main,不是主函数
    public static void main() // 缺少命令行参数 String args[]也不是主函数
    static void abc(String args[]) // 不是主函数,一定要是public static void main(String args[])
    

    静态static

    静态函数

    静态函数一般作为工具函数,里面不可以用类成员,只能全用静态成员或者方法,但是成员函数却可以用静态数据和方法。

    静态变量

    static int money这样就是一个静态数据了。可以被很多对象共享,对象A改变了a,对象B中的a也改变了。大家用同一份money。

    package Test;
    
    
    public class StaticDemo {
    
        private static int money = 100;
    
        public int getMonney() {
            return money;
        }
    
        public void useMoney() {
            money--;
        }
    
        public static void main(String[] args) {
            StaticDemo a = new StaticDemo();
            StaticDemo b = new StaticDemo();
            // a用了一块
            a.useMoney();
            // 还剩99
            System.out.println(a.getMonney());
            // b用的是同一份money
            b.useMoney();
            // 还剩98
            System.out.println(b.getMonney());
        }
    }
    
    • 成员变量和静态变量
      1. 成员变量随对象的建立而建立,随对象消亡而消亡。< -- > 静态变量随着(和对象即实例区别开)的加载而加载,随类的消亡而消亡。即静态成员是先于实例存在的,还没new出对象就存在了。
      2. 成员对象只能是new出新实例后调用。< -- > 静态成员可以直接使用,类名.静态变量即可。
      3. 成员变量被称为实例变量。< -- > 静态变量被称为类 变量
      4. 成员变量位于堆内存的对象中,是对象的特有数据。 < -- > 静态变量位于方法区(的静态区)中,也叫对象的共享数据

    Q:static为何不能调用非静态方法或者数据?

    A:因为静态数据先于对象就已经产生,成员变量还不存在,不能访问。同理static函数中不能出现this、super关键字。

    Q: 什么时候用static?

    A:1. 静态变量,共享数据时,各个对象都使用同一个数据,不必作为对象特有的数据时候。如每个学生的姓名是特有的,但是每个学生可以共用同一个图书馆。

    1. 静态方法,无需访问类成员时(非静态),就可以定义为静态,一般为工具函数。

    各种代码块

    public class Abc {
      
      // 构造代码块,没有static。每new一个对象,就执行一次,故称为构造代码块
      // 针对不同的对象,进行相同的初始化,而构造函数对不同的对象进行不同的初始化,如给不同的人传入不同的名字和年龄进行初始化
      {
        System.out.println("我是构造代码块")
      }
      // 构造函数
      Abc() {
        System.out.pritnln("我是构造函数,后于构造代码块执行");
      }
      // 静态代码块最先执行,不论放在main()前面还是后面,都先于main加载,且只执行一次
      static {
      System.out.println("我最先");
    }
    
      public static void main(String args[]) {
        Abc a = new Abc(); // 先进入先构造代码块,
        // 以下是局部代码块,b只在这对{}内有效
        {
          int b = 3;
        }
        System.out.println(b); // false,b已经被释放
      }
    }
    

    !!!总的来说,执行顺序:static代码块 --> main() --> 构造代码块 --> 构造方法


    by @sunhaiyu

    2016.12.8

    相关文章

      网友评论

        本文标题:Java基础之数据类型、内存、修饰符、代码块

        本文链接:https://www.haomeiwen.com/subject/mfmpmttx.html