• 继承与组合:


    如下代码,三个类,体会继承(inherit)与组合(composite)的魅力所在:

    继承:

    package Inherit;
    import static java.lang.System.*;
    class Animal{
    	private void beat(){
    		out.println("生命在于心脏跳动!");
    	}
    
    	public void breath(){
    		beat();
    		out.println("生命在于呼吸之间!");
    	}
    }
    
    class Birds extends Animal{
    	public void fly(){
    		out.println("生命在于自由飞翔!");
    	}
    }
    
    class Wolf extends Animal{
    	public void run(){
    		out.println("生命在于自由奔跑!");
    	}
    }
    
    public class InheritTest{
    	public static void main(String[] args){
    		Birds b=new Birds();
    		b.breath();
    		b.fly();
    
    		Wolf w=new Wolf();
    		w.breath();
    		w.run();
    	}
    }
    

    运行结果:

    组合:

    package Composite;
    import static java.lang.System.*;
    class Animal{
    	private void beat(){
    		out.println("生命在于心脏跳动!");
    	}
    	
    	public void breath(){
    		beat();
    		out.println("生命在于呼吸之间!");
    	}
    }
    
    class Birds{
    	private Animal a;
    	public Birds(Animal a){
    		this.a=a;
    	}
    	
    	public void breath(){
    		//-直接复用Animal类breath()方法来实现Birds类的breath()方法;
    		a.breath();
    	}
    	
    	public void fly(){
    		out.println("生命在于自由飞翔!");
    	}
    }
    
    class Wolf{
    	private Animal a;
    	public Wolf(Animal a){
    		this.a=a;
    	}
    	
    	public void breath(){
    		//-直接复用Animal类breath()方法来实现Wolf类的breath()方法;
    		a.breath();
    	}
    	
    	public void run(){
    		out.println("生命在于自由奔跑!");
    	}
    }
    
    public class CompositeTest{
    	public static void main(String[] args){
    		Animal a=new Animal();
    
    		Birds b=new Birds(a);
    		b.breath();
    		b.fly();
    
    		Wolf w=new Wolf(a);
    		w.breath();
    		w.run();
    	}
    }
    

    运行结果:

    总结:

    1、继承,是实现类复用的重要手段,但带来了最大的一个坏处:破坏封装

    2、组合,也是实现类复用的重要方式,而且能提供更好的封装性

    何时用继承?组合?

    1、继承:对已有的类做一番改造,以此获得一个特殊的版本,继承表达的是一种“是(is-a)”的关系

    2、组合:两个类之间有明确的整体、部分的关系,组合表达的是一种“有(has-a)”的关系

    不管是用继承还是组合,对系统的开销来说没有本质的区别!!!

  • 相关阅读:
    深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis
    深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
    Elasticsearch 评分score计算中的Boost 和 queryNorm
    Docker 镜像构建的时候,应该小心的坑
    怎么给kibana加上权限?
    网站异常了,日志要怎么看?
    使用 Gradle 配置java项目
    Cassandra 类型转换限制
    Elasticsearch 排序插件的开发
    ElasticSearch 2.0以后的改动导致旧的资料和书籍需要订正的部分
  • 原文地址:https://www.cnblogs.com/baby-zhude/p/8045143.html
Copyright © 2020-2023  润新知