java面向对象-接口与抽象类

java面向对象-接口与抽象类,第1张

java面向对象-接口与抽象类 java面向对象-抽象类和接口

1.抽象类与抽象方法

2.接口

3.接口的注意事项

4.抽象类VS接口

5.面向对象设计原则

1、抽象类与抽象方法

1.1语法

 

1.2抽象类VS普通类

  • 抽象类不能被实例化

    • 但是可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例

  • 普通类可以被实例化

1.3抽象方法VS普通方法

  • 有无方法体

1.4抽象类与抽象方法的使用

  • 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。

  • 如果子类没有实现父类的抽象方法,子类必须被定义为抽象类

  • 没有抽象构造方法,也没有抽象静态方法

  • 抽象类中可以有非抽象的构造方法,创建子类实力时可调用

2.接口

2.1语法

 

2.2接口特性

  • 常作为类型使用

  • 接口不可以被实例化

  • 实现类必须实现接口的所有方法

  • 实现类可以实现多个接口

    • implements ,多个接口使用逗号隔开

  • 接口中的变量都是静态常亮(public static final)

2.3示例:认识接口

  • "锁"接口



public interface Lock{
    // 属性(成员),接口属性用的很少
    // 接口属性默认静态常亮 
    // public static final String name = "老王"
    String name = "老王";
    
    // public abstract void onLock();
    void onLock();
     
    
    void unLock();
}
  • "防风"接口



 public interface Defend{
 	
 	 void defend();
 }
  • "窗口"类


public class Window implements Lock,Defend{
	
	@Override
	public void onLock(){
		System.out.println("窗户上锁")
	}
	
	@Override
	public void unLock(){
		System.out.println("窗户解锁")
	}
	
	@Override
	public void defend(){
		System.out.println("窗户防风")
	}
}
  • 测试类

public class Test{

	public static void main(String[] args){
		// 让程序更好去使用多态
		// 找到一个有上锁能力的对象
		Lock lock = new Window();
		lock.onLock();
	}
}

2.4 接口表示一种能力

  • "做这项工作需要一个钳工(木工/程序员)"

    • 钳工是一种能力,不管是这个人是谁

  • 接口是一种能力

    • 体现在接口的方法上

  • 面向接口编程

    • 程序设计时

      • 关心实现类有何能力,而不关心细节

      • 面向接口的约定而不考虑接口的具体实现

2.5 示例:防盗门

面向接口编程描述防盗门。防盗门是一个门。is a 的关系;防盗门有一个"锁"的能力has a 的关系

  • "门"抽象类

    
    public abstract class Door{
        // 门的特征
        
    	public abstract void open();
        
      	public abstract void close();
    }
  • 防盗门类

    public class TheftproofDoor extends Door implements Lock{
        // 继承门的能力
        @Override
        public void open(){
        	System.out.println("防盗门打开了")
        }
        
        @Override 
        public void close(){
            System.out.println("防盗门关闭了")
        }
        
        @Override
        public void onLock(){
            System.out.println("防盗门上锁")
        }
        
        @Override 
        public void unLock(){
            System.out.println("防盗门解锁")
        }
    }
  • 测试类

    public class Test{
        public static void main(String[] args){
            // 程序里需要一个带锁的对象
            // 假如某一天,防盗门、窗口的锁功能不能满足实现的需求(功能升级)
            // 升级为手机解锁的能力
            // 使用接口不影响原来的继承关系,也可以实现多继承功能
            Lock lock = new TheftproofDoor();
           	lock.onLock();
        }
    }

2.6 接口是一种约定

  • 接口是一种约定,有些接口只有名称

  • 面向接口编程,程序设计时面向接口的约定而不考虑具体实现

2.7 示例:打印机

  • 使用面向接口编程,描述打印机

    
public interface InkBox{
	
    String getColor();
}
  • 彩色墨盒类

   
public class ColorInkBox implements InkBox {
    @Override 
    public String getColor() {
        return "彩色";
    }
}
  • 黑白墨盒类


public class GrayInkBox implements InkBox {
    @Override 
    public String getColor() {
        return "黑白"; 
    }
}
  • 纸张接口


public interface Paper{
    
    String getSize();
}
  • A4纸张类


public class A4Paper implelement Paper{
    @Override
    public String getSize(){
        return "A4"
    }
} 
  • A3纸张类


public class A3Paper implelement Paper{
    @Override
    public String getSize(){
        return "A3"
    }
}
  • 打印机类

public class Printer{
	// 不确定墨盒和纸张的厂商,只要符合打印机的墨盒和纸张的"规格"就打印
	// 约定"规格"
	
	// 墨盒定义为接口
	private InkBox inkBox;
	// 纸张定义为接口
	Private Paper paper;
	public InkBox getInkBox(){
		return InkBox;
	}
    public void setInkBox(InkBox inkBox){
        this.inkBox = inkBox;
    }
    public Paper getPaper(){
        return paper;
    }
    public void setPaper(Paper paper){
        this.paper = paper;
    }
    
    // 打印方法
    
    public void print(){
        System.out.println("打印的颜色为:"+inkBox.getColor() + ",打印纸张的大小为:"+paper.getSize())
    }
}
  • 测试类

public class Test{
    
    public static void main(String[] args){
        Printer printer = new Printer();
        // 打印前先要有纸张和墨盒
        printer.setInkBox(new GrayInkBox)
    	printer.setPaper(new A4Paper)
    	printer.print();
    }
}

3.接口的注意事项


  • 接口中的成员变量

    • 默认都是public static final 的,必须显示初始化;

  • 接口中的方法

    • 默认都是public abstract 的;

  • 接口没有构造方法,不能被实例化

  • 一个接口不能实现另一个接口,但可以继承其他多个接口

  • 一个类必须实现接口的所有抽象方法,除非这个类是抽象类

4.抽象类vs接口


  • 相同点

    • 代表系统的抽象层

    • 都不能被实例化

    • 都包含抽象方法

      • 用于描述系统提供的服务,不必提供具体实现

  • 不同点

    • 在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法

      • 抽象类便于复用,接口便于代码维护

    • 一个类只能继承一个父类,但可以实现多个接口

  • 使用原则

    • 接口做系统与外界交互的窗口

      • 接口提供服务

    • 接口本身一旦制定,就不能随意更改

    • 抽象类可以完成部分功能的实现,还有部分功能可作为系统的扩展点

5.面向对象设计原则


  • 多用组合,少用继承

  • 针对接口编程

  • 针对扩展开放,战队改变关闭

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5607619.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存