我们知道java语言有三大特性:封装,继承,多态

但是继承和封装却是一对有点矛盾的两个方面,怎么理解??

我们想想:封装的目的是想让隐藏类中的属性和方法。但是在继承过程中,我们的子类肯定会继承父类的方法和字段,而且我们还可以覆盖父类的方法

着就有一点破坏封装 要隐藏类属性的目的了!虽然我们可以同过声明变量和方法是private来避免类的属性和方法被继承,

但是如果属性和方法都使用private不让子类继承,那么三大特性之一继承不就是没有意义了吗???

我们还是看看继承在java中时怎么实现的

public class Test {

	/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Bird bird=new Bird();
bird.beat();
bird.breath();
bird.fly(); Wolf wolf=new Wolf();
wolf.beat();
wolf.breath();
wolf.run();
} }
//Bird和Wolf类的父类
class Animal
{
public void beat()
{
System.out.println("心脏跳动");
}
public void breath()
{
System.out.println("努力呼吸");
}
}
//继承自Animal类
class Bird extends Animal
{
public void fly()
{
System.out.println("鸟儿飞啊飞");
}
public void beat()
{
System.out.println("bird is beating");
}
} //继承自Animal类
class Wolf extends Animal
{
public void run()
{
System.out.println("跑啊跑");
}
//子类覆盖了父类的方法
public void breath()
{
System.out.println("wolf is breathing");
}
}

在上面的继承例子中,我们看到了父类的方法被子类覆盖,这种继承对类的封装是不利的!

为了提高类的封装,我们提出组合,组合是通过将原先的父类的方法和属性跟子类重新组合成一个新的类型!

class Animal
{
public void beat()
{
System.out.println("心脏跳动");
}
public void breath()
{
System.out.println("努力呼吸");
}
} class Bird
{
private Animal animal;
public Bird(Animal animal)
{
this.animal=animal;
}
private void fly()
{
System.out.println("鸟儿飞啊飞");
}
public void beat()
{
//将“父类”的方法直接组合进来
animal.beat();
}
} class Wolf
{
private Animal animal;
public Wolf(Animal animal)
{
this.animal=animal;
}
public void run()
{
System.out.println("跑啊跑");
}
//将“父类”的方法直接组合进来
public void breath()
{
animal.breath();
}
}

复用其实就是在新的类型中声明要复用的类的对象,并将要复用类方法的嵌入到新类相同的方法中

我们可以看出:在java我们为了复用某个类中的成员,我们可以用继承的方法,但是为了不破坏类封装的特性,我们还可以用组合的方法,来实现复用!

我们可以想想复用和继承的优缺点:

1.复用让类更封装,但是真大了编程量,因为每个父类的方法都得手动嵌入如:beath()

2.复用和封装消耗的内存空间差不多,他们都得为方法好字段分配存储位置!

java中的继承(is a )和组合(has a)的更多相关文章

  1. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  2. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  3. java中的继承与oc中的继承的区别

    为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...

  4. Java中的继承

    我们在以前的学习中,我们会了C#中的继承,今天我们来了解了解Java中的继承,其实都大同小异啦! 1.语法 修饰符 SubClass extends SuperClass(){ //类定义部分 } e ...

  5. extends:类似于java中的继承特征,extends="struts-default"

    extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型.拦截器等一些常用 ...

  6. 在JAVA中利用public static final的组合方式对常量进行标识

    在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...

  7. 关于java中的继承

    我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对 ...

  8. Java中的继承、封装、多态的理解

    Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...

  9. 浅析 Java 中的继承和重写

    浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...

  10. java中的继承关系

    1.定义 java中的继承是单一的,一个子类只能拥有一个父类:java中所有类的父类是java.lang.Object,除了这个类之外,每个类只能有一个父类: 而一个父类可以有多个子类,可以被多个子类 ...

随机推荐

  1. 使用wifi网卡笔记4---工具dhcp及全自动使用wifi

    dhcp : 使得WIFI网卡动态获取IP ·1.源码获取 输入dh看有哪些应用程序,输入dhclient -v查看一下相关信息,源码获取的网址 2.开发环境配置 解压 tar xzf dhcp-4. ...

  2. 【BZOJ】1001: [BeiJing2006]狼抓兔子(最小割 / 对偶图)

    题目 传送门:QWQ 分析 显然答案是最小割. 然后dinic卡一卡过去了. 其实是懒得写转对偶图:正解 (dinic原来写的是vector,后来改的比较鬼畜 代码 #include <bits ...

  3. Angular2快速入门-5.使用http(新闻数据来自http请求)

    Angular2官网通过http请求模拟API 来请求hero 数据,感觉有点繁琐,很让人理解不了,我们不采用它的办法,直接展示怎么使用http请求来获取我们的数据 ,直截了当. 第一.准备工作,创建 ...

  4. Gson:自定义TypeAdapter

    当前项目解析json用的工具是google的gson,原因嘛,因为有GsonFormat插件,可以直接把服务端传回的json字符串转成Bean对象.不过在实际使用中出现了以下两个问题: 传回的字符串或 ...

  5. 三、postman测试断言设置语法

    postman的基本介绍跟基本的用法,在此就不做过多赘述,主要是受限于时间,网上有很多大神总结的已经算是很详尽了,给出链接并感谢大神的辛苦与奉献: postman基本用法:http://www.jia ...

  6. ELK-Stack 最后一次全篇文档

    简介: ELK-Stack 日志收集系统.最后一次全篇记录的笔记,之后关于 ELK 的笔记都将是片段型.针对性的.  环境介绍: ELK-Stack:192.168.1.25 ( Redis.LogS ...

  7. MySQL中函数CONCAT及GROUP_CONCAT函数的使用

    一.CONCAT()函数 CONCAT()函数用于将多个字符串连接成一个字符串. 以数据表[user]作为实例: SELECT USER_NAME, SEX FROM USER WHERE USER ...

  8. 使用avalon 实现一个序列号功能

    avalon"操作数据即操作DOM"的能力,让我们可以专致于业务,写出更专业,更优雅,更易维护的代码来.现在让我们看看如何实现一个序列号输入功能.它的需求以下: 每输入4个字符就跳 ...

  9. SQL 语句中的in、find_in_set、like的区别

    1.in查询相当于多个or条件的叠加,例如: select * from user where user_id in (1,2,3);等效于select * from user where user_ ...

  10. ElasticSearch中如何让query should等同于filter should

    bool query must The clause (query) must appear in matching documents. should The clause (query) shou ...