如何在多级继承中从另一个派生 class 访问派生 class 的字段
how to access fields of derived class from another derived class in multilevel inheritance
我想通过这个程序来理解多级继承
import java.util.Scanner;
class Student{
public
int rno;
String stud_name;
Student(int r, String name){
rno = r;
stud_name = name;
}
}
class sports extends Student{
public
int pts;
sports(int rno, String name, int points){//line 16
pts = points;
super(rno,name); //line 18
}
}
class results extends sports{
public
int [] mark = new int[2];
int sum =0;
results(int rno, String name, int marks[], int points){
super(rno,name,points);
this.mark = marks;
}
void display(){
for(int i = 0; i<3; i++){
sum += mark[i];
}
System.out.println("Student Name: "+super.stud_name);
System.out.println("Student Roll no"+super.rno);
System.out.println("Sports points: "+super.pts);
System.out.println("Total marks: "+sum);
}
}
class Main{
public static void main(String args[]){
Scanner s = new Scanner(System.in);
int rollno;
int points;
String name;
int[] marks = new int[5];
System.out.println("Enter Student name");
name = s.nextLine();
System.out.println("Enter Student roll no");
rollno = s.nextInt();
for(int i = 0; i<3; i++){
System.out.println("Enter the"+i+"th mark");
marks[i] = s.nextInt();
}
System.out.println("Enter Sports pts");
points = s.nextInt();
results stud = new results(rollno, name, marks, points);
stud.display();
}
}
但我遇到了这些错误
Main.java:16: error: constructor Student in class Student cannot be applied to given types;
sports(int rno, String name, int points){
^
required: int,String
found: no arguments
reason: actual and formal argument lists differ in length
Main.java:18: error: call to super must be first statement in constructor
super(rno,name);
^
2 errors
当我试图解决这个错误时,我遇到了新的疑问
1) 如果 super 关键字引用立即数 parent class 对,那么我如何访问变量 rno
和 stud_name
from results class(results class's immediate parent is 运动 class 不是 学生 class)。如果我理解错了 结果 class's immediate parent is student class 那怎么办我从 results class.
访问 sports class 中的变量
请帮我解决这个错误,我尝试在网上搜索解决方案和示例,但我只找到带有 1 child class.
的程序
错误本身很容易解决,只需将 super() 调用放在构造函数的开头即可,如错误消息所示:
sports(int rno, String name, int points){
super(rno,name);
pts = points;
}
但是,您的代码中有很多东西很臭,我建议您检查一下:
- 整洁的代码:遵循命名约定,class 名称以大写字母开头,例如 Sport 或 Result,不要让它们成为复数形式
- 了解 OOP 的概念,继承不是为了扩展 class 具有更多字段。继承是为了扩展 class' 功能,因此子项可以在父项可以使用的任何地方使用。
如果您想在 class 中添加新字段,只需在其字段中添加一个新的 class,如下所示:
class results { // no need for inheritance
...
Sports sports;
results(int rno, String name, int marks[], int points) {
sports = new Sports(rno, name, points); // initialize the field
this.mark = marks;
}
void display() {
...
System.out.println("Student Name: " + sports.stud_name); // you reach it's fields like this
}
}
- 您还应该将不同的 class 定义放在不同的 .java 文件中,并研究可见性修饰符的使用
我想通过这个程序来理解多级继承
import java.util.Scanner;
class Student{
public
int rno;
String stud_name;
Student(int r, String name){
rno = r;
stud_name = name;
}
}
class sports extends Student{
public
int pts;
sports(int rno, String name, int points){//line 16
pts = points;
super(rno,name); //line 18
}
}
class results extends sports{
public
int [] mark = new int[2];
int sum =0;
results(int rno, String name, int marks[], int points){
super(rno,name,points);
this.mark = marks;
}
void display(){
for(int i = 0; i<3; i++){
sum += mark[i];
}
System.out.println("Student Name: "+super.stud_name);
System.out.println("Student Roll no"+super.rno);
System.out.println("Sports points: "+super.pts);
System.out.println("Total marks: "+sum);
}
}
class Main{
public static void main(String args[]){
Scanner s = new Scanner(System.in);
int rollno;
int points;
String name;
int[] marks = new int[5];
System.out.println("Enter Student name");
name = s.nextLine();
System.out.println("Enter Student roll no");
rollno = s.nextInt();
for(int i = 0; i<3; i++){
System.out.println("Enter the"+i+"th mark");
marks[i] = s.nextInt();
}
System.out.println("Enter Sports pts");
points = s.nextInt();
results stud = new results(rollno, name, marks, points);
stud.display();
}
}
但我遇到了这些错误
Main.java:16: error: constructor Student in class Student cannot be applied to given types; sports(int rno, String name, int points){ ^ required: int,String found: no arguments reason: actual and formal argument lists differ in length Main.java:18: error: call to super must be first statement in constructor super(rno,name); ^ 2 errors
当我试图解决这个错误时,我遇到了新的疑问
1) 如果 super 关键字引用立即数 parent class 对,那么我如何访问变量 rno
和 stud_name
from results class(results class's immediate parent is 运动 class 不是 学生 class)。如果我理解错了 结果 class's immediate parent is student class 那怎么办我从 results class.
请帮我解决这个错误,我尝试在网上搜索解决方案和示例,但我只找到带有 1 child class.
的程序错误本身很容易解决,只需将 super() 调用放在构造函数的开头即可,如错误消息所示:
sports(int rno, String name, int points){
super(rno,name);
pts = points;
}
但是,您的代码中有很多东西很臭,我建议您检查一下:
- 整洁的代码:遵循命名约定,class 名称以大写字母开头,例如 Sport 或 Result,不要让它们成为复数形式
- 了解 OOP 的概念,继承不是为了扩展 class 具有更多字段。继承是为了扩展 class' 功能,因此子项可以在父项可以使用的任何地方使用。
如果您想在 class 中添加新字段,只需在其字段中添加一个新的 class,如下所示:
class results { // no need for inheritance
...
Sports sports;
results(int rno, String name, int marks[], int points) {
sports = new Sports(rno, name, points); // initialize the field
this.mark = marks;
}
void display() {
...
System.out.println("Student Name: " + sports.stud_name); // you reach it's fields like this
}
}
- 您还应该将不同的 class 定义放在不同的 .java 文件中,并研究可见性修饰符的使用