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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨华东 中级黑马   /  2012-10-15 18:09  /  2445 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨华东 于 2012-10-21 20:12 编辑

abstract class Demo
{
            /*内部没有定义任何抽象内容*/
}

思考的问题:
我们知道普通类在Java中不可能出现多继承那是因为:extends 关键字强制的作用。
强制的原因:怕两个或以上的父类中有相同的函数而内容又不相同时 子类对象 无法确定执行哪一个函数。
如果没有这个关键字我完全可以突破限制,下面例子完全没有错误。
如下:
abstract class A
{
     int a=90;
     abstract void function();
}

abstract class B
{
    int b=99;
   abstract void function();
}

class C extends A,B
{
     public void function()
      {
          System.out.println("哥们完全 没有违背Java的思想");//但是编译错误,因为Java强行的暴力的不让我用。
      }
}

既然Java可以这样强制的不让哥们用,肯定有道理的。原因上面说过了。

那么我们就想了,那没有任何抽象内容的类 有啥意义啊??完全没意义,某种情况下也是安全隐患啊。
我认为 必须强行的让抽象类含有抽象的内容才算合乎抽象的常理。换句话说:被abstract修饰的类必须要有抽象内容!!不然就给程序报错!!
不然的话 上面的抽象类Demo有啥意义呢??

大家各抒己见啊     随便说都行  说出自己的想法。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

17 个回复

倒序浏览
代码复用算不算?
  1. abstract class Person
  2. {
  3.       String name;
  4.       int age;
  5. }
  6. class Student extends Person
  7. {

  8. }
  9. class Teacher extends Person
  10. {

  11. }
复制代码
回复 使用道具 举报
梁世喜 发表于 2012-10-15 18:20
代码复用算不算?

啥意思啊  
说具体点
回复 使用道具 举报
本帖最后由 梁世喜 于 2012-10-15 18:33 编辑

简单工厂模式。
  1. package com.liang;

  2. public class Factory {
  3.         static Vei che=null;
  4.         
  5.         public static Vei getVei(){
  6.                 //根据条件需要事例车(Vei)对象
  7.                 //if()  che=new Car(bank,seat);
  8.                 //
  9.                 return che;
  10.         }
  11. }
  12. //车类
  13. abstract class Vei  
  14. {
  15.         String bank;//牌子
  16.         int  seat ;//座位
  17.         
  18.         private Vei(){}
  19.         
  20.         public Vei(String bank,int seat){
  21.                 this.bank=bank;
  22.                 this.seat=seat;
  23.         }
  24. }
  25. //轿车
  26. class Car extends Vei
  27. {
  28.         public Car(String bank,int seat){
  29.                 super(bank,seat);
  30.         }

  31. }
  32. //卡车
  33. class Truck extends Vei
  34. {
  35.         int load;//载重
  36.         public Truck(String bank,int seat,int load){
  37.                 super(bank,seat);
  38.                 this.load=load;
  39.         }
  40. }
复制代码
这个抽象类可以吧
回复 使用道具 举报
杨华东 发表于 2012-10-15 18:22
啥意思啊  
说具体点

你不是说抽象类没意义吗

抽象类可以实现代码复用,不能实例化。这样安全吧?
回复 使用道具 举报
本帖最后由 杨华东 于 2012-10-15 18:44 编辑
梁世喜 发表于 2012-10-15 18:20
代码复用算不算?


抽象的直接原因  不就是函数的抽象造成的嘛
与其他没啥关系,那你说说 你这个抽象类有啥意义  ?
抽不抽象都一样的  是不是兄弟???
回复 使用道具 举报
梁世喜 发表于 2012-10-15 18:34
你不是说抽象类没意义吗

抽象类可以实现代码复用,不能实例化。这样安全吧? ...

是的啊    这点让人蛋疼啊
你说说抽象到底是啥意思啊??
我认为抽象就是不具体的,模糊的。。。可是你这个抽象都是具体的东西。
完全没必要非要抽象吧??是不是??
回复 使用道具 举报
梁世喜 发表于 2012-10-15 18:34
你不是说抽象类没意义吗

