A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨翔 中级黑马   /  2013-4-23 22:54  /  1742 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Person
  2. {
  3.         public void chifan()
  4.         {
  5.                 System.out.println("吃饭");
  6.         }
  7. }

  8. class SuperPerson
  9. {
  10.         private Person p ;
  11.         SuperPerson(Person p)
  12.         {
  13.                 this.p = p;
  14.         }
  15.         public void superChifan()
  16.         {
  17.                 System.out.println("开胃酒");
  18.                 p.chifan();   
  19.                 System.out.println("甜点");
  20.                 System.out.println("来一根");
  21.         }
  22. }
复制代码
这是两个类,SuperPerson类中有对于Person类中方法的加强版, SuperPerson类中的superChiFan方法里面有一行,是直接 p.chifan,应该是我忘了些东西,没想明白,该类中又没有Person的实例,为什么能直接调用Person类中的方法呢?

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

6 个回复

正序浏览
xiewen 中级黑马 2013-4-26 01:23:13
7#
我也明白了,我以后要多看别人的解答!
回复 使用道具 举报
装饰就是对原来的类进行增强的,他底层用到的还是那个传进来的对象;
而继承是要通过super关键字,调用父类的方法的;
复写是产生子类的优良基因;
回复 使用道具 举报
breeze 发表于 2013-4-23 23:04
你的SuperPerson的构造方法传入了一个Person的对象, 将这个对象引用指向了SuperPerson类中的成员属性p, 所 ...

这次给分了,下次一个帖子的回答只给一分奥
回复 使用道具 举报
原有Person类。  然后才出的SuperPerson类。
为什么说SuperPerson类 是Person类的装饰类呢?
首先,不需要修改Person类中的代码, 也没有去继承Person  也不用实现接口的方式来升级这个类。 这就是装饰类的特点。
SuperPerson类将Person对象作为参数,在SuperPerson中的方法去将其补充.
例如:   SuperPerson中有SuperChifan()方法.   他会调用Person对象P来调用Person的chifan()方法   然后再将后续的代码写在下面。

运行时:  先运行SuperPerson的SuperChifan()  虚拟机读到  P.Chifan()  就去Person类中运行Chifan方法 然后再继续向下运行SuperPerson的SuperChifan()的代码。

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
你的SuperPerson的构造方法传入了一个Person的对象, 将这个对象引用指向了SuperPerson类中的成员属性p, 所以是直接调用p.chifan方法, 不过这样的局限性太强, 你可以定义一个接口, 只要其它类实现了这个接口, 这样就能用多态来对不同的类进行包装

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
参考一下我写的代码, 其实这里主要还是用了多态, 在ItcastStudent类中定义了一个Coder类型的成员变量, 构造方法里面给这个变量传了一个要被包装的对象将其初始化, 然后这个属性可以调用它本身的方法
package com.itcast.rw;

public class DecoratorMode {
        public static void main(String[] args) {
                //创建一个包装类的对象将要被包装的对象当做参数传入
                ItcastStudent is = new ItcastStudent(new Student());
                //调用包装类的code方法
                is.code();        //这个方法多了两个功能
        }
}

//定义一个接口
interface Coder {
        void code();
}

//定义学生类实现Coder接口
class Student implements Coder {
        /*
         * 实现接口中的方法
         * 学生有的功能是会JavaSE和Java Web
         */
        public void code() {
                System.out.println("JavaSE");
                System.out.println("Java Web");
        }
}

//定义装饰类实现Coder接口
class ItcastStudent implements Coder {
        //这个类有一个Coder类型的成员属性
        Coder coder;
        /*
         * 这个类的构造方法接收一个Student对象
         */
        ItcastStudent(Coder coder) {
                this.coder = coder;
        }
       
        /*
         * 重写接口中的方法对传入构造方法的对象的功能进行扩展
         */
        public void code() {
                this.coder.code();
                System.out.println("SSH");
                System.out.println("Hadop");
        }
}

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马