A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

ljh11849

初级黑马

  • 黑马币:0

  • 帖子:9

  • 精华:0

© ljh11849 初级黑马   /  2013-1-14 21:34  /  2169 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在父类中定义了一个protected修饰的方法,在与父类不同包的子类中定义一个父类的对象 为什么这个对象访问不了protected修饰的方法。

2.png (6.05 KB, 下载次数: 32)

子类

子类

1.png (3.46 KB, 下载次数: 40)

父类

父类

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1

查看全部评分

8 个回复

倒序浏览
protected这个控制符只允许在本包里面使用,采用导入其他包的方式不能使用。在父类包外的子类中能“看到“的只是子类自己继承来的protected 方法和属性,它是不能“看到“它的父类对象的protected方法和属性的。所以你的new Test1().show()是可以的而Test2 t2 =new Test2();t2.show()就是不行的。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
建议你读下各个修饰符的作用域问题, 比如上面的修饰符, 意思是 受保护的,  只有被继承的时候 可以调用,  或者是在本类下 可以调用 ,相同的还有 private public... 还有一个是 friendly

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
把protected改成public就可以调用了
回复 使用道具 举报
用 protected 修饰的方法和属性是包级私有的 ,就是说用 protected  修饰的类,只能被所在的包中的其他类来使用。
虽然T1继承T2,但你在T1中创建了T2的实例这个动作与继承没有关系,就如同在其他不是T2的子类中建立一个T2的实例一样。
由于T2的show方法是用protected 修饰的,所以若超过了包的范围是无法被访问到的。

希望对你有所帮助。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
package com.ljh;
/**
* 1.protected保护修饰符的定义:如果将成员变量或者成员放法的权限定义为protected,
* 那么成员变量或者成员方法只能在自己的类及其子类内访问。(教材中的定义)
* 2.分析:
* <1>Test1继承Test2,在类Test1的main方法中,new Test1().show();子类对象调用父类方法。
* <2>Test2 t2 = new Test1();t2.show();t2是一个外部类对象,在其他类(不包含同一
* 个包下的类)里调用自己的protected方法当然java是语法所不允许的。
* <3>我试了试,在同一个包内的其他类里的main方法中也可以new Test2().show();。
* <4>那么protected保护修饰符也可以这么定义了:如果将成员变量或者成员放法的权限定
* 义为protected,那么成员变量或者成员方法只能在自己的类或自己的类所属的package下
* 的其他类及其子类内访问.(嘿嘿!教材有缺陷)
* <5>实在是想要在Test1类的main方法中通过Test2的对象访问其保护方法,可以通过反射来
* 达到效果
*/
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.lyz.*;
public class Test1 extends Test2{
/**
  * @param args
  * @throws InvocationTargetException
  * @throws IllegalAccessException
  * @throws IllegalArgumentException
  */
public static void main(String[] args) {
  //new Test1().show();
  Test2 t2 = new Test2();
  //t2.show();
  try {
   //由于show方法的形参为空,getDeclaredMethod方法的第二个参数得new一个Class
   //对象的空数组。
   Method method = Test2.class.getDeclaredMethod("show",new Class<?>[]{});
   //指示反射的对象在使用时取消 Java 语言访问检查。
   method.setAccessible(true);
   //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。由于invoke方法的第二个
   //参数为空,可以如下面这样写。
   method.invoke(t2);
   //这中方法调用也能试实现,但是还得抛两个异常,捕获异常的注释部分就是。
   //method.invoke(Class.forName("com.lyz.Test2").newInstance());
   
  }  catch (SecurityException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchMethodException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
//  catch (InstantiationException e) {
//   // TODO Auto-generated catch block
//   e.printStackTrace();
//  } catch (ClassNotFoundException e) {
//   // TODO Auto-generated catch block
//   e.printStackTrace();
//  }
  
}
}
回复 使用道具 举报
舒远 黑马帝 2013-1-15 12:19:08
7#
包含protected成员的类A,与A在同一包中的其他类可以访问A的protected成员,
与A不在同一包中的类只能是A的子类可以访问protected成员(继承下来的),即使创建出来的A的对象也无法调用protected成员
回复 使用道具 举报
lz,你可以直接发代码的,而不是发图片
下面逐条解释下
public class Test1 extends Test2
{
    public static void main(String[] args)
    {
        //这是子类调用它继承的父类方法,这个已经可以看做是它自己的方法了
        new Test1().show;
        
        Test2 t2 = new Test2();
        /*这个实际上是通过lgh包中的Test1类来lyz包中类的protected方法,是包间调用。而protected
          修饰的只允许包内调用,而子类使用继承的包外父类protect修饰方法属性时,实际上是在使用
       它自己的方法,还是包内调用*/
        t2.show()
    }
}
我觉得LZ主要问题是混淆了继承方法和调用方法的概念了。protcted修饰内容的访问范围是包内及子类,

区别于空修饰符则是空修饰符只允许包内范围,而不管是否继承。
回复 使用道具 举报
谢谢大家的热心回复:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马