目录
1. final关键字
- final修饰类:表示此类不能被继承,即此类不能存在子类。
- final修饰方法:父类中方法用final修饰,子类不能重写此方法,父类和子类中可存在相同的方法,但是不是重写来的,子类中与父类相同的方法只隶属于子类,与父类无关。
- final修饰变量:被final修饰的变量值不能改变。
2. Java的封装类型(引用类型)
这也体现了Java中一切皆对象的原则,基本数据类型封装成封装类型,就相当封装成了一个对象,就具有了方法和属性,使我们更好的处理所需的数据。
基本类型 vs 封装类型
Java封装类型与基本类型相比,有如下区别:
- 从参数传递上来说,基本类型只能按值传递,而每个封装类都是按引用传递的;
- 从存储的位置上来说,基本类型是存储在栈中的,而所有的对象都是在堆上创建和存储的,所以基本类型的存取速度要快于在堆中的封装类型的实例对象;JDK5.0开始可以自动封包了 ,也就是基本数据可以自动封装成封装类,基本数据类型的好处就是速度快(不涉及到对象的构造和回收),封装类的目的主要是更好的处理数据之间的转换,方法很多,用起来也方便。
- 基本类型的优势是:数据存储相对简单,运算效率比较高;
- 封装类型的优势是:类型转换的api更好用了,比如Integer.parseInt(*)等的,每个封装类型都提供了parseXXX方法和toString方法。而且在集合当中,也只能使用封装类型。封装类型满足了Java中一切皆对象的原则。
3. Java多线程
同步是害怕在操作过程的时候被其他线程也进行读取操作,一旦是原子性的操作就不会发生这种情况。
因为一步到位的操作,其他线程不可能在中间干涉。另外三项都有读取、操作两个步骤,而X=1则是原子性操作。
4. 列表和集合
List 有序值 可重复 允许为null
Set 无序 值不可重复 可为null(至多只能有一个空元素)
Map
5. 取模取余符号问题
当x和y的正负相同时,取余和取模符号和xy一致;
当x和y的正负不同时,取余结果的符号和x相同,取模结果的符号和y相同。(口诀:取余取头,取模取尾)
6. 关于字符串的问题
1. 字符串储存地址问题
String b ="b";
// System.out.println(a==b);
String string1 = new String("a");
String a =string1.intern();//检查字符串中是否有a,存在的话就返回常量池中的字符串,不存在的话就会把字符串加到常量池中,并返回他的引用
System.out.println(string1==a);
System.out.println(a.hashCode());//97
System.out.println(string1.hashCode());//97
System.out.println(System.identityHashCode(a));//856419764
System.out.println(System.identityHashCode(string1));//621009875
System.out.println("加入常量池中");
String c="a";
System.out.println(a==c);//true
System.out.println(System.identityHashCode(c));//856419764这个和上面啊的地址一样说明,常量池中已经存在”a“这个字符串了
2. 字符串拼接问题
常量相加
一开始“abc“是没有的,常量池中存在”a” “bc”,相加之后,将这两个字符串拼接“abc” 然后放入常量池中,此时常量池中有三个字符串“a”“bc”“abc”
String a = "a"; String b ="bc"; String c ="a"+"bc"; String d="abc"; |
变量相加
变量相加
String a="a";
String b="b";
String c=a+b;//现在堆中开辟新的空间用来拼接这两个字符串,在堆中存在字符串“ab”,并把它放到常量池中;
String i=c.intern();//ba地址指向常量池中
String d="ab";//这个"ab"是前面a和b拼接来的
System.out.println(i==d);//true
java是从左向右输出的,
1.先出现字符串,后面的内容就会一律转为字符串来拼接所以是is 1005
2. 先出现数字类型,先按数字类型相加,再拼接字符串
3. 括号的优先级高,先计算括号里的数字类型
7. Java的加载顺序
父类的静态代码块
子类的静态代码块
父类非静态代码块
父类构造函数
子类的非静态代码块
子类构造函数
class Father {
{
System.out.println("父类非静态代码块");
}
static
{
System.out.println("父类的静态代码块");
}
public Father(){
System.out.println("父类构造函数");
}
}
class Son extends Father{
{
System.out.println("子类的非静态代码块");
}
static
{
System.out.println("子类的静态代码块");
}
public Son(){
System.out.println("子类构造函数");
}
/**
* 父类的静态代码块
* 子类的静态代码块
* 父类非静态代码块
* 父类构造函数
* 子类的非静态代码块
* 子类构造函数
* @param args
*/
public static void main(String[] args) {
Son son = new Son();
}
}
8. 异常
在java的try catch finally中finally中的代码是一定会执行的,所以try 中的return会被finally中的return覆盖,在下面的情况下,return才不会改变
如果finally中没有返回值,那么结果还是try中的返回值
9. 继承声明
public A foo(){return A;} 方法名相同,返回值相同,返回值A没有定义,会报错