接口 抽象类 内部类
抽象类: 关键字 abstract
1.抽象类中可以没有抽象方法
2.有抽象方法的类必定是抽象类
抽象类中能否有构造方法?
可以存在构造方法 但是不能new出抽象类的对象
抽象类中可以有抽象方法,也可以有普通方法。(抽象方法是没有方法体的)
抽象类的子类必须实现父类中的抽象方法
抽象类 体现的是模板策略
父类不能实现的功能给子类去实现
抽象类能否继承抽象类?
能,子类直接继承了父类的抽象方法。
接口: 关键字 interface
接口可以看作一个更纯粹的抽象类
接口中只能出现: 属性 方法
属性: 默认是一个常量 前面默认加上 public static final
方法: 出现的只能是抽象方法 前面默认加上 public abstract
接口的实现: 关键字 implements
接口能被继承 接口可以继承接口
接口可以继承多个接口吗?
接口之间能多继承 而java中继承是单继承的
类能否实现多个接口?
可以。
面试题: java是单继承还是多继承?
java是单继承的 但是java中的接口是多继承的
接口是定义规范的 只说明做什么 没说明怎么做。
抽象类 接口:
相同点:
1.都可以定义抽象方法(public abstract) 常量(public static final)
2.都不可以手动得创建对象
不同点:
1.抽象类中既可以有普通的方法,又可以有抽象方法 接口中只可以有抽象方法
2.抽象类中变量既可以有普通的变量,又可以有常量 接口中只可以有常量
3.抽象类中可以有构造方法 接口中不可以有构造方法
4.抽象类只能继承一个抽象类 接口可以继承多个接口
5.普通的类只能单继承抽象类 普通接口可以多实现接口
抽象类 接口如何选择?
抽象类体现模板策略 就是父类没实现的功能交给子类去实现
接口定义规范 当前接口的实现类要完成什么功能
设计模式:
工厂设计模式:
接口 实现类 工厂类(获得接口的实现类)
public interface Sender { void send(); }
public class EmailSender implements Sender{ @Override public void send() { // TODO Auto-generated method stub System.out.println("发送邮件"); } }
public class SmsSender implements Sender{ @Override public void send() { // TODO Auto-generated method stub System.out.println("发送消息"); } }
public class SenderFactory { public static Sender produce(String type){ if("email".equals(type)){ return new EmailSender(); }else if("sms".equals(type)){ return new SmsSender(); }else{ return null; } } }
内部类:
内部类的实例化:A a=new OutClass().new A()
内部类可以使用外部类的属性
内部类可以调用外部类的方法
内部类可以和外部类同级同包的类同名 但是不能和外部类同名
外部类不能访问内部类的成员
非静态内部类不能定义static修饰的成员 静态的内部类可以定义
类怎么继承内部类?
要手动调用外部类的super()方法 (基本不会用到)
public class B extends OutClass.A{ public B(OutClass out){ out.super(); } }
局部内部类: 在方法中的类 (了解) 不能被static修饰
匿名内部类: 没有名字的类 只能使用一次
匿名内部类和它所在的方法同级 所以不能调用方法的局部变量 能调用final修饰的局部变量
final修饰的变量在编译期间就有效了