记录自己的Java学习过程,第一篇为基础篇,非全部基础知识,以需要注意的点为主。
一、基础tips
1、float赋值方式可用:
float f1 = 1.2f;//错误
float f2 = 1;
float f3 = 0xAE;
float类型赋值需要加f,不加默认为double,第一种若不加f会报错(double类型可省略d);可以从整数直接转为float,故可以用第2、3钟。
2、在Java中,参数传递方式是按值/指针传递,调用函数时拷贝,不影响实参的值。
3、i++在表达式中用旧值计算,表达式结束后+1;++i会先+1,在表达式中用新值计算。
4、Java中每个类都可以有一个main方法,但是只有在作为程序的入口点时才会被执行。当创建一个类的对象时,并不会再次执行该类的main方法。
5、interface中的方法默认是public的,不能降低访问权限;interface中的方法默认是abstract的,不能有方法体。
二、循环语句
if 。。。
if 。。。
else。。。
每个else会和最近的if语句连接,而与排版无关,因此else对应第二个if;写if...else最好采用大括号。
三、类和对象
1、Class1 class1 = new Class1;
对象需要用new操作初始化,否则它的值是null,会出现NullPointerException。
2、当类没有显示的构造函数时,编译器会自动添加一个无参的构造函数;
而当类里面有带形参的构造函数时,编译器不会自动添加无参的构造函数,此时
Class obj1 = new Class();
上述语句找不到相应的构造函数,会报错,应添加形参。
3、子类构造函数无super函数时,第一句话默认调用父类的无参构造函数(隐式super函数);
父类没有无参构造函数时,子类构造函数必须显式调用父类的有参构造函数。
4、子类可转为父类,父类不可转为子类;
子类转为父类后,调用普通方法依然是子类方法;
无继承关系时不可以转换。
5、方法中的临时变量是没有初始化的,在使用之前必须初始化;
但类成员变量默认是有初始值的,其初始值为null。
四、static、final和常量设计
1、static和final关键字
static 表示全局的 or 静态的
static变量 | 可通过类访问,不从属于任何对象,可用对象访问但不建议;所有对象的该变量共享一个存储空间 |
static方法 | 可通过类引用;只能使用静态变量和静态方法 |
static块 | 只在类被第一次加载时调用一次(static块 > 匿名块 > 构造函数,后两者在创建时调用) |
final 表示最终的,不可变的
final变量 | 相当于常量,基本类型不能修改值,对象类型不能修改指针 |
final方法 | 不能被子类重写 |
final类 | 不能被继承 |
static final 同时具有两种特征
static final变量 | 表示一旦赋值不可以修改,并且可以用类直接访问 or 调用 |
static final方法 | 表示不可覆盖,并且可以通过类直接访问 or 调用 |
ps:
接口内定义的变量默认为常量,无法修改,即public static final,若显式修改为其他(如private)则无法通过编译。
2、常量池
Java为很多基本类型的包装类(注意是包装类不是基本类型)和字符串都建立常量池。
常量池:相同的值只存储一份(范围内,除String),节省内存,共享访问
Boolean | true、false |
Byte | -128~127 |
Character | 0~127 |
Short、Integer、Long | -128~127 |
Float、Double | 没有常量池 |
String | 只要值相等,就指向同一个内存空间 |
常量式赋值创建,放在栈内存,会被常量化;
new对象创建,放在堆内存,不会被常量化。
ps:
- 两个对象进行比较时,会比较其地址
- 基本类型和包装类对象进行比较,会使对象自动拆箱为基本类型进行比较。
- 字符串“+”运算时,编译器自动优化为一个字符串,但其中涉及变量/new对象时不会自动优化。
- 字符串用“==”比较时比较的是指针,比较内容要用equals方法。
3、不可变对象(immutable对象)
- 所有属性都是final和private的;
- 不提供setter方法;
- 类是final的,或者所有方法都是final;
- 若需要改变,请clone/new一个对象进行修改;
- 如果类中包含可变对象(mutable对象),那么返回拷贝需要深度clone。
优点:只读,线程安全;并发读,提高性能;可以重复使用。
缺点:制造变量垃圾,浪费空间。
对不可变对象进行修改时,会开辟新的空间,旧对象被搁置,直到垃圾回收。
4、字符串
String对象是不可变对象,需要大量修改拼接等操作时可使用StringBuffer / StringBuilder类的append方法修改来提高效率。
- StringBuffer / StringBuilder的对象都是可变对象。
- StringBuffer(同步,线程安全,修改快速);StringBuilder(不同步,线程不安全,修改更快)
- 字符串append操作速度:StringBuilder > StringBuffer > String