我创建了3个类,一个超类“ a”,以及两个子类“ b”和“ c”。我正在创建c的实例,给它一个整数“ n”,然后使用子类b进行一些计算。我遇到的问题是,当我创建实例c来调用b时,数据在技术上属于超类a / c吗?所以当我用
创建b的实例时b b_instance = new b();
在c实例内部, 我调用的b calc()函数将返回0。我猜是因为b有它自己的数据生态圈了?
我该怎么做?
2)
另外,我如何调用同名的超类函数?
谢谢!
public class prog
{
public static void main(String args[])
{
c c1 = new c();
c1.run();
}
}
class a
{
private int number;
void set_number(int n)
{
number = n;
}
int get_number()
{
return number;
}
int calc()
{
return number*2;
}
}
class b extends a
{
int calc()
{
// calling the superclass function calc, then subtract
return super.calc() - get_number();
}
}
class c extends a
{
void run()
{
set_number(1);
b b1 = new b();
System.out.println(b1.calc());
}
}
无限循环问题
public class prog
{
public static void main(String args[])
{
c c1 = new c();
c1.run();
}
}
class a
{
void calc_a()
{
System.out.println("") ;
}
void calc_b()
{
calc_a(); // meaning the calc_a() in the superclass
}
}
class b extends a
{
void calc_a()
{
super.calc_b();
}
}
class c extends a
{
void run()
{
b b1 = new b();
b1.calc_b();
}
}
答案 0 :(得分:1)
b b_instance = new b();
在c实例内部,我调用的b calc()函数将返回0。 我猜是因为b有它自己的数据生态圈?
我该怎么做?
可能的方式“一对”。我会考虑从c
扩展b
,这样c
获得a
和b
的所有功能,就像...
class c extends b {
void run() {
set_number(1);
System.out.println(calc());
}
}
但是,如果这不可行(出于某种原因或其他原因),则需要将c
必须具有的值传递给b
,类似...
class c extends a {
void run() {
set_number(1);
b b1 = new b();
b1.set_number(get_number());
System.out.println(b1.calc());
}
}
现在,话虽如此,这让我“闻起来”。从a
扩展以使c
可以执行b
有什么意义?这会给我敲响警钟。
问题是,如果您调用c#calc
,则仅使用a
的{{1}}方法...基于calc
的方法似乎没有成为您想要实现的目标,所以这一切都是一团糟
2)
还,我如何调用同名的超类函数?
因为直接调用run
会导致calc
,因为您经常不断地自称自己。
在这种情况下,您要进行StackOverflowError
正在进行的操作并对其进行修改。这是OO语言中的常见做法。
Java(和Java社区)已经有一套定义明确的编码实践。您应该花一些时间来学习它们,这将使您的代码更易于阅读,并使您更容易阅读其他人的代码。
以Code Conventions for the Java TM Programming Language
开头类名应以大写字母开头,方法在a
中,例如...
camelCase
class A {
private int number;
void setNumber(int n) {
number = n;
}
int getNumber() {
return number;
}
int calc() {
return number * 2;
}
}
您需要问自己的问题是,class a {
void calc_a() {
System.out.println("");
}
void calc_b() {
calc_a(); // meaning the calc_a() in the superclass
}
}
class b extends a {
void calc_a() {
super.calc_b();
}
}
class c extends a {
void run() {
b b1 = new b();
b1.calc_b();
}
}
为什么需要覆盖b
?为什么不覆盖calc_a
?可以解决问题
我如何覆盖它?
calc_b