黑马程序员技术交流社区

标题: 抽象类,一般类的问题 [打印本页]

作者: 偏執旳、靑春    时间: 2013-2-22 11:45
标题: 抽象类,一般类的问题
1.一般类中能定义抽象方法吗?
2.抽象类中方法被private修饰后能够被继承和实现吗?
3.一般类中有的方法被private修饰后能继承吗?
4.抽象类中方法必须全部是抽象的吗?
5.子类必须全部覆盖完abstract方法吗?
作者: 黄玉昆    时间: 2013-2-22 12:08
本帖最后由 黄玉昆 于 2013-2-22 12:09 编辑

先明确一点:抽象类是对子类方法功能的抽取,基本都是用子类来实现的,并不能创建实例对象,那么何必设置为private呢?但抽象了可以被static修饰,直接用类名调用。
1、一般类只要含有抽象方法,那么这个一般类就是抽象类,因为类中只有抽象类可以含有抽象方法
4、先说这个,抽象类中可以有非抽象方法。
2、抽象类中的抽象方法不能被private修饰,因为抽象方法是从子类中提取出来的,为的就是继承这个方法用。但对于抽象类中的非抽象方法应该可以设为private,但是,有什么作用呢?
3、一般类中,子类是无法继承这个一般父类的private修饰的属性和方法的,也就是说子类继承了父类,却没有继承其用private修饰的属性和方法,就无法调用了。这有利于在开发过程中保护父类的某种属性和方法不被覆盖
5、子类如果继承抽象父类,必须全部复写抽象方法,否则继承了父类,也继承了抽象方法,那么子类也为抽象的了。
你这些问题问的很细,是很多人经常会注意不到的地方,或者模糊的地方。duo总结总结有好处的。
总结(别人总结的)
抽象类不能用final来修饰,即一个类不能既是最终类又是抽象类。
abstract不能与private、static、final、native并列修饰同一个方法。
作者: 张豪杰    时间: 2013-2-22 12:08
1.如果类中有抽象方法,那么这个类也要被abstract修饰,也就是说,普通类中,如果定义了一个抽象方法,那么他就要变成抽象类了。这也就说明了第四点,抽象类中不一定全部都是抽象方法,事实上,可以对没有抽象方法的普通类声明为abstract,这样可以避免由这个类直接创建对象。
2.抽象类中的方法不能用private修饰,抽象类是为了继承而存在的,如果他的方法定位private,子类怎么继承和覆盖呢?
3.如果子类是非抽象的,那么它就必须实现父类中的抽象方法;否则,它继承来的抽象方法仍然没有方法体,也是个抽象方法,此时就与“含有抽象方法的类必须是抽象类”相矛盾了。

作者: 邢义敏    时间: 2013-2-22 12:11
本帖最后由 邢义敏 于 2013-2-22 12:14 编辑

1.不能,抽象方法只能放在抽象类中。

2.抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。原因如下:抽象方法没有方法体,是用来被继承的,所以不能用private修饰;static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;使用synchronized关键字是为该方法加一个锁。。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰 类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以。锁应该归其子类所有。所以。抽象方 法也就不能用synchronized关键字修饰了;native,这个东西本身就和abstract冲突,他们都是方法的声明,只是一个吧方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢?
接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用,因为接口可以让所有的类去实现(非继承),不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。

3.在JAVA中,子类是无法继承父类的private修饰的属性和方法的,也就是说子类继承了父类,却没有继承其用private修饰的属性和方法,就无法调用了。这有利于在开发过程中保护父类的某种属性和方法不被覆盖。
假设在类A中定义一个由private修饰的方法method1,而类B是类A的子类。那么,类A中的method1不能被B继承,自然也 不可能被B访问,更不可能在B中重写。因而,在子类中定义一个与method1一模一样的方法是允许的。此时,B中的method1与A中的 method1毫无关系,互不影响。

