java基础 集合 特性

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

2016-12-11  本文已影响28人  sunhaiyu

Java 数据类型

注意: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, 已经出了这对{},被销毁了
// 若不加break,从匹配到的那个case开始,之后如果都没break,都执行,不会跳出
switch (expression) {
  case x: 
    code;
    break;
  case y:
    code;
    break;
  default:
    code;
    break
}

函数重载和重写(覆写@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行

栈内存和堆内存

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 static void main(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());
    }
}

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

上一篇下一篇

猜你喜欢

热点阅读