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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

前提:
抽象类的一个特点就是不能用new关键字创建对象,
但是抽象类中的方法要被调用的时候,必须由子类重写父类所有的抽象方法之后才能建立对象。
如果子类只覆盖了一部分抽象方法,那么这个子类还是一个抽象类。

问题1:
那么如果一个子类继承一个抽象类,并且只重写了部分父类的抽象方法,没有重写父类所有的抽象方法,那么这个子类即使没有被abstract关键字修饰,它也还是一个抽象类么?
问题2:
如果子类继承一个抽象类,但是不调用父类的抽象方法,而是使用普通方法,那么不重写父类所有的抽象方法的话,是否可以直接调用普通方法?

问题3:
有以下代码
abstract class Student
{
abstract void study();
abstract void study1();
}
class BaseStudent extends Student
{
void study()
{
  System.out.println("base study");
}
}
class AbstractTest
{
public static void main(String[] args)
{
  //System.out.println("Hello World!");
  new BaseStudent().study();
}
}
当进行编译运行的时候,提示编译错误,“AbstractTest.java:6: 错误: BaseStudent不是抽象的, 并且未覆盖Student中的抽象方法study1()”
编译没有通过,但是却产生了Student.class文件。为什么?
不是编译没有通过么,为什么还产生了.class文件?

6 个回复

正序浏览
遗失的美好YXJ 发表于 2014-7-10 20:40
没,我锻炼下表达能力,有些东西自己感觉懂,但就是说不出来.总结总结能写的出来才算懂了 ...

嗯。也是。
回复 使用道具 举报
刘亚东 发表于 2014-7-10 12:46
明白些了!讲的好详细!好耐心!
感觉你基础很扎实啊!

没,我锻炼下表达能力,有些东西自己感觉懂,但就是说不出来.总结总结能写的出来才算懂了
回复 使用道具 举报
遗失的美好YXJ 发表于 2014-7-10 06:36
(个人理解,不知道对不对的啊)
程序的执行就是在内存加载的过程,这段程序从主函数为入口.执行New BaseStud ...

明白些了!讲的好详细!好耐心!
感觉你基础很扎实啊!
回复 使用道具 举报
刘亚东 发表于 2014-7-10 01:17
通俗易懂!似乎明白些了~
不过第三个问题还是不太明白,是只要其他类没有问题,加载痛过了就会产生.class ...

(个人理解,不知道对不对的啊)
程序的执行就是在内存加载的过程,这段程序从主函数为入口.执行New BaseStudent().study()的时候,是先找Basestudent类,找到了一看,你还有个爹(父类),那就先看你爹吧.(必须先看父类,父类的成员变量先进内存进行初始化,然后子类才能继承,继承了不爽,子类自己定义一个同名的,如果子类调用该变量的时候调用的是子类的)先看爹类的内容就把abstract class Student给加载进内存了,这部分没问题,所有有class文件生成,然后爹类结束了,轮到了BaseStudent类加载,一加载发现小子居然不按套路来,所有就报错了.程序终止.
所以关键是搞懂程序的执行顺序.
回复 使用道具 举报
本帖最后由 刘亚东 于 2014-7-10 01:18 编辑
遗失的美好YXJ 发表于 2014-7-10 01:06
难得沙发一回
问题1: 子类是不是抽象类关键看有没有abstract修饰,(这是个语法问题,人家java就这么规定的,你 ...

通俗易懂!似乎明白些了~
不过第三个问题还是不太明白,是只要其他类没有问题,加载痛过了就会产生.class文件?跟主方法所在类是否编译成功没关系?
回复 使用道具 举报
难得沙发一回
问题1: 子类是不是抽象类关键看有没有abstract修饰,(这是个语法问题,人家java就这么规定的,你能怎样).有abstract修饰,就算一个抽象方法没有,那也是抽象类,不能创建对象.没abstract修饰的类如果没有完全复写抽象类中的抽象方法那么编译肯定会报错.所以你想的那种情况是不存在的.
问题2:貌似类不是调用方法,而是继承或者重写方法吧,调用是对象调用的.那么又回到问题1了,其实就是没把所有抽象方法重写的类必须是抽象类,妄图不加abstract来欺骗虚拟机的行为只会报错.所以问题2问的逻辑有点问题吧.(或者我水平菜,有更高端的解释)

最后问的.class的文件是我自己猜的.因为Student类是没问题的,而且加载顺序的话也应该是Student在前,所以才会有Student.class文件,而没有其它两个类的.class文件.
一个文件里面写几个类,编译的时候就会产生几个类的.class文件,并不是就一个的.

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马