变量作用域

  1. 局部变量:在类的方法内部
  2. 实例变量:定义在类中,不用初始化,使用的时候先实例化类,再用对象. 成员名的方式访问
  3. 类变量:在类中,用static修饰,可以直接在本类中使用,也可以用类名.成员名的方式在其他类访问

变量命名规范

  1. 所有变量、方法、类名:见名知意
  2. 类成员变量:首字母小写和驼峰原则
  3. 局部变量:首字母小写和驼峰原则
  4. 常量:大写字母和下划线: MAX_VALUE
  5. 类名:首字母大写和驼峰原则
  6. 方法名:首字母小写和驼峰原则

两个数据类型相操作,如果两类型最大是int(可以没有int),结果是int

如:

1
short a=2;  byte b=1; //则a+b是int

如果两类型有long或double,则为long或double。

即使用一个更大的类型去接收,也不行

如:

1
2
3
int a=2000000000;//20亿
int b=10;
double c=a*b; //c依然不是200亿(溢出后的结果)

使用 double c=(double)a*b 可以解决


1
2
3
int a=1;int b=2;
System.out.println(""+a+b);//12
System.out.println(a+b+"");//3

字符串和int连接时,如果字符串在左,则int作为字符串连接

                                如果字符串在右,则int先作为int运算

包机制

包的本质就是文件夹,命名一般为公司网站域名倒置,如com.tencent.mobileqq

因为域名是从小到大,而文件夹要从大到小,所以倒置


数组初始化

  1. 静态初始化

    1
    int[] arr={1,2,3};
  2. 动态初始化

    1
    2
    3
    4
    5
    int[] arr =new int[3];
    arr[0]=1;
    arr[1]=2;
    arr[2]=3;
    int[] arr =new int[]{1,2,3};

    arr本身作为一个引用类型的变量(类似于指针),存放在栈中,arr初始化后便指向堆中的对象区域

静态方法(static)

静态方法是和类一起加载的,而非静态方法是类实例化后才加载的。因此,在静态方法中调用非静态发方法会报错,但静态调用静态,非静态调用非静态都没有问题

类的构造器

类会有一个隐式的无参构造方法,什么都不做,当用new实例化对象时,调用该构造方法。但当写了有参构造方法时,必须显式地定义无参构造,才能调用无参构造方法

super&this

super注意点:

  1. super调用父类的构造方法,必须在构造方法的第一个
  2. super必须只能出现在子类的方法或者构造方法中
  3. super和this不能同时调用构造方法!

Vs this:

代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的引用

前提
this:没有继承也可以使用
super:只能在继承条件才可以使用

构造方法
this();本类的构造
super():父类的构造

类的静态代码块

在类中,static{}中的称为静态代码块,在类被加载的时候执行,且只执行一次。

匿名代码块:{}中的称为匿名代码块,类被实例化的时候执行,且先于构造函数。

抽象类

  1. 不能new这个抽象类,只能靠子类去实现它;
  2. 抽象类中可以写普通的方法
  3. 抽象方法必须在抽象类中

接口

接口中的方法默认都是publish abstract, 所以声明方法只需返回值类型 方法名(参数);, 如void test(String name);

接口中的属性都是pulish static final, 但一般不在接口中定义属性

类通过implements关键字实现接口

内部类(不常见)

在一个public class 内部又定义一个public class,内部类可以访问外部类的私有属性。此时内部类可以看作外部类的成员变量,实例化时用:

1
2
Outer outer = new Outer();
Outer.Inner inner=outer.new Inner();

比较奇葩

还有局部内部类,就是在外部类的方法中定义的类。还有静态内部类,此时内部类只能访问外部类的静态属性,因为静态内部类加载时,外部类的非静态属性还未加载

一个.java文件只能有一个public class ,但是可以有多个class。

在public class下面还可以定义接口,在public class中通过new来实例化,并实现接口中的方法 特别奇葩

异常

try后可以有多个catch,catch的参数为异常类型,异常类型必须从小到大。

异常类型

类加载

  • 首先会初始化main方法所在类
  • new 子类,会首先加载父类
  • 通过子类类名调用父类静态属性,子类直接不会被加载,但父类会

类的主动引用(一定会发生类的初始化)

  • 当虚拟机启动,首先会初始化main方法所在类
  • new一个类的对象
  • 调用类的静态成员(除了final常量)和静态方法
  • 使用java.lang.reflect包的方法对类进行反射调用
  • 当初始化一个类.如果父类未被初始化,会首先初始化父类

类的被动调用

  • 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如: 当通过子类引用父类的静态变量,不会导致子类初始化
  • 通过数组定义类引用,不会触发此类的初始化
  • 引用常量不会触发此类的初始化 (常量在链接阶段就存入调用类的常量池中了)