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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

    /*基础班:学习 睡觉

高级班:学习 睡觉

将这两类事物进行抽取   
*/
abstract class Student
{
        public abstract void study();
        public void sleep()
        {
                System.out.println("睡觉");
        }
}

class DoStudent
{
        public void doThings(Student x)
        {
                x.study();
                x.sleep();
       
        }
}

class BasStudent extends Student
{
        public void study()
        {
                System.out.println("BAS Study");
        }
        public void sleep()
        {
                System.out.println("BAS Sleep");
        }
}
class AdvStudent extends Student
{
        public void study()
        {
                System.out.println("ADV Study");
        }
        public void sleep()
        {
                System.out.println("ADV Sleep");
        }
}


class  DuoTaiDemo3_1
{
        public static void main(String[] args)
        {
       
                DoStudent dt =new DoStudent();
                dt.doThings(new BasStudent());
                dt.doThings(new AdvStudent());
                //问题,在多态情况下,当我只想调用子类对象的某一个方法时如何操作
        }
}
//问题:在这种情况下,当我只想调用子类对象的某一个方法时,
              即只想调用子类对象的sleep(); 或者只调用study();
              如何操作,



评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

10 个回复

倒序浏览
一点想法,这个代码。 DoStudent中调用了两个方法。你又说只想调用一个。感觉,实际应用当中就应该考虑清楚哪里调用哪里。符合什么条件又调用哪里。这里想值调用一个。就去DoStudent中去掉一个好了。嘿嘿
回复 使用道具 举报
直接调用就好了吧,直接
  1. new BasStudent().sleep();
复制代码
回复 使用道具 举报
水竹 发表于 2014-4-26 13:41
直接调用就好了吧,直接

你这种方法好像需要再创建一个对象实体,
回复 使用道具 举报
伍叶竹 发表于 2014-4-26 13:27
一点想法,这个代码。 DoStudent中调用了两个方法。你又说只想调用一个。感觉,实际应用当中就应该考虑清楚 ...

    也想过你说的这种方法,但是如果这样的话,是不是抽取的意义就不大了,
有没有既保留扩展性又能单独调用的办法。
回复 使用道具 举报
江夷 发表于 2014-4-26 13:55
你这种方法好像需要再创建一个对象实体,

我只是举个例子啊,就是说直接调用就好了么。你要是想用之前的那个对象就给它分配个标识符呗:
  1. BasStudent s = new BasStudent();
  2. dt.doThings(s);
  3. s.sleep();
复制代码

不要用匿名的就好了。
回复 使用道具 举报
因为你的Student类是抽象类所以子类在继承父类后必须实现其抽象方法!如果你将子类的对象作为参数传递dt.doThings(new BasStudent())
就只有在doThing里改动了!可以只写一个方法!比如study();
回复 使用道具 举报
我觉直接调用new 子类对象调用直接,也好用,不必想那么复杂。。。
回复 使用道具 举报
爱翚 中级黑马 2014-4-26 22:55:59
9#
由于doThings方法中顺次有两个方法,而这两个方法都是抽象类和子类中所含有的,所以没办法实现单独调用其一的效果.
解决办法只能是使用多态分开来调用.

abstract class Student {
        public abstract void study();

        public void sleep() {
                System.out.println("睡觉");
        }
}

class DoStudent {
        public void doThings(Student x) {
                x.study();
                x.sleep();
        }
}

class BasStudent extends Student {
        public void study() {
                System.out.println("BAS Study");
        }

        public void sleep() {
                System.out.println("BAS Sleep");
        }
}

class AdvStudent extends Student {
        public void study() {
                System.out.println("ADV Study");
        }

        public void sleep() {
                System.out.println("ADV Sleep");
        }
}

class DuoTaiDemo3_1 {
        public static void main(String[] args) {

                /*
                 * 以下这种写法没有办法调用其中之一的方法,因为doThings方法中顺序调用了两个方法study()、sleep()
                 */
                DoStudent dt = new DoStudent();
                dt.doThings(new BasStudent());
                dt.doThings(new AdvStudent());
               
                /*
                 * 解决方案是要么将doThings方法拆成两个,要么直接在main函数中使用多态分两次调用子类中的方法
                 */
                Student bs = new BasStudent();
                bs.study();
                bs.sleep();
               
                Student as = new AdvStudent();
                as.study();
                as.sleep();
        }
}

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
dt.doThings(new BasStudent()); dt.doThings(new AdvStudent());这两个去掉其中一个即可
回复 使用道具 举报
水竹 发表于 2014-4-26 14:02
我只是举个例子啊,就是说直接调用就好了么。你要是想用之前的那个对象就给它分配个标识符呗:

不要用匿 ...

可能是我想的太复杂了,直接调用就可以实现需求,无需非要通过抽取后的DoStudent调用,多谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马