Java分层继承中跨子类调用方法报错求助
Java继承代码报错问题修复
我创建了14个类,其中a1为父类,a2、b1、c1直接继承自a1;a3、a4继承自a2;a5继承自a3;a6、a7、a8继承自a4;b2、b3继承自b1;c2、c3继承自c1。父类a1中初始化了多个int类型变量,a2、b1、c1中声明了n9变量。
需求是:
- 使用
a3子类调用a5中定义的add5方法 - 使用
a4调用a6、a7、a8中分别定义的add6、add7、add8方法
但运行代码时出现无法解决的报错,以下是原代码:
class a1{ int n1=80,n2=70,n3=60,n4=50,n5=40,n6=30,n7=20,n8=10; } class a2 extends a1{ int n9; } class a3 extends a2{ add5(); } class a4 extends a2{ add6(); add7(); add8(); } class a5 extends a3{ public void add5(){ n9=n1+n2+n3+n4+n5; System.out.println("sum is : "+n9); } } class a6 extends a4{ public void add6(){ n9=n1+n2+n3+n4+n5+n6; System.out.println("sum is : "+n9); } } class a7 extends a4{ public void add7(){ n9=n1+n2+n3+n4+n5+n6+n7; System.out.println("sum is : "+n9); } } class a8 extends a4{ public void add8(){ n9=n1+n2+n3+n4+n5+n6+n7+n8; System.out.println("sum is : "+n9); } } class b1 extends a1{ int n9; } class b2 extends b1{ public void sub2(){ n9=n1-n2-n3; System.out.println("subtraction is : "+n9); } } class b3 extends b1{ public void sub3(){ n9=n1-n2-n3-n4; System.out.println("subtraction is : "+n9); } } class c1 extends a1{ int n9; } class c2 extends c1{ public void mul2(){ n9=n1*n2*n3; System.out.println("multi is : "+n9); } } class c3 extends c1{ public void mul3(){ n9=n1*n2*n3*n4; System.out.println("multi is : "+n9); } } class hei{ public static void main(String[] args) { a8 obj1= new a8(); obj1.add8(); } }
错误分析
- 语法错误:
a3和a4类中的add5();、add6();等写法完全不符合Java语法规范——既不是合法的方法定义(缺少返回类型、访问修饰符),也不能直接在类体中写无上下文的方法调用语句。 - 继承逻辑错误:
a3是a5的父类,父类对象无法直接调用子类独有的方法,add5是a5中定义的专属方法,a3本身没有该方法,直接调用会报错。- 同理,
a4是a6、a7、a8的父类,add6、add7、add8分别是这三个子类的独有方法,a4对象无法直接调用。
修复后的代码示例
先移除a3、a4中错误的方法声明,再根据继承逻辑调整调用方式:
class a1{ int n1=80,n2=70,n3=60,n4=50,n5=40,n6=30,n7=20,n8=10; } class a2 extends a1{ int n9; } class a3 extends a2{ // 移除错误的add5();声明 } class a4 extends a2{ // 移除错误的add6();、add7();、add8();声明 } class a5 extends a3{ public void add5(){ n9=n1+n2+n3+n4+n5; System.out.println("sum is : "+n9); } } class a6 extends a4{ public void add6(){ n9=n1+n2+n3+n4+n5+n6; System.out.println("sum is : "+n9); } } class a7 extends a4{ public void add7(){ n9=n1+n2+n3+n4+n5+n6+n7; System.out.println("sum is : "+n9); } } class a8 extends a4{ public void add8(){ n9=n1+n2+n3+n4+n5+n6+n7+n8; System.out.println("sum is : "+n9); } } class b1 extends a1{ int n9; } class b2 extends b1{ public void sub2(){ n9=n1-n2-n3; System.out.println("subtraction is : "+n9); } } class b3 extends b1{ public void sub3(){ n9=n1-n2-n3-n4; System.out.println("subtraction is : "+n9); } } class c1 extends a1{ int n9; } class c2 extends c1{ public void mul2(){ n9=n1*n2*n3; System.out.println("multi is : "+n9); } } class c3 extends c1{ public void mul3(){ n9=n1*n2*n3*n4; System.out.println("multi is : "+n9); } } class hei{ public static void main(String[] args) { // 调用a5的add5:直接创建a5对象,或把a3向下转型为a5 a5 objA5 = new a5(); objA5.add5(); a3 objA3 = new a5(); ((a5)objA3).add5(); // 调用a6、a7、a8的方法:创建对应子类对象 a6 objA6 = new a6(); objA6.add6(); a7 objA7 = new a7(); objA7.add7(); a8 objA8 = new a8(); objA8.add8(); } }
内容的提问来源于stack exchange,提问作者SAURABH7DEOKATE
相关产品推荐
相关产品推荐

