JAVA 方法 默认访问级别

一直认为默认访问级别的java 方法对子类是不可见的,也就是不能被继承的,但是下面的例子挑战了这个看法

public class TT {
    public static void main(String[] args) {
        B b=new B();
        System.out.println(b.getA());
                  System.out.println(b.getB());
    }
}

class A {
    int x = 1;
    int getA() {
        return x;
    }
}

class B extends A {
    int x = 2;
    int getB() {
        return x;
    }
}


这个getA明显是默认访问级别private,为什么B能调用getA()?

原来默认的访问级别是package-private, 意思是该方法对同一package中的class是可见的,也是可继承的。

如果把A的类访问级别改为public,把B放到另一个package中,那么B将不能访问A的getA()方法。

 参考

### Java 中四种访问修饰符的定义与区别 #### 定义 Java 提供了 `public`、`private`、`protected` 和默认(default)这四种访问控制级别,用于限定类、方法、构造器以及变量的可访问范围。 - **Public 访问修饰符** 使用 `public` 关键字声明的成员具有最广泛的访问权限[^1]。无论是在同一个包内还是跨包,所有的类都可以访问这些成员。这种修饰符常用于提供公开接口的功能[^2]。 - **Private 访问修饰符** 被标记为 `private` 的成员仅限于其所属类内部访问和修改[^3]。这是最为严格的访问限制形式,主要用于实现数据隐藏和封装原则。当某些字段或方法不需要暴露给外界时,通常会选择将其设为私有[^4]。 - **Protected 访问修饰符** 声明为 `protected` 的成员不仅可以在本类及其所在包内的其他类中访问,在继承关系下也可以由子类访问即使该子类位于另一个包中。因此,它比 `default` 更开放一些但又不像 `public` 那样完全无约束。 - **Default (Package-private)** 访问级别 如果未显式指定任何访问修饰符,则采用默认访问级别即 package-private 。这意味着只有在同一包下的其它类才能访问此类成员而无法跨越到不同包去调用他们。 #### 区别对比表 | 访问控制 | 同一包内相同类 | 同一包内不同类 | 不同包内子类 | 不同包内非子类 | |----------|------------------|-------------------|---------------|----------------| | Public | 是 | 是 | 是 | 是 | | Protected | 是 | 是 | 是 *(如果是子类)* | 否 | | Default | 是 | 是 | 否 | 否 | | Private | 是 | 否 | 否 | 否 | 上述表格总结了每种访问级别的具体适用场景及差异之处。 ```java // 示例代码展示各种访问修饰符的实际效果 package com.example; class Parent { public String publicVar = "Public"; private String privateVar = "Private"; protected String protectedVar = "Protected"; String defaultVar = "Default"; public void accessVariables() { System.out.println(publicVar); // 输出: Public System.out.println(privateVar); // 输出: Private System.out.println(protectedVar); // 输出: Protected System.out.println(defaultVar); // 输出: Default } } class Child extends Parent { public void displayParentVars(){ System.out.println(super.publicVar); // 正确 //System.out.println(super.privateVar); // 错误 - 私有的不可见 System.out.println(super.protectedVar); // 正确 System.out.println(super.defaultVar); // 正确 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值