java 抽象方法默认访问权限

abstract方法的访问权限是default  ?

来源:    jdk1.7.0_80

本地新建类:MyJedisCluster,继承自JedisCluster。新建方法getConnectionFromSlot,通过卡槽slot号获取对应节点的Jedis实例。

package cn.com.myjedis;

public class MyJedisCluster extends JedisCluster {
    
    public MyJedisCluster(HostAndPort node) {
        super(node);
    }

    public Jedis getConnectionFromSlot(int slot) {
        return super.connectionHandler.getConnectionFromSlot(slot);
    }
}

JedisCluster来自jedis-2.9.0-sources.jar中的的redis.clients.jedis包中的类。

package redis.clients.jedis;

public class JedisCluster extends BinaryJedisCluster implements JedisCommands,
    MultiKeyJedisClusterCommands, JedisClusterScriptingCommands {

  public static enum Reset {
    SOFT, HARD
  }

  public JedisCluster(HostAndPort node) {
	this(Collections.singleton(node), DEFAULT_TIMEOUT);
  }

  。。。。。。。

}

JedisCluster继承自BinaryJedisCluster类。

package redis.clients.jedis;

public class BinaryJedisCluster implements BasicCommands, BinaryJedisClusterCommands,
    MultiKeyBinaryJedisClusterCommands, JedisClusterBinaryScriptingCommands, Closeable {

  public static final short HASHSLOTS = 16384;
  protected static final int DEFAULT_TIMEOUT = 2000;
  protected static final int DEFAULT_MAX_REDIRECTIONS = 5;

  protected int maxAttempts;

  protected JedisClusterConnectionHandler connectionHandler;

  public BinaryJedisCluster(Set<HostAndPort> nodes, int timeout) {
    this(nodes, timeout, DEFAULT_MAX_REDIRECTIONS, new GenericObjectPoolConfig());
  }

  public BinaryJedisCluster(Set<HostAndPort> nodes) {
    this(nodes, DEFAULT_TIMEOUT);
  }

  。。。。。。
}
本地新建类MyJedisCluster中的super.connectionHandler即来自于BinaryJedisCluster中定义。
connectionHandler是JedisClusterConnectionHandler类定义的实例。
getConnectionFromSlot方法是JedisClusterConnectionHandler类中的抽象方法。没有访问权限标识。
package redis.clients.jedis;

public abstract class JedisClusterConnectionHandler implements Closeable {
  protected final JedisClusterInfoCache cache;

  public JedisClusterConnectionHandler(Set<HostAndPort> nodes,
                                       final GenericObjectPoolConfig poolConfig, int connectionTimeout, int soTimeout, String password) {
    this.cache = new JedisClusterInfoCache(poolConfig, connectionTimeout, soTimeout, password);
    initializeSlotsCache(nodes, poolConfig, password);
  }

  abstract Jedis getConnection();

  abstract Jedis getConnectionFromSlot(int slot);

  public Jedis getConnectionFromNode(HostAndPort node) {
    return cache.setupNodeIfNotExist(node).getResource();
  }
  
  public Map<String, JedisPool> getNodes() {
    return cache.getNodes();
  }

  。。。。。。
}

现象:

MyJedisCluster类中报错:

getConnectionFromSlot(int)在redis.clients.jedis.JedisClusterConnectionHandler中不是公共的; 无法从外部程序包中对其进行访问

原因:

getConnectionFromSlot是抽象方法,访问权限默认是default,只能在本包内访问。

解决:

将MyJedisCluster类放到本地新建package路径下:redis.clients.jedis;

package redis.clients.jedis;

public class MyJedisCluster extends JedisCluster {
    
    public MyJedisCluster(HostAndPort node) {
        super(node);
    }

    public Jedis getConnectionFromSlot(int slot) {
        return super.connectionHandler.getConnectionFromSlot(slot);
    }
}

以上,问题解决。

附:

牛客网上看到有人回复关于抽象类

JDK 1.8以前,抽象类的方法默认访问权限为protected

JDK 1.8时,抽象类的方法默认访问权限变为default

而我用的jdk1.7.0_80也是default。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值