后期绑定?Field vs Property.自我与静态

bea*_*eek 3 java

这让我困扰了很长时间,所以我想我会继续问问.

如果我写

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
            new Shape();
            new Triangle();
    }

    public static class Shape
    {
            static String name = "shape";

            Shape()
            {
                    printName();
            }

            public void printName()
            {
                    System.out.println( name() );
            }

            public String name()
            {
                    return name;
            }
    }

    public static class Triangle extends Shape
    {
            static String name = "triangle";

            public String name()
            {
                    return name;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么输出就是

shape
triangle
Run Code Online (Sandbox Code Playgroud)

但如果我写

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
            new Shape();
            new Triangle();
    }

    public static class Shape
    {
            static String name = "shape";

            Shape()
            {
                    printName();
            }

            public void printName()
            {
                    System.out.println( name );
            }

    }

    public static class Triangle extends Shape
    {
            static String name = "triangle";
    }
}
Run Code Online (Sandbox Code Playgroud)

那么输出就是

shape
shape
Run Code Online (Sandbox Code Playgroud)

在第一个版本中,我必须将相同的函数getName()一遍又一遍地复制/粘贴到每个子类中.必须有一个更好的方法.在第二个例子中我需要改变什么?

And*_*niy 5

父类不能访问静态字段.类Shape不会"看到" nameTriangle的静态字段并使用自己的静态字段name.

UPD:你问:你需要在第二个例子中改变什么?更具体地说,您的第一个示例是正确"修复"您的第二个示例.唯一正确的方法是使用一些像你的name()方法一样的getter 方法.

UPD2 :(来自我的评论):嗯,另一种方式:原谅任何一种领域name.使用相反的方法调用name()(非静态!),它将在每个类中返回所需的名称.只是return "shape";return "triangle"在其中.