关于protected关键字的理解

CSDN的一个帖子启发了这篇blog.在以下JBuilder2005中调试,可以看看错误提示,那就是问题的答案了.

先看如下两个例子:

package com.tom;

public class Supper {
    public Supper() {
    }
   
    protected void f1() {
        System.out.println("can see f1()");
    }
   
    void f2() {
        System.out.println("can see f2()");
    }
   
    static  protected void staticF1() {
        System.out.println("can see staticf1()");
    }

    static void staticF2() {
        System.out.println("can see staticf2()");
    }

   
   
    public static void main(String[] args) {
        Supper supper = new Supper();
    }
}

 

package com;

import com.tom.Supper;

public class Sub extends Supper {
    public Sub() {
    }
    void subF1() {
        f1();  //父类的f1()
        //f2();  //这只在通一个包中才可见
    }
    public static void main(String[] args) {
        Sub sub = new Sub();
        Supper supper = new Supper();
        //supper.f1();  //有问题!
        //supper.f2();  //有问题!一句话,在包外通过一个类的引用只能访问该类public方法.
        sub.f1();

        sub.staticF1();
       //sub.staticF2();
       supper.staticF1();  //???这个为什么可以,就不明白了?
       //supper.staticF2();
    }
}

上面例子中的supper.f1()和supper.f2()为什么可以,就值得讨论了.因为这正式protected关键字的作用.

包外子类引用可以访问父类的protected函数.但此时包外子类的父类实例引用只能访问父类的public方法,其他的
protected,默认,都不能通过父类的实例引用访问的---这是为什么呢?解释如下:在子类和父类在不同的包时:子类实例引用可以访问父类的public和protected方法(这不正是Java中protected关键字的作用吗?);而此时如果包外生成父类的实例引用,那么这个父类的实例引用只能访问父类的public方法的.

至于supper.staticF1()为什么可以通过现在还不明白!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值