如何通过子类访问父类变量

时间:2018-12-12 09:10:52

标签: java oop inheritance

我正在尝试由开发人员自行决定重新构建OOP方法进行移动验证。我提出的概念是允许接口操纵类。如果该类实现了该接口,则将执行verify方法。

我所面临的问题,因为我只习惯于使用不太强类型的语言(PHP)进行编程,那就是如何从扩展当前类的类中获取受保护的变量。

_areaCodes.stream().forEach(o -> {
    try {
        int prefix = Integer.parseInt(this._mobileNumber.charAt(0), this._mobileNumber.charAt(1));
    } catch (Exception e) {}
});

这行代码现在给我一个错误

  

_mobileNumber无法解析或不是字段

这是我的完整代码,这里是an example,是我在PHP中用Java尝试实现的相同概念。

import java.util.ArrayList;

interface Verification
{
    public void initVerification();
}

class AreaCode
{
    private int _code;
    private String _country;

    public AreaCode(int code, String country)
    {
        this._code = code;
        this._country = country;
    }

    public int getAreaCode() { return this._code; }
    public String getAreaCountry() { return this._country; }
}

class VerificationHandler
{
    private ArrayList<AreaCode> _areaCodes = new ArrayList<AreaCode>() {{
        this.add(new AreaCode(44, "UNITED KINGDOM"));
        this.add(new AreaCode(91, "INDIA"));
    }};

    public void initVerification()
    {
        if(this instanceof Verification) {
            this.verify();
        }
    }

    protected void verify()
    {
        _areaCodes.stream().forEach(o -> {
        try {
            int prefix = Integer.parseInt(this._mobileNumber.charAt(0), this._mobileNumber.charAt(1));
        } catch (Exception e) {}
    });
    }
}


class Main extends VerificationHandler implements Verification {
    protected String _mobileNumber = "+447435217761";
}

public class Hack1337 { public static void main(String[] args) { new Main(); } }

如何在扩展另一个类的类中检索变量,即:

class A { public String getB() { return this.b; } }
class B extends A { protected String b = 'A should get this'; }
B b = new B().getB();

1 个答案:

答案 0 :(得分:1)

只有类B或子类B的实例可以直接访问b实例变量(除非您在其中将A强制转换为B A类的主体,这是一种不好的做法)。

您可以通过覆盖A来授予类getB()对该值的只读访问权限:

class B extends A
{ 
    protected String b = 'A should get this';

    @Override
    public String getB() { 
        return this.b; 
    } 
}

并且您可能还想使getB()类中的A方法抽象(这意味着使类A抽象):

abstract class A 
{
    public abstract String getB();
}

仅当期望A的不同子类返回getB()中的不同内容时,这才有意义。否则,您也可以将b变量移至基类A