Java基础梳理(二)

Static

static变量只依赖于类实现(通过类即可访问),不依赖对象实例存在。
所有对象的实例,都共享存储在一个共同的空间(栈)。

static方法

静态方法也无需通过对象来引用,而通过类名可以直接引用。
在静态方法中,只能使用静态变量,不能使用非静态变量。
静态方法禁止引用非静态方法。

static修饰内部类

将一个类定义在另一个给类里面或者方法里面,这样的类就被称为内部类。
内部类可以分为四种:成员内部类、局部内部类、匿名内部类、静态内部类。

静态内部类和成员内部类相比多了一个static修饰符。它与类的静态成员变量一般,是不依赖于外部类的。同时静态内部类也有它的特殊性。因为外部类加载时只会加载静态域,所以静态内部类不能使用外部类的非静态变量与方法。
同时可以知道成员内部类里面是不能含静态属性或方法的。

静态代码块

只在类第一次被加载时调用。
换句话说,在程序运行期间,这段代码只运行一次。
执行顺序:静态代码块>匿名块>构造函数。

Final

Java的final关键字同样可以用来修饰

方法
字段

final的类,不能被继承。
父类中如果有final的方法,子类中不能改写此方法。

final修饰的变量,不能被再次赋值。
如果是基本类型的变量,不能修改其值,如果是对象实例,那么不能修改其指针,但可以修改对象内部的值。

常量设计和常量池

常量:一种不会修改的变量

Java没有constant关键字
不能修改,final
不会修改/只读/只要一份,static
方便访问public

Java中的常量基本上使用public static final来修饰
建议变量名称全部大写,以下划线相连。

一种特殊的常量:接口内定义的变量默认是常量。

常量池

Java为很多基本类型的包装类/字符串都建立常量池。

常量池:相同的值只存储一份,节约内存,共享访问。

基本类型的包装类:
Boolean,Byte,Short,Integer,Long,Character,Float,Double
其中Float和Double没有缓存(常量池)

创建方式

基本类型的包装类和字符串有两种创建方式

常量式

赋值创建,放在栈内存(将被常量化)

 Integer a = 10;
 String b = "abc";

new对象

new对象进行创建,放在堆内存(不会常量化)

 Integer c = new Integer(10);
 String d = new String("abc");

这两种创建方式导致创建的对象存放的位置不同。

基本类型和包装类比较,将对包装类自动拆箱
对象比较,比较地址
加法+会自动拆箱

常量赋值(栈内存)和new对象创建(堆内存)不是同一个对象。
编译器只会优化确定的字符串并缓存。

不可变对象和字符串

不可变对象(Immutable Object)

一旦创建,这个对象(状态/值)不能被修改了
其内在的成员变量的值就不能修改了
典型的不可变对象包括八个基本类型的包装类对象,String,BigInteger和BigDecimal等对象。

String a = new String("abc");
String b = a;
System.out.print(b);
a = "def";
System.out.println(b);
public static void change(String b){
	b = "def"
}
a = new String("abc");
change(a);
System.out.println(a);

不可变对象,也是传指针(引用)
由于不可变,临时变量指向新内存,外部实参的指针不改动。

如何创建不可变对象

immutable对象是不可改变,只能clone/new一个对象进行修改。
所有的属性都是final和private的
不提供setter方法
类是final的,或者所有的方法都是final
类中包含mutable对象,那么返回拷贝需要深度clone

不可变对象的优点

只读,线程安全
并发读,提高性能
可以重复使用

不可变对象的缺点

制造垃圾,浪费空间。

Java字符串

字符串是Java使用最多的类,是一种典型的不可变对象。
String定义有2种

	String a = "abc";//常量赋值,栈分配内存
	String b = new String("abc");//new 对象,堆分配内存

字符串内容比较:equals方法
是否指向同一个对象:指针比较==

Java常量池

保存在编译期间就已经确定的数据
是一块特殊的内存
相同的常量字符串只存储一份,节省内存,共享访问

字符串的加法

String a = “abc”;
a= a+“def”;//由于String不可修改,效率差
使用StringBuffer/StringBuilder类的append方法进行修改
StringBuffer/StringBuilder的对象都是可变对象
StringBuffer(同步,线程安全,修改快速)
StringBuilder(不同步,线程不安全,修改更快)

发布了17 篇原创文章 · 获赞 9 · 访问量 1629

猜你喜欢

转载自blog.csdn.net/weixin_44666188/article/details/102648522