zoukankan      html  css  js  c++  java
  • 接口

    接口:

      1、引出接口:发现没有继承关系的类也能共享行为;

      2、接口是一种独立与类的新机制,它关注的是行为,设计上大仙有行为在多个没有继承关系的类之间共享,就把它抽取到接口中,而不是蟹岛父类中;

      3、1)定义接口——关键字interface;

    public interface Serviceable extends Changeable{
    	//属性---只能公共静态常量属性---就算不写这三个关键字,也是默认为这种情况
    	//这说明接口的关注点不在属性身上,而是在行为身上
    //	public static final int a = 100;               默认常量必须赋初值
    //	public static int b = 200;            三个关键字:public、static、final
    //	public int c = 300;
    //	int d = 400;
    //    说明接口的关注点不在属性身上,关注的是行为;  

          构造——接口不能有构造

           接口不能产生对象,而是申明对象;

           (1 让类实现接口,而且是多实现;

           (2 接口可以继承接口,而且是多继承;

          行为——只能是公共的抽象方法,就算不写修饰符,也是默认这种情况;说明接口的专注点和丰富度是体现在行为上的;接口的意义就体现在:让没有继承关系的类共享这些行为,各有各的具体实现;

        public abstract void turnupEnginee();
    
        void changeOil();
    

          在JDK1.7以上版本,允许接口拥有实现了的方法;

          但必须使用default关键字修饰;

            public default void test(){
    		
    	}  
    

        2)类实现接口:

          类实现接口:使用implements关键字,并且重写接口中的抽象方法,类可以多实现接口;

    public interface Changeable {
    	
    	public void changeOil();
    	
    }
    

          如果一个类实现一个接口,但不能实现它的所有抽象方法,那么这个类只能是抽象类;

    public abstract class NewCar implements Serviceable{
    
    }
    

          类在继承的同事可以做实现接口;

          类实现接口,必须重写接口中所有抽象方法,否则该类是抽象类;

        3)接口可以继承接口,多继承——尽量定义小接口(接口隔离原则);

      4、应用多态:

        接口的引用  指向  实现类的对象

    public class NewMerchanic {
    	
    	public void service(Serviceable ser){
    		ser.changeOil();
    		ser.turnupEnginee();
    		
    		if(ser instanceof Hock){
    			Hock h = (Hock)ser;
    			h.jiao();
    		}
    		
    		if(ser instanceof Fireable){
    			Fireable f = (Fireable)ser;
    			f.fire();
    		}
    	}
    	
    }
    
    public interface Serviceable extends Changeable,Turnupable{
    	
    }
    
    public interface Turnupable {
    	
    	public void turnupEnginee();
    	
    }
    
    public interface Changeable {
    	
    	public void changeOil();
    	
    }
    
    public interface Fireable {
    	
    	public void fire();
    }
    public class NewPlane implements Serviceable {
    
    	@Override
    	public void changeOil() {
    		// TODO Auto-generated method stub
    		System.out.println("我用的是航空机油");
    	}
    
    	@Override
    	public void turnupEnginee() {
    		// TODO Auto-generated method stub
    		System.out.println("有一个班的人为我调试引擎");
    	}
    	
    }
    
    public class Hock extends NewPlane implements Fireable{
    
    	@Override
    	public void fire() {
    		// TODO Auto-generated method stub
    		System.out.println("可以发射捣蛋");
    	}
    	
    	public void jiao(){
    		System.out.println("喔喔喔喔喔喔");
    	}
    
    }
    public class TestMain {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		Hock h = new Hock();//可以看到Hock本类引用指向的本类对象身上所有的属性,行为
    		
    		NewPlane np = new Hock();//只能看到NewPlane父类引用指向子类对象身上的属性、行为
    		
    		Serviceable ser = new Hock();//只能看到Serviceable接口提供的行为
    		
    		Fireable f = new Hock();//只能看到Fireable接口提供的行为
    		
    		NewMerchanic fox = new NewMerchanic();
    		fox.service(h);	
    	}
    }
    

        如果没有实现接口,就算有同样的方法,也不能用接口的引用区指向它的对象

      5、接口与抽象类的区别:

        相同特征:都不能被实例化,都位于继承的顶端,用于被其它类实现或者继承;

             都包含抽象方法,实现接口或者继承抽象类的子类都必须实现这些抽象方法;

        不同特征:接口中只能包含抽象类方法;抽象类中可以包含普通类方法;

             接口中不能定义静态方法;抽象类可以定义静态方法;

             接口只能定义静态常量属性、不能定义普通属性;抽象类既可以定义普通属性、也可以定义鼎泰常量属性;

             接口不包含构造器;抽象类中可以包含构造器(抽象类中的构造器不是用于创建对象,而是让子类调用这些构造器来完成属于抽象类的初始化工作);

             接口不包含初始化块;抽象类可以包含初始化块;

        语法:

    抽象类 接口
    abstract  class定义 instanceof  implements定义
    抽象方法必须写abstract 抽象方法可以不写abstract
    可以有变量属性,构造方法 不能有变量属性,只能是公共静态常量,不能有构造
    可以实现了的方法

    JDK1.7之前不能有实现的方法;

    JDK1.7之后可以有实现的方法,但必须有default关键字

        使用语法:

    用子类继承抽象类;extends(单继承) 用实现类 实现接口,instanceof;用子接口继承接口:extends(多继承)

        设计原则:一部分类,一部分写接口;

          例

          

    小结:

      接口是一个要被类实现的抽象方法集合,类用关键字implements实现接口;

      实现接口的类必须实现接口中定义的每个方法,否则类必须被声明为“abstract”;

      一个接口可以被用于暴露类的某些方法,也可以强制类包含某些方法;

      一个类可以包含成员变量,接口中默认访问修饰符: public, static, final;

      一个接口可以继承一个或多个接口;

      练习题:

    public interface Flyable{
        public void fly();
    }
    public class Bird implements Flyable{
        @Override
        public void fly(){
            System.out.println("鸟拍着翅膀飞.....“);
        }
    }
    public class SuperMan implements Flyable{
        @Override
        public void fly(){
            System.out.println("超人穿着内裤飞....");
        }
    }
    public class JetPlane implements Flyable{
        @Override
        public void fly() {
            System.out.println("飞机喷着气飞....");
        }
    }
    public class AirManager {
        public void manage ( Flyable flting ) {
            System.out.println("发现:");
            flying.fly();
            
            if ( flying instanceof Bird){
                System.out.println("马上召集人手打下来!");
            }eles if(flying instanceof JetPlane){
            System.out.println("发射导弹,打下来");
        }else if(flying instanceof SuperMan){
            System.out.println("老婆,出来看上帝!");
        }
        }
    }
  • 相关阅读:
    C# 动态添加用户控件
    临时记载C#中给DataGrid添加甘特图效果
    xp去掉快捷方式上的箭头
    wpf DataGrid的操作
    一路向前的算法
    WPF 解决WebBrowser控件汉字出现乱码的一种方案
    在CentOS 7 上安装 WordExpress
    创建Chrome插件
    开始PHP和JAVA
    failedtoloadcbsonextension
  • 原文地址:https://www.cnblogs.com/scxu28/p/6156306.html
Copyright © 2011-2022 走看看