一、在接口中实现方法
二、几种关键字的区别
作用域 | 当前类 | 同一包内 | 子孙类(不同包) | 其他包 |
---|
public | T | T | T | T |
protected | T | T | T | F |
default | T | T | F | F |
private | T | F | F | F |
三、Overload和Overwrite
区分Overload和Overwrite
- 前者是不同的signature,后者是相同的signature
- Overload在编译时决定,Overwrite在运行时决定
- 例子:
class Animal {
public void eat() {}
}
class Horse extends Animal {
public void eat(String food) {}
}
class UseAnimals {
public void doStuff(Animal a) {
System.out.println("Animal");
}
public void doStuff(Horse h) {
System.out.println("Horse");
}
}
public class Main {
public static void main(String[] args) {
UseAnimals ua = new UseAnimals();
Animal animalobj = new Animal();
Horse horseobj = new Horse();
Animal animalRefToHorse = new Horse();
ua.doStuff(animalobj);
ua.doStuff(horseobj);
ua.doStuff(animalRefToHorse);
}
}
四、泛型,通配符
泛型的性质
- 运行时,泛型消失。所以不能使用instanceof
上界通配符 <? extends E>
static int countLegs (List<? extends Animal > animals ) {
int retVal = 0;
for ( Animal animal : animals )
{
retVal += animal.countLegs();
}
return retVal;
}
static int countLegs1 (List< Animal > animals ){
int retVal = 0;
for ( Animal animal : animals )
{
retVal += animal.countLegs();
}
return retVal;
}
public static void main(String[] args) {
List<Dog> dogs = new ArrayList<>();
countLegs( dogs );
countLegs1(dogs);
}
下界通配符 <? super E>
private <T> void test(List<? super T> dst, List<T> src){
for (T t : src) {
dst.add(t);
}
}
List<Dog> dogs = new ArrayList<>();
List<Animal> animals = new ArrayList<>();
test(animals,dogs);
?和 T 的区别
public <T extends Number> void test(List<T> dest, List<T> src)
public void test(List<? extends Number> dest, List<? extends Number> src)
五、如何设计immutable类型
- Don’t provide any mutators
- Ensure that no methods may be overridden
- Make all fields final
- Make all fields private
- Ensure security of any mutable components (avoid rep exposure)
- Implement toString(), hashCode(), clone(), equals(), etc.