zhou29笔记_java
变量作用域
- 局部变量:在类的方法内部
- 实例变量:定义在类中,不用初始化,使用的时候先实例化类,再用
对象. 成员名
的方式访问 - 类变量:在类中,用static修饰,可以直接在本类中使用,也可以用
类名.成员名
的方式在其他类访问
变量命名规范
- 所有变量、方法、类名:见名知意
- 类成员变量:首字母小写和驼峰原则
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线: MAX_VALUE
- 类名:首字母大写和驼峰原则
- 方法名:首字母小写和驼峰原则
两个数据类型相操作,如果两类型最大是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
int[] arr={1,2,3};
动态初始化
1
2
3
4
5int[] 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注意点:
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造方法!
Vs this:
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的引用前提
this:没有继承也可以使用
super:只能在继承条件才可以使用构造方法
this();本类的构造
super():父类的构造
类的静态代码块
在类中,static{}中的称为静态代码块,在类被加载的时候执行,且只执行一次。
匿名代码块:{}中的称为匿名代码块,类被实例化的时候执行,且先于构造函数。
抽象类
- 不能new这个抽象类,只能靠子类去实现它;
- 抽象类中可以写普通的方法
- 抽象方法必须在抽象类中
接口
接口中的方法默认都是publish abstract
, 所以声明方法只需返回值类型 方法名(参数);
, 如void test(String name);
接口中的属性都是pulish static final
, 但一般不在接口中定义属性
类通过implements关键字实现接口
内部类(不常见)
在一个public class 内部又定义一个public class,内部类可以访问外部类的私有属性。此时内部类可以看作外部类的成员变量,实例化时用:
1 | Outer outer = new Outer(); |
比较奇葩
还有局部内部类,就是在外部类的方法中定义的类。还有静态内部类,此时内部类只能访问外部类的静态属性,因为静态内部类加载时,外部类的非静态属性还未加载
一个.java文件只能有一个public class ,但是可以有多个class。
在public class下面还可以定义接口,在public class中通过new来实例化,并实现接口中的方法 特别奇葩
异常
try后可以有多个catch,catch的参数为异常类型,异常类型必须从小到大。
类加载
- 首先会初始化main方法所在类
- new 子类,会首先加载父类
- 通过子类类名调用父类静态属性,子类直接不会被加载,但父类会
类的主动引用(一定会发生类的初始化)
- 当虚拟机启动,首先会初始化main方法所在类
- new一个类的对象
- 调用类的静态成员(除了final常量)和静态方法
- 使用java.lang.reflect包的方法对类进行反射调用
- 当初始化一个类.如果父类未被初始化,会首先初始化父类
类的被动调用
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如: 当通过子类引用父类的静态变量,不会导致子类初始化
- 通过数组定义类引用,不会触发此类的初始化
- 引用常量不会触发此类的初始化 (常量在链接阶段就存入调用类的常量池中了)