黑马程序员技术交流社区

标题: 多态小问题 [打印本页]

作者: 高薇    时间: 2012-8-19 10:06
标题: 多态小问题
abstract class Student
{
abstract void study();
public void sleep()
{
  System.out.println("躺着睡");
}
}
class BaseStudent extends Student
{
public void study()
{
  System.out.println("base study");
}
public void sleep()
{
  System.out.println("坐着睡");
}
}
class AdvStudent extends Student
{
public void study()
{
  System.out.println("Adv study");
}
}
class DoSome
{
public static void dosomething(Student s)
{
  s.study();
  s.sleep();
}
}
class X4
{
public static void main(String[] args)
{
  DoSome ds=new DoSome();
  ds.dosomething(new BaseStudent());
  ds.dosomething(new AdvStudent());
}

}
这里为什么要将dosomething方法封装成一个类呢?有点转不过来了。。。。
作者: 孙树勋    时间: 2012-8-19 10:17
如果你以后要修改这个代码,你要再添加一个别的班级的学生的话,要想调用 你不得在定义一个对象嘛!这样不就提高了代码的扩展性嘛!
作者: 张忠豹    时间: 2012-8-19 10:20
package day17;
abstract class Student1 {
abstract void study();
public void sleep() {
  System.out.println("躺着睡");
}
}
class BaseStudent extends Student1 {
public void study() {
  System.out.println("base study");
}
public void sleep() {
  System.out.println("坐着睡");
}
}
class AdvStudent extends Student1 {
public void study() {
  System.out.println("Adv study");
}
}
/**
* 这里为什么要将dosomething方法封装成一个类呢?有点转不过来了。。。。
* 这个DoSome类,是用作事务处理的,其实前面的几个类,相当于javaBean,这个类相当于专门对这些javaBean进行业务操作的
*
*/
class DoSome {
public static void dosomething(Student1 s) {
  s.study();
  s.sleep();
}
}
class X4 {
public static void main(String[] args) {
  DoSome ds = new DoSome();
  ds.dosomething(new BaseStudent());
  ds.dosomething(new AdvStudent());
}
}
//你要是把DoSome类去掉,x4改写成这样肯定也错不了
class X4 {
public static void dosomething(Student1 s) {
  s.study();
  s.sleep();
}
public static void main(String[] args) {
  dosomething(new BaseStudent());
  dosomething(new AdvStudent());
}
}

作者: 黑马张旭明    时间: 2012-8-19 10:21
为了方便使很多对象做同一部分的事情,比如说BaseStudent和AdvStudent里不只有study()和sleep()方法还有A(),B(),C()方法,现在我只想让这些对象都执行study(),B(),C()方法,可以新建对象然后逐一的调用这些方法,dosomething(Student s)就省去了每个对象调用方法的麻烦,定义好里面要调用的方法直接将对象传进去就好了。
作者: 高薇    时间: 2012-8-19 10:22
张忠豹 发表于 2012-8-19 10:20
package day17;
abstract class Student1 {
abstract void study();

我知道错不了啊,就是问为什么要加上呢?本来好好的,现在把这个方法封装成一个类,有什么好处呢?
下面还是实例化了,好像没有省事呀

作者: 高薇    时间: 2012-8-19 10:24
黑马张旭明 发表于 2012-8-19 10:21
为了方便使很多对象做同一部分的事情,比如说BaseStudent和AdvStudent里不只有study()和sleep()方法还有A() ...

函数的作用是这个,可是干嘛还要在函数上再加个类呢?
作者: 霍明波    时间: 2012-8-19 10:31
本帖最后由 霍明波 于 2012-8-19 10:33 编辑

DoSome是一个方法类,它把各个等级的学生的共性特点(所有学生都的学习吃饭)study,sleep抽取出来创建一个方法类,在主函数只要创建这个方法类的对象,在传入先关的学生参数就能实现该类学生的功能,在以后升级时再来一种学生也可以用这个方法,提高程序的拓展性,降低的学生跟主函数的耦合性,避免程序死板,不能升级

作者: 张忠豹    时间: 2012-8-19 10:36
高薇 发表于 2012-8-19 10:22
我知道错不了啊,就是问为什么要加上呢?本来好好的,现在把这个方法封装成一个类,有什么好处呢?
下面 ...

不知道你接触过mvc没。mvc讲究的就是业务逻辑与其他各层区别开来。
打个比方。如果在你的业务中,前面几个类都没有改变,而仅仅是对其相关对象的操作发生了改变。那么只需修改一下DoSome类,而不用修改其他的类……
可能你现在还认为这种操作没有必要,等以后做一个项目的时候,你会发现几乎每个class都写在一个单独的.java文件中,这样方便修改
作者: 黑马张旭明    时间: 2012-8-19 10:37
这个函数具有一定的功能所以将他封装成一个类似“工具”的类里面,为什么不放在主函数里和毕老师之前说的工具类是一个道理,在这个代码里的确写个函数就好了,我想这跟毕老师的开发习惯有关吧
作者: 高薇    时间: 2012-8-19 12:17
现在知识面很浅,所以不明白其中的缘由,
既然现在没什么大碍的话,
这个就留在以后的程序中慢慢体会吧。
谢谢各位的详细解答,我的问题已经解决。


已解决
作者: 高薇    时间: 2012-8-19 16:40
孙树勋 发表于 2012-8-19 10:17
如果你以后要修改这个代码,你要再添加一个别的班级的学生的话,要想调用 你不得在定义一个对象嘛!这样不 ...

                           明白了
作者: 吴通    时间: 2012-8-21 21:48
一方面:因为无论初级的和高级的都学习和睡觉,只是学习和睡觉方法不一样,而都有这个动作,故把这个动作封装成类,
另一方面:以后再添加对象只需要调用这个动作就行了!大大减少了代码的书写

作者: 赵俊杰    时间: 2012-8-21 23:47
这就好比中午组长喊大家吃饭,他可以有两种喊法:
第一种喊法:小李,去吃饭。小王,去吃饭,小赵,去吃饭,小高,去吃饭。小胡,你也去吃饭。小刚,小丁,快点啦。
第二种喊法:是人的话,都去吃饭。
个人感觉,就为了达到这么个效果。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2