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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 郑庆伟 于 2012-6-25 20:18 编辑

/*
基础班学生:
学习,睡觉。
高级班学生:
学习,睡觉。
可以将这两类事物进行抽取。
*/
abstract class Student
{
          public abstract void study();

          public void sleep()
          {
                 System.out.println("躺着睡");
          }
}
class BaseStudent extends Student
{
      public void study()
      {
           System.out.println("base study");
      }
}
class AdvStudent extends Student
{
      public void study()
      {
            System.out.println("adv study");
      }
      public void sleep()
      {
            System.out.println("坐着睡");
      }
}
class DoStudent
{
       public void doSome (Student stu)
       {
             stu.study();
             stu.sleep();
        
       }
}
class DuoTaiDemo3
{
      public static void main(String[] args)
      {
       DoStudent ds = new DoStudent();
       ds.doSome(new BaseStudent);//这一句是简写的,分开写是什么样子的?
        /*Student s = new BaseStudent();
           BaseStudent bs =(BaseStudent)s;
           bs.doSome();
           AdvStudent as = new AdvStudent();
           as.study();
           as.sleep();*/
      }
}
对前面学的一些内容有点模糊  ds.doSome(new BaseStudent);为什么要这么写?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1

查看全部评分

8 个回复

倒序浏览
public void doSome (Student stu){
stu.study();
stu.sleep();
}
回复 使用道具 举报
public void doSome (Student stu){
stu.study();
stu.sleep();
}
doSome(Student stu)接受一个Student对象,new BaseStudent()创建一个普通班学生对象,然后传给doSome()方法中,你那里写错了吧
然后才能调用sleep()和study()方法,此时会根据stu所真正指向的引用类型去调用对应的方法,从而实现了多态。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陈淑飞 于 2012-6-25 19:55 编辑


一、 代码错误
ds.doSome(new BaseStuden);  这语你能编译通过? doSome方法在声明时,要求一个Student 对象。
但你的 new BaseStudent 不是个对象东东呢,编译器你遇到你new 下面类名时,期待的你给个()或(..参数),结果没发现,肯定报错啦。
二、分开写是什么样子
可以写成
  1. BaseStudent bs = new BaseStudent();
  2. ds.doSome(bs);
复制代码
三、为什么这样写
        ds.doSome(new BaseStuden());
你直接new BaseStuden()一个对象后,给doSome方法。new 出来这个对象,没有何用对象变更或叫句柄来引用它。这是个匿名对象。
一般匿名对象会用在:
1. 此匿名对象作为一个实参,传递给一个方法调用。
   在这个方法中你可以处理这个对象给它,改变个属性或什么的。需要时,还可以返回出来。呵呵
2. 此匿名对象只需要进行一次调用,以后用不着它。
   比如后期学的 事件处理程序 等等。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
ds.doSome(new BaseStuden());
里面少了一个括号,
非常感谢
你们回答的我好好看一看。  
回复 使用道具 举报
  ds.doSome(new BaseStudent);//这一句是简写的,分开写是什么样子的?
BaseStrudent bs=new BaseStudent();
ds.doSome(bs);
回复 使用道具 举报
我刚看了你的代码发现了一处错误就是少了一对括号,呵呵
class DuoTaiDemo3
{
      public static void main(String[] args)
      {
       DoStudent ds = new DoStudent();
       ds.doSome(new BaseStudent);//这里是语法错误!原因是 BaseStudent后边少了一对括号()应该改为 new BaseStudent()   
   AdvStudent as = new AdvStudent();
           as.study();
           as.sleep();*/
      }
}
下边回答你的问题
    ds.doSome(new BaseStudent());//你说的没错是一个简写,括号中的 new BaseStudent()是一个匿名对象,就是只可以使用一次,因为他在桟内存当中没有名字,所以使用完这一次以后就无法再找到他了。
如果要拆开了就因该是这么写的
BaseStudent base=new BaseStudent();
ds.doSome(base);

最后说下使用匿名对象的好处:这样写由于对象只能使用一次,使用完以后会直接丢弃,所以这样写可以节省系统资源。当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。但是如果涉及到多个方法和属性的调用的时候,匿名对象就显得心有余而力不足了!

回复 使用道具 举报
我刚看了你的代码发现了一处错误就是少了一对括号,呵呵
class DuoTaiDemo3
{
      public static void main(String[] args)
      {
       DoStudent ds = new DoStudent();
       ds.doSome(new BaseStudent);//这里是语法错误!原因是 BaseStudent后边少了一对括号()应该改为 new BaseStudent()   
   AdvStudent as = new AdvStudent();
           as.study();
           as.sleep();*/
      }
}
下边回答你的问题
    ds.doSome(new BaseStudent());//你说的没错是一个简写,括号中的 new BaseStudent()是一个匿名对象,就是只可以使用一次,因为他在桟内存当中没有名字,所以使用完这一次以后就无法再找到他了。
如果要拆开了就因该是这么写的
BaseStudent base=new BaseStudent();
ds.doSome(base);

最后说下使用匿名对象的好处:这样写由于对象只能使用一次,使用完以后会直接丢弃,所以这样写可以节省系统资源。当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。但是如果涉及到多个方法和属性的调用的时候,匿名对象就显得心有余而力不足了!
==================================================================
求版主给分......

回复 使用道具 举报
谢谢我明白了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马