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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马罗坚 金牌黑马   /  2012-4-26 20:23  /  2476 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当子类继承父类时 装载子类时同时也装载类父类 获得了父类的静态成员  想要得到父类的非静态方法要先初始化父类
那么父类要是抽象类 如果抽象类不能被实例化那不是获取不到父类的非静态成员吗? 因为那时还没有父类对象
下面代码证明了抽象类也是可以实例化的 因为调用了父类的构造方法和非静态成员
abstract class Work{
private int a;
public  Work(){
  System.out.println(a);
}
public void run(){
  System.out.println("11111");
}
}
class Kk extends Work{
public Kk(){
  super(); //只能通过该方法初始化父类
}
public static void main(String[] args) {
  new Kk().run();
  //new Work();  不能通过new 来初始化父类
}
}
结果为
0   
11111   

子类覆盖方法时只能抛出父类异常的子类吗?
通过下面的代码结果了解到即使父类没抛出运行期异常子类也可以抛出运行期异常或子异常
class T{
void run(){
  System.out.print("fu");
}
}
class T1 extends T{
void run()throws RuntimeException,BufferUnderflowException{
  System.out.print("zi");
}
public static void main(String[] args) {
  T t=new T1();
  t.run();
}
}
编译通过 结果是zi  证明覆盖成功

很多书上都说子类抛出的异常必须是父类抛出的子异常
那么如果笔试时有个判断题  子类抛出的异常必须是父类抛出的子异常 是打勾还是X了  

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

2 个回复

倒序浏览
运行时异常是一种特别的异常 ,编译时不会检查它,它是直接抛给java虚拟机
回复 使用道具 举报
确实抽象类可以实例化,但是必须通过子类进行实例,因为子类需要继承父类中的属性与方法,所以必须通过子类进行实例化。
至于异常。。。。。。是这样的,Java中的异常体系分为:编译时异常与运行时异常
编译时异常是对编译器说的,编译器告诉你不符合Java语法,这样的异常通常是可以处理的。
而运行时异常一般是不可处理的,即不是程序有问题,而是调用者输入的不合法,这时我们没办法处理,因为一处理就等于把问题给隐藏了,所以
必须让程序停止运行。
子类中不能抛父类中没有声明的异常,因为父类中的方法需要子类继承,当我们把子类当做父类使用的时候,子类抛的异常是自己定义的,
在捕获异常中用的依然是父类的catch(FuException e),但是你却传的是子类异常,所以不能定义父类中没有的异常。
但是

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

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