抽象类可以实现代码复用,不能实例化。这样安全吧? ...


按照你这个思路来 抽象和非抽象 真没啥区别   你说这是不是隐患???

你同意我的观点吗??
回复 使用道具 举报
我要一辆卡车  Truck  
你可以  Vei  kache=new Trcuk("解放",4,20")  把这个  kache 给我

你随便给我一辆车  Vei
Vei  che =new Vei();
行吗?  

这个车是抽象的,卡车是具体的
为防止你随便给我一辆车,我把  Vei  抽象了。不能创建对象。你就无法给我。

好吧。在不理解我也不知道怎么跟你说了。

回复 使用道具 举报
梁世喜 发表于 2012-10-15 19:03
我要一辆卡车  Truck  
你可以  Vei  kache=new Trcuk("解放",4,20")  把这个  kache 给我

我明白你的意思 。
你看看你的Vei类。
我把abstract去掉,同样可以达到你的目的。你明白吗??
效果一样的!!是不是啊??兄弟??
回复 使用道具 举报
我的这个 Vei 用于代码复用,并且防止你给我一个实体的 Vei (防止 Vei v=new Vei())!
知道了吗?

我要一辆卡车。你是不是应该给我一辆具体的车?!
你要是给我一个实体 Vei  我知道它载重多少吗?

回复 使用道具 举报
梁世喜 发表于 2012-10-15 19:54
我的这个 Vei 用于代码复用,并且防止你给我一个实体的 Vei (防止 Vei v=new Vei())!
知道了吗?


知道,所以你的构造函数不就私有化了嘛,对不对??那样不就不能建立对象了吗?
满足你的条件啊。
我是说,把你的Vei类前的abstract修饰符去掉,同样可以达到你的要求:“复用代码”。
你可以验证一哈,别老是抬杠。。。嘿嘿嘿  
回复 使用道具 举报
本帖最后由 杨华东 于 2012-10-15 21:09 编辑
梁世喜 发表于 2012-10-15 19:54
我的这个 Vei 用于代码复用,并且防止你给我一个实体的 Vei (防止 Vei v=new Vei())!
知道了吗?


哥们 咱俩都没错 想的完全正确

现在想想无抽象内容的抽象类只有一个功能:不让别人 创建对象 但是可以复用代码。
而普通类必须让构造函数私有化才能做到点,这样抽象一哈简化了代码。
学习了
谢谢你啊 兄弟
咱俩没想到一块去 嘿嘿
问题解决了
回复 使用道具 举报
你写一个

B类继承A类

A类构造方法私有试试。
回复 使用道具 举报
package com.liang;

public class Factory {
        static Vei che=null;
        
        public static Vei getVei(){
                //根据条件需要事例车(Vei)对象
                //if()  che=new Car(bank,seat);
                //
                return che;
        }
}
//车类
class Vei  //我把abstract 去掉了 效果你看看!! 一样的啊  郁闷!!
{
        String bank;//牌子
        int  seat ;//座位
        
        private Vei(){}
        
        public Vei(String bank,int seat){
                this.bank=bank;
                this.seat=seat;
        }
}
//轿车
class Car extends Vei
{
        public Car(String bank,int seat){
                super(bank,seat);
        }

}
//卡车
class Truck extends Vei
{
        int load;//载重
        public Truck(String bank,int seat,int load){
                super(bank,seat);
                this.load=load;
        }
}
回复 使用道具 举报
杨华东 发表于 2012-10-15 22:36
package com.liang;

public class Factory {

怎么不把Vei中的构造函数都私有化?
回复 使用道具 举报
梁世喜 发表于 2012-10-15 22:38
怎么不把Vei中的构造函数都私有化?

你别说那样的抬杠的话,口误了行不??
你看看这样去掉abstract行不??
兄弟??
回复 使用道具 举报
首先我没说什么话。我说的话都忍住心平气和的跟你说。我也没说你口误,更没跟你抬杠什么的

我只是说 Vei 里边有两个构造函数,你只私有化了无参构造,有参构造没有私有化。
还有我14楼说的你为什么不去试试呢。

好了。我心平气和就说那么多。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马