私は次のシナリオを持っています:
public class A {
private int x = 5;
public void print()
{
System.out.println(x);
}
}
public class B extends A {
private int x = 10;
/*public void print()
{
System.out.println(x);
}*/
public static void main(String[] args) {
B b = new B();
b.print();
}
}
コードを実行すると、出力は次のようになります。5。
親クラスのメソッドを介して子クラス(B)の変数(x)にアクセスする方法
これは可能ですかなし print()メソッドをオーバーライドしますか(つまり、Bでコメント解除します)?
[オーバーライドすると、print()メソッドのコード全体を再度書き換える必要があるため、これは重要です。]
[〜#〜]編集済み[〜#〜]
より明確化:-
(あなたの時間と助けに感謝します)
class A {
private int x = 5;
protected int getX() {
return x;
}
protected void setX(int x) {
this.x = x;
}
public void print() {
// getX() is used such that
// subclass overriding getX() can be reflected in print();
System.out.println(getX());
}
}
class B extends A {
public B() {
// setX(10); // perhaps set the X to 10 in constructor or in main
}
public static void main(String[] args) {
B b = new B();
b.setX(10);
b.print();
}
}
[〜#〜]編集済み[〜#〜]
以下は、抽象クラスとメソッドを使用して同様のシナリオを解決する一般的な回答です。
abstract class SuperA {
protected abstract Object getObj();
public void print() {
System.out.println(getObj());
}
}
class A extends SuperA {
@Override
protected Object getObj() {
// Your implementation
return null; // return what you want
}
}
class B extends A {
@Override
protected Object getObj() {
// Your implementation
return null; // return what you want
}
public static void main(String[] args) {
B b = new B();
b.print();
}
}
ここに投稿されたすべての回答を読んだ後、私は探していたものを手に入れました。以下は私の質問に対する最良の答えであると私が感じているものです:
_public class A {
private int x = 5;
protected int getX(){
return x;
}
public void print(){
System.out.println(getX());
}
}
public class B extends A {
private int x = 10;
protected int getX(){
return x;
}
public static void main(String[] args) {
B b = new B();
b.print();
}
}
_
保護されたゲッターを設定してオーバーライドすることは、print()
メソッド自体をオーバーライドするよりも優れています。これは、printメソッドの代わりに、子クラス変数の値にアクセスする必要のある巨大なメソッドが存在する可能性があるためです。 s)。
質問を解決するには、保護されているように親クラスAのフィールドを定義し(子クラスで継承されるようにする)、子クラスBのコンストラクター内にフィールド値xを設定する必要があります。printメソッドは、親クラスから直接呼び出すことができるクラス。
これがお役に立てば幸いです。
public class A
{
// fields declaration
protected int x = 5;
public void print()
{
System.out.println(x);
}
}
public class B extends A
{
public B()
{
// set child x value. The field have been defined in the parent class
x = 10;
}
public static void main(String[] args)
{
A a = new A();
a.print(); // print 5
B b = new B();
b.print(); // print 10
}
}
必要な値のゲッターを公開し、子クラスでそれをオーバーライドする必要があります。
そのようです:
public class A {
private int x = 5;
public void print()
{
System.out.println(getX());
}
protected void setX(int x)
{
this.x = x;
}
protected int getX()
{
return x;
}
}
public class B extends A {
/*public void print()
{
System.out.println(x);
}*/
public B()
{
setX(10);
}
public static void main(String[] args) {
B b = new B();
b.print();
}
}
いつでもコンストラクタに追加できます。
public class B extends A {
//this line is unnecessary: private int x = 10;
/*public void print()
{
System.out.println(x);
}*/
public B()
{
x=10;
}
public static void main(String[] args) {
B b = new B();
b.print();
}
}
試してみても機能しないのは、デフォルト値が一度しか評価されないためです。したがって、Aのデフォルトが5の場合、Bでデフォルトの10を使用しても5のままです。