接口 抽象类 内部类

抽象类:  关键字   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修饰的变量在编译期间就有效了

posted on 2016-08-20 19:04  cch_java  阅读(144)  评论(0编辑  收藏  举报

导航