4.抽象类中必须有抽象方法,同时也可以有非抽象方法,既可以有方法的具体实现,继承抽象父类的子类中,如果子类没有实现抽象父类中的抽象方法,那么这个子类也必须声明为抽象的,即只要类中有抽象的方法那么这个类就一定是抽象类,但是抽象类中的方法不一定都是抽象方法,只是至少有一个是抽象方法即可

5.abstract:

  修饰符号,声明抽象方法和抽象类。声明方法时表示该方法只有特征签名,没有具体实现。而是把具体实现留给继承该类的子类,并且抽象类不能直接用new来实例化对象即使有公共的构造函数。

  1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。

  2,abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现(覆盖)。

abstract可以有自己的数据成员,也可以有非abstract的成员方法。

abstract class是一个类,抽象的而已,不能被实例化,用于子类继承,表示“is-a”的关系。关键字extends,java中只能是单继承。子类继承时,可以不全部覆盖父类的abstract方法,这是子类任然是一个abstract class。

 例子:(门和报警门)

  抽象类 门

  abstract class Door {

  abstract void open ();

  abstract void close ();
      }(并不是所有的门都有“报警”功能,但是所有的门都有“开”和“关”的功能)


作者: 王昕    时间: 2013-2-22 12:36
1.一般类中能定义抽象方法吗?
不能。只要类中有一个方法是抽象的,这个类也必须标记为抽象的,不然编译报错。
2.抽象类中方法被private修饰后能够被继承和实现吗?
不能,private的方法不会被继承,而抽象类又无法创建实例,所以在抽象类中定义私有方法没什么意义。
3.一般类中有的方法被private修饰后能继承吗?
上面说了,private的方法不会被继承。
4.抽象类中方法必须全部是抽象的吗?
不是,抽象类中可以没有抽象的方法,有多少抽象方法都行。
5.子类必须全部覆盖完abstract方法吗?
如果子类还是抽象的,可以选择实现父类的抽象方法,也可以选择留给自己的子类去实现。继承树上第一个非抽象的类必须具体实现所有的抽象方法。
作者: 胥文    时间: 2013-2-22 12:50
1.一般类中能定义抽象方法吗?
答:一般类中能定义抽象方法,不过定义了之后这个类也就抽象了,那就是为什么继承一个抽象类的时候要复写其全部抽象方法不然自身还是一个抽象类
就不能创建实例对象,另外抽象类中是可以有非抽象的方法;

2.抽象类中方法被private修饰后能够被继承和实现吗?
答:首先被private修饰的方法和变量,是只允许自身访问的,子类可不是自身哦,为了解决这个问题java就有了protected这个修饰符,
在父类中定义一些只让子类访问的方法和变量,就用Protected修饰或者高于该权限的修饰符(比如Public)

3.一般类中有的方法被private修饰后能继承吗?
答:同2,是不能继承的,被父类私有了

4.抽象类中方法必须全部是抽象的吗?
答:见1,抽象类是可以有非抽象方法的,而且有的抽象类其内部都是非抽象方法,这样只是不让别人new对象,在API中有
5.子类必须全部覆盖完abstract方法吗?
答:见1,是的,如果不全部覆盖,只覆盖部分抽象方法的话,自身还是一个抽象类,还是不能创建对象的。理论上是可以不全部覆盖的,
但是我们创建子类就是因为父类不能创建对象,而如果你整个子类,弄了半天还是抽象的,还是不能创建对象,不能创建对象就不能调用类中的方法,
那么这个子类就创建的没什么意思了,所以子类还是要全部覆盖的父类的抽象方法的
作者: 胥文    时间: 2013-2-22 12:50
1.一般类中能定义抽象方法吗?
答:一般类中能定义抽象方法,不过定义了之后这个类也就抽象了,那就是为什么继承一个抽象类的时候要复写其全部抽象方法不然自身还是一个抽象类
就不能创建实例对象,另外抽象类中是可以有非抽象的方法;

2.抽象类中方法被private修饰后能够被继承和实现吗?
答:首先被private修饰的方法和变量,是只允许自身访问的,子类可不是自身哦,为了解决这个问题java就有了protected这个修饰符,
在父类中定义一些只让子类访问的方法和变量,就用Protected修饰或者高于该权限的修饰符(比如Public)

