学习完JavaSE,25天的学习,再去复习一遍的时候,发现有些东西已经搞忘了,整理了一下,(可能不是那么常用的知识点,所以才搞忘了,也可能是记性不好,哈哈),便于复习:
1、
short s = 1;
s = s + 1;
这段代码是会在编译阶段报错的,进行+运算,先把s转化为int类型再进行运算,所以s+1得到的事一个int类型的额数据,不能直接赋值给s;
正确的写法:
short s = 1;
s += 1;
+=这个运算其实内含了一个强制类型转换机制,所以不会报错!
2、逻辑运算符中的"^" 这个运算符叫逻辑异或,它的两边的布尔值相同返回false,不同返回true;
3、实现两个整数交换最简单的方式:
int a = 10;
int b = 20;
b = (a + b) - (a = b);
最有效率的实现2乘以8的结果的语句:
2 << 3;
4、静态代码块,构造代码块和静态方法 的执行顺序:
最先执行的事静态代码块,只会执行一次;
其次是构造代码块,每次调用构造方法都会执行;
最后是构造方法;
5、继承中构造方法的关系:
5_1. 子类中所有的构造方法默认都会去访问父类中的无参构造方法,即其实子类的每一个构造方法的第一句,默认情况下都是super();
5_2. 如果父类没有无参构造方法,那么子类的构造方法就会报错,解决办法有两种,自一种是给负累添加一个无参构造方法,第二种是用super(…)里面传上参数进行访问父类的带参构造方法;
5_3. 需要注意的是,子类一定要去访问父类的构造方法,否则会报错,而且super或者是this必须出现在构造方法的第一条语句上,否则可能对父类的数据多次初始化;
6、继承中,方法重写时,需要注意:父类的私有方法不能被重写;子类重写父类的方法时,访问权限不能更低;父类是静态方法,子类重写时也必须是静态方法;
7、final修饰的变量赋值必须在构造方法执行完之前,即可以再静态代码块,构造代码块或者构造方法中进行初始化;
8、多态的三个前提:要有继承关系;要有方法重写(其实没有也是可以的,只是没有方法重写的话,多态的存在就没有意义了);要有父类引用指向子类对象;
9、接口的成员变量只能是静态的,而且必须是常量,即用final修饰的:
public interface IntTest {
int i = 10;
}
这样写是不会报错的,因为默认会加上修饰符: public static final
所以,照下面这样写就会报错了:
public interface IntTest {
int i = 10;
i = 20;
}
因为值是final修饰的,不能去修改;
同样的道理,接口中的方法也会默认家还是那个修饰符public abstract
10、注意,接口与接口之间是可以有多继承的,类和接口之间也可以多实现;
11、问:类能用static修饰吗?
答:成员内部类可以用static修饰,可以便于数据的访问;没有用static修饰的成员内部类的创建对象的方式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
而用static修饰后,创建对象的方式可以:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
12、局部内部类可以直接访问外部类的成员,但是局部内部类要想访问局部变量,则局部变量必须是final的;因为局部变量会随着方法的调用完毕而消失,但是局部内部类的对象不一定会马上消失,所以它要继续用局部变量!
13、类的加载顺序:
父类的静态成员变量->父类的静态代码块->子类的静态成员变量->子类的静态代码块->父类非静态成员变量->父类构造代码块->父类的构造方法->子类的非静态成员变量->子类的构造代码块->子类的构造方法。
14、"=="和equals的区别:
前者可以用来比较基本类型数据或者是引用类型数据,后者只能比较引用类型数据;前者在比较基本类型数据时比较的是值是否相等;
二者在比较引用数据类型时,默认都是比较地址值是否相同,但是equals可以通过重写让它去边角值是否相同!
15、BigInteger可以让超出Integer范围内的数据进行运算,构造方法:
成员方法有加减乘除(add(BigInteger i),subtract(BigInteger i),multiply(BigInteger i),divide(BigInteger i))等
相同的还有BigDecimal,是不可变的,任意精度的浮点数表示。
16、Calendar是一个抽象类,它逐渐代替了Date,实例化代码:
Calendar c = Calendar.getInstance();
会返回一个子类对象(多态);
应用:
//返回年
c.get(Calendar.YEAR);
//返回月-1
c.get(Calendar.MONTH);
//返回日
c.get(Calendar.DATE);
//返回时
c.get(Calendar.HOUR);
//返回分
c.get(Calendar.MINUTE);
//返回秒
c.get(Calendar.SECOND);
还可以用add(int field,int amount),set(int year,int month,int date)等方法。注意month是0-11的;
17、泛型类的定义格式:
public class xxx<T>{...}
泛型方法的定义格式:
public (static) <T> int method(T t,int i){...}
泛型接口的定义格式:
public interface IntTest<T> {
泛型接口的实现类:
第一种,已知是什么类型:
public class Demo2 implements IntTest<Integer> {}
第二种,未知是什么类型:
public class Demo2<T> implements IntTest<T> {}
注意:泛型只能是引用类型;
18、把数组转化为List集合,用Arrays类中的一个方法:
public static List asList(T…t);
返回后的List不支持增删,只支持修改。即set(int index,Object o)方法!
19、HashSet保证元素唯一性的原理:
HashSet的底层其实是由HashMap实现的,它的add()方法依赖两个方法:hashCode()和equals(),步骤:
a、比较哈希值;如果不同,就直接存入元素;
b、如果哈希值相同,就用比较equals()来比较;
c、如果不相同,就存入,还相同就不存了!
注:String类是重写了hashCode()和equals()方法的!