目录
前沿:撰写博客的目的是为了再刷时回顾和进一步完善,其次才是以教为学,所以如果有些博客写的较简陋,是为了保持进度不得已而为之,还请大家多多见谅。
本文只作为学习笔记分享。
1.静态
类间关系
量 = 常量 + 变量;
变量 = 成员变量 + 局部变量;
-
成员变量则是随着对象创建而存在,即类内方法外,局部变量即方法内的变量。
-
局部变量存在栈中,每次方法调用都是独立的,只能有final修饰。
成员变量 = 静态变量+实例变量;静态、成员和局部变量 -> 类、对象和方法;
-
静态变量相当于全局变量随着类创建存在,存储在方法区;
-
调用静态变量最好使用:类名.静态变量名,避免与成员or局部变量重名。
-
-
实例变量即非静态变量,存储在堆中;
静态方法
-
静态方法可以被子类继承,但不能被子类重写,重写也没用。
-
静态使用super和this失效,所以不能使用。
-
-
静态方法的调用都只看编译时类型。
编译时类型 and 运行时类型
编译时类型:声明该变量时使用的类型
运行时类型:该变量指向的对象类型
Person student = new Student();
-
编译时是Person变量,JVM会在栈中静态创建基本数据变量 and 引用数据变量的引用,获取的是Person的属性,调用的Student的方法。
-
在运行时才会在堆中创建Student内存,此时类型转换成Student。
静态代码块的特点
每一个类的静态代码块只会执行一次;静态代码块的执行优先于非静态代码块和构造器。
-
静态代码块同个main方法多次调用只会出现一次,且最先出现。
-
非静态代码块每次创建对象都会调用一次。
静态代码块 > 非静态代码块 > 构造器
-
静态→只看编译时
-
为什么构造器在非静态代码块后面运行?
2.包装类
包装类基础概念
装包的目的是使用只针对对象设计的API或新特性,对象是基本类型。
-
保证基本类型效率高不受影响,通过装包来体现新特性。
-
jdk1.5后能够自动装包、拆包。
序号 | 基本数据类型 | 包装类(java.lang包) |
---|---|---|
1 | byte | Byte |
2 | short | Short |
3 | int | Integer |
包装类.parse+基本数据类型大写/valueOf:
-
Integer.parseInt();将参数转换成Int基本类型
-
Integer.valueOf:将参数转换成Integer包装类型
包装类缓存对象
包装类 | 缓存对象 |
---|---|
Byte | -128~127 |
Short | -128~127 |
Integer | -128~127 |
Integer i = 128;
Integer j = 128;
System.out.println(i == j);//false
当值>127时,会自动在堆中创建新的内存存储,所以只用==比较地址会返回false。
-
要使用equals() 或 先转换成基本类型Integer.intValue()再使用==比较;
包装类对象不可变
包装类实例的不可变性,下面的 i 和 j 都属于基本数据类型,所以在方法参数传递中不会收到形参的影响;而c作为引用数据类型,其属性值被方法调用而改变,则会影响实参的变化。
public class TestExam {
public static void main(String[] args) {
int i = 1;
Integer j = new Integer(2);
Circle c = new Circle();
change(i,j,c);
System.out.println("i = " + i);//1
System.out.println("j = " + j);//2
System.out.println("c.radius = " + c.radius);//10.0
}
public static void change(int a ,Integer b,Circle c ){
a += 10;
// b += 10;//等价于 b = new Integer(b+10);
c.radius += 10;
/*c = new Circle();
c.radius+=10;*/
}
}
class Circle{
double radius;
}
3.其他知识
toString()
直接System.out.println(对象),默认会自动调用这个对象的toString();重写toString()方法,直接sout:对象即输出toString()