3.一般类中有的方法被private修饰后能继承吗?
答:同2,是不能继承的,被父类私有了

4.抽象类中方法必须全部是抽象的吗?
答:见1,抽象类是可以有非抽象方法的,而且有的抽象类其内部都是非抽象方法,这样只是不让别人new对象,在API中有
5.子类必须全部覆盖完abstract方法吗?
答:见1,是的,如果不全部覆盖,只覆盖部分抽象方法的话,自身还是一个抽象类,还是不能创建对象的。理论上是可以不全部覆盖的,
但是我们创建子类就是因为父类不能创建对象,而如果你整个子类,弄了半天还是抽象的,还是不能创建对象,不能创建对象就不能调用类中的方法,
那么这个子类就创建的没什么意思了,所以子类还是要全部覆盖的父类的抽象方法的
作者: scott0610    时间: 2013-2-22 12:53

1.一般类中能定义抽象方法吗?
不能。如果一个类中存在抽象方法,那么这个类必须是抽象类。
2.抽象类中方法被private修饰后能够被继承和实现吗?
不能。private的访问权限只能是当前类,子类和其他类无法访问。
3.一般类中有的方法被private修饰后能继承吗?
不能,private的访问权限只能是当前类。
4.抽象类中方法必须全部是抽象的吗?
不是,抽象类中可以存在方法的实现。
5.子类必须全部覆盖完abstract方法吗?
不一定。如果子类也是一个抽象类,那么就可以不实现父类的抽象方法。
作者: 江华    时间: 2013-2-22 13:45
第一题:
什么是抽象???
抽象就是不知道,不懂得,说不清道不明!
一个对象有某项信息你确定有,但是就是说不清道不明,你说这个对象你能完全说清么?
说不清道不明的对象是什么对象?抽象类对象!
第二:
private 是私有的意思。
一个说不清道不明的方法,你不开放出去,让你的继承者去处理,你自己都不懂,你私有化它有啥用?
第三:
你把某个方法私有了,就是告诉你的继承者这是你自己的东西,不在他们继承的范围了,他们还继承不?
作者: sun~~    时间: 2013-2-22 14:22
1.一般类中能定义抽象方法吗?
不能,抽象方法只能放在抽象类中。抽象方法要用abstract修饰

2.抽象类中方法被private修饰后能够被继承和实现吗?
不能 抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。

3..一般类中有的方法被private修饰后能继承吗?
这个和上面一样不能,在JAVA中,子类是无法继承父类的private修饰的属性和方法的,也就是说子类继承了父类,却没有继承其用private修饰的属性和方法,就无法调用了。

4..抽象类中方法必须全部是抽象的吗?
抽象类中可以有抽象方法也可以有普通方法;

5.子类必须全部覆盖完abstract方法吗?
子类如果继承抽象父类,必须全部复写抽象方法,否则继承了父类,也继承了抽象方法,那么子类也为抽象的了。
   
希望我的回答使你思路清晰,知识共勉,为了梦的明天!!

 
作者: 江苏孙浩    时间: 2013-2-22 19:37
Java还不太熟,试着回答一下:
1.一般类中能定义抽象方法吗?
抽象类之所以是抽象类,因为含有抽象方法;所以一般类肯定是“没有抽象方法”的类。
2.抽象类中方法被private修饰后能够被继承和实现吗?
private按照其特点是只能被本类访问,在继承类中如果有同名的也可视为“覆盖”,那么自然不能被继承。通过继承觉得主要方便多态,而private不能被外界访问到,所以也没有继承的必要。
3.一般类中有的方法被private修饰后能继承吗?
同上
4.抽象类中方法必须全部是抽象的吗?
不是,抽象类是“含有抽象方法”的类
5.子类必须全部覆盖完abstract方法吗?
不一定,子类如果不能覆盖玩abstract方法那么仍然是抽象类。




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