java为什么这个方法不可见

时间:2014-09-25 21:58:02

标签: java

为什么getPlatformId()在子类方法SalesforcePlatform中对getPlatformName()不可见?代码块不完整。 SalesforcePlatformPlatform的孩子。它与Platform不同,但这不应阻止它访问Platform的受保护方法,对吗?

很抱歉,如果我错过了一些明显的事情

package com.dragon.dictionary;

public class Platform extends RepositoryObject
  implements IPlatform{

  protected final Long id ;
  protected final String  name;
  protected static final String platformDbTbl = DragonConstants.TABLE_PREFIX + "platform";


  protected Platform(Long platformId, String platformName){
    id = platformId;
    name = platformName;
  };

  protected Platform(String platformName){
    Platform platform = Platform.getPlatformByName(platformName);
    id = platform.getPlatformId();
    name = platformName;
  };

  protected Long getPlatformId(){
    return this.id;
  };

  protected String getPlatformName(){
    return this.name;
  }

  ....

}




package com.dragon.dictionary.salesforce;

import com.dragon.dictionary.Platform;

public class SalesforcePlatform extends Platform{

  // prevent instantiation
  private SalesforcePlatform() {
    super("salesforce");
  }

  private SalesforcePlatform(Long platformId, String platformName) {
    super(platformId, platformName);
  }  

  public static SalesforcePlatform getPlatformByName(String platformName){
    Platform platform = Platform.getPlatformByName(platformName);
    SalesforcePlatform salesforcePlatform = new SalesforcePlatform(platform.getPlatformId(), platform.getPlatformName());
    return salesforcePlatform;
  }
}

编辑:

谢谢!所以根据回答,你是说,这将在子类中起作用:

  private SalesforcePlatform(Platform platform) {
    this.id = platform.getPlatformId();
    this.name = platform.getPlatformName();
  }

2 个答案:

答案 0 :(得分:4)

您不是从子类调用受保护的方法,而是从静态方法调用。 静态方法在子类中定义的事实是无关紧要的。

编辑:

  

谢谢!所以根据回答,你是说,这可以在子类中起作用

新的更新代码有两个问题: - 您的PlatForm类没有默认构造函数,因此您需要调用超级构造函数并传递参数 - 您要分配的字段是最终的。它们已经由你的超类构造函数设置。

答案 1 :(得分:2)

规则说:

  

对象的受保护成员或构造函数可以从包外部访问,只能通过负责实现该对象的代码来声明它。

请参阅here for the documentation