Open chenshuaiyu opened 6 years ago
1.为什么有了接口还要是使用抽象类?
抽象类:
可以有构造方法
变量 四个权限都可有
方法 四个权限都可有
接口:
方法 public abstract
变量 public static final
java8 新增default和static方法
java9 新增private方法(在java9之前,变量和方法都只能为public)
接口并不能完全取代抽象类,接口中不能有构造方法,也不能有private变量。可有实例方法,但不可有实例变量。
接口默认方法的优点:可以在其他类实现时免于复写其方法,减少代码量。
2.设计模式
工厂设计模式:
Product:(产品类接口) 用于规范产品 ConcreteProduct:(具体产品类) 作为具体产品类 Factory:(工厂类接口) 用于与管理者进行交互 ConcreteFactory:(具体工厂类) 用于生产产品 产品类接口
public interface Product {
void show();
}
工厂类接口
public interface Factory {
Product createProduct();
}
具体产品类
public class ConcreteProduct implements Product {
@Override
public void show() {
System.out.println("This is a concreteproduct.");
}
}
具体工厂类
public class ConcreteFactory implements Factory {
@Override
public Product createProduct() {
return new ConcreteProduct();
}
}
测试类
public class FactoryTest {
public static void main(String[] args) {
Factory factory=new ConcreteFactory();
Product product=factory.createProduct();
product.show();
}
}
测试结果
This is a concreteproduct.
当产品种类繁多的时候,会出现很多具体工厂类,导致代码冗余。运用反射可以很好的解决这个问题。这时,需要对工厂类接口进行修改。
工厂类接口
public interface Factory2 {
<T extends Product> T createProduct(Class<T> t);
}
具体工厂类
public class ConcreteFactory2 implements Factory2 {
//反射暂时未学习,只是初步了解
@Override
public <T extends Product> T createProduct(Class<T> t) {
Product product=null;
try{
product = (Product) Class.forName(t.getName()).newInstance();
}catch(Exception e){
e.printStackTrace();
}
return (T) product;
}
}
通过反射,只要将具体产品类的类名传入,即可获得相应实例。
测试类
public class FactoryTest2 {
public static void main(String[] args) {
Factory2 factory=new ConcreteFactory2();
Product product=factory.createProduct(ConcreteProduct.class);
product.show();
Product product2=factory.createProduct(ConcreteProduct2.class);
product2.show();
}
}
测试结果 This is a concreteproduct. This is a concreteproduct2.
public class Test {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("java01");
list.add("java02");
list.add("java03");
list.add("java04");
list.add("java05");
list.add("java06");
list.add("java07");
list.add("java08");
list.add("java09");
list.add("java10");
//fori
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//foreach
for (String s: list) {
System.out.println(s);
}
//Iterator
Iterator<String> iterator=list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
//Stream
list.stream().forEach(s -> System.out.println(s));
list.stream().forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
}
}
测试结果 java01 java02 java03 java04 java05 java06 java07 java08 java09 java10