精华内容
下载资源
问答
  • Java protected关键字

    2019-04-23 20:59:41
    Java中,经常想要把某些自定义的类尽可能隐藏起来,但仍然允许导出类的成员访问它,就提到了protected修饰关键字,它指明“就类用户而言,这是private的,但是对于任何继承于此类的导出类或者其他任何位于同一个包...

    在Java中,经常想要把某些自定义的类尽可能隐藏起来,但仍然允许导出类的成员访问它,就提到了protected修饰关键字,它指明“就类用户而言,这是private的,但是对于任何继承于此类的导出类或者其他任何位于同一个包内的类来说,它却是可以访问的”,因为protected提供了包内访问权限。尽管可以创建protected域,但是最好的方式还是将域保持为private,应当一直保留“更改底层实现”的权利,然后通过protected方法来控制类的继承者的访问权限,例:

    public class Demo extends Test1{
    	private int age;
    	public Demo(String name,int age) {
    		super(name);
    		this.age = age;
    	}
    	public void change(String name,int age) {
    		Set(name);
    		this.age = age;
    	}
    	public String toString() {
    		return super.toString() + "," + "今年" + age + "岁";
    	}
    	public static void main(String[] args) {
    		Demo demo = new Demo("小明", 18);
    		System.out.println(demo);
    		demo.change("小红", 12);
    		System.out.println(demo);
    	}
    }
    
    class Test1{
    	private String name;
    	protected void Set(String sname) {
    		this.name = sname;
    	}
    	public Test1(String name){
    		this.name = name;
    	}
    	public String toString() {
    		return "我叫" + name;
    	}
    }

    输出结果:

    可以发现,change()可以访问Set(),因为它是protected,注意Demo()的toString()方法的定义方式,它是根据toString()的基类版本来定义的。

    补充:protected修饰的成员变量(保护访问控制符)指定该变量可以被自己的类和子类访问。在子类中可以覆盖此变量;protected修饰的方法(保护访问控制符)指定该方法可以被它的类和子类进行访问。

    展开全文
  • java protected详解

    2018-11-26 14:23:52
    Javaprotected方法访问权限的问题 先看Test.java   此时出现上文提到的错误:The method clone from the type Object is not visiuable. 我们已经清楚Object.clone()是protected方法。这说明,该方法可以...

    Java中protected方法访问权限的问题

    先看Test.java

     

    此时出现上文提到的错误:The method clone from the type Object is not visiuable.

    我们已经清楚Object.clone()是protected方法。这说明,该方法可以被同包(java.lang)下以及它(java.lang.Object)的子类访问。这里我们自己定义的MyObject类(默认继承java.lang.Object)。

    同样Test也是java.lang.Object的子类。但是,不能在一个子类(Test)中访问另一个子类(MyObject)的protected方法,尽管这两个子类继承自同一个父类(Object)。其实这是由于调用MyTest的Clone方法实际上是调用MyTest的父类Object的Clone方法。第一,Object和Test不在一个包内;第二,虽然Test是Object的子类,但是不是Test自己调用Object中的protected方法Clone而是调用MyTest的父类的Clone方法。所以没有protected的访问权限。

     

    再看示例2:

    Test2.java

    这里,我们在MyObject2类中覆盖(override)父类的clone()方法,在另一个类Test2中调用clone()方法,编译通过。

    编译通过的原因显而易见,当你在MyObject2类中覆盖clone()方法时,MyObject2类和Test2类在同一个包下,所以此protected方法对Test2类可见。

    分析到这里,我们在回忆一下 Java中的浅复制与深复制,章节2.2中的声明,②在派生类中覆盖基类的clone()方法,并声明为public。现在明白这句话的原因了吧(为了让其它类能调用这个类的clone()方法,重载之后要把clone()方法的属性设置为public)。

    下面再来看示例3:

    Test3.java

    这里我用Test3类继承MyObject3,注意这两个类是不同包的,否则就是示例2的情形。在Test3类中调用Test3类的实例tobj的clone()方法,编译通过。而同样调用MyObject3类的实例obj的clone()方法,编译错误!

    意想不到的结果,protected方法不是可以被继承类访问吗?

    必须明确,类Test3确实是继承了类MyObject3(包括它的clone方法),所以在类Test3中可以调用自己的clone方法。但类MyObject3的protected方法对其不同包子类Test3来说,是不可见的。

     

    这里再给出《java in a nutshell》中的一段话:

    protected access requires a little more elaboration. Suppose class A declares a protected field x and is extended by a class B, which is defined in a different package (this last point is important). Class B inherits the protected field x, and its code can access that field in the current instance of B or in any other instances of B that the code can refer to. This does not mean, however, that the code of class B can start reading the protected fields of arbitrary instances of A! If an object is an instance of A but is not an instance of B, its fields are obviously not inherited by B, and the code of class B cannot read them.

    翻译:protected访问是需要一些准备的。假如类A定义了一个protected的属性x,并且被定义在不同包中的类B扩展了类A。A和B不再同一个包内这一点非常重要。从而,B继承了A的protected属性x,而且在当前B 的实例中这个属性是能够被访问的又或者其他代码中涉及到访问这个属性的B的实例中也是可以访问这个属性的。然而,这并不表示B 的代码可以任意访问A的实例中protected修饰的属性!如果一个对象是A而不是B的实例,显然B是没有继承该对象的属性的,从而B的代码无法访问它们。

     

    方法的访问控制:

     

    public

    protected

    default

    private

    同类

    T

    T

    T

    T

    同包

    T

    T

    T

     

    子类(不同包)

    T

    T

     

     

    不同包中无继承关系的类

    T

     

     

     

    本文对网上一篇文章修改的,增加了自己的理解和注释。原文地址:http://zhangjunhd.blog.51cto.com/113473/19287/

    展开全文
  • JAVA protected关键字可见性详解

    千次阅读 2018-04-19 16:49:53
    关于JAVA的可见性关键字大家一定都不陌生,但是最近突然发现自己对protected的认识不是很全面,于是写了demo好好的研究下。先简单介绍下各关键字的可见性(图是从网上找的):表格基本说明了各个关键字的可见范围,...

    关于JAVA的可见性关键字大家一定都不陌生,但是最近突然发现自己对protected的认识不是很全面,于是写了demo好好的研究下。

    先简单介绍下各关键字的可见性(图是从网上找的):


    表格基本说明了各个关键字的可见范围,但是protected需要单独拿出来说下。

    先来个例子:

    package it;
    public class Testing {
        protected int t1;

    }

    package it;
    public class test2 {
        public test2() {
            Testing mTesting = new Testing();
            mTesting.t1 = 2;   //ok
        }
    }

    在这里test2是可以访问到Testing 中的t1的,根据上面的表因为他们在一个包里。需要注意的是这里test2是不是Testing的子类

    可以说是毫无影响,因为他们只要在一个包里就可以访问到了。

    那接下来再来一个类:

    package he;
    import it.Testing;
    public class test3{
        public test3() {
            Testing mTesting = new Testing();
            mTesting.t1 = 1;//error
        }

    }

    这个自然访问不到,既不是Testing子类也不是同一个包里。

    好,那我们把他改为这样呢。

    package he;
    import it.Testing;
    public class test3 extends Testing {
        public test3() {
            Testing mTesting = new Testing();
            mTesting.t1 = 1;//error
        }

    }

    纳尼!使他继承Testing为何还是error,难道表格错了?

    其实这里就是重点了,当父类和子类不在同一个包中时,父类中protected修饰的变量和方法是不可以被子类访问的!

    那表格里说的子类可见是什么意思呢?我们改下这个类

    package he;
    import it.Testing;
    public class test3 extends Testing {
        public test3() {
            t1 = 1;//ok
        }

    }

    原来如此,protected修饰的变量和方法会被子类继承,但是子类也只可以访问自己继承而来的方法和变量,不可以访问父类的。(在不是同一个包的情况下,同包可以访问)

    这里还有一点需要说明,就是关于重写父类的protected方法

    再次举栗:

    因为所有的类都是继承自object,并且有一个protected的clone方法。

    package it;
    public class Testing {
        protected int t1;

    }

    package it;
    public class test2 {
        public test2() {
            Testing mTesting = new Testing();
            try {
                mTesting.clone();//error
            } catch (CloneNotSupportedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    这样test2中是不能访问的,clone方法在object的类中,根据我们上面说的,test2不和object的同一个包访问不到。

    但是,改下

    package it;
    public class Testing {
        protected int t1;
        @Override
        protected Object clone() throws CloneNotSupportedException {
            // TODO Auto-generated method stub
            return super.clone();
        }

    }

    package it;
    public class test2 {
        public test2() {
            Testing mTesting = new Testing();
            try {
                mTesting.clone();//ok
            } catch (CloneNotSupportedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    也就是重写clone后访问clone方法实际是访问的Testing的,因此是可见的(同包)。

    那最后的一种情况

    package it;
    public class Testing {
        protected int t1;
        @Override
        protected Object clone() throws CloneNotSupportedException {
            // TODO Auto-generated method stub
            return super.clone();
        }

    }


    package he;

    import it.Testing;
    public class test3 extends Testing {
        public test3() {
            Testing mTesting = new Testing();
            try {
                clone();//ok
                mTesting.clone();//error
            } catch (CloneNotSupportedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    根据上面的内容不难得到这个结果。

    总之还是这句话:在不是同一个包的情况下,protected修饰的变量和方法会被子类继承,但是子类也只可以访问自己继承而来的方法和变量,不可以访问父类的(同包可以访问)。重写的protected方法根据重写的来计算可见性,未重写的像上追溯到有方法体的父类来计算可见性。

    展开全文
  • java protected理解

    千次阅读 2013-07-04 16:56:09
    关于protected修饰符的理解,这里简单说下自己现在的理解。 protected修饰的方法只有同一个包下才能访问或者子类 定义A类,单独的包 package org.mm.xiao; public class A { protected void say() { ...

    关于protected修饰符的理解,这里简单说下自己现在的理解。

    protected修饰的方法只有同一个包下才能访问或者子类

    定义A类,单独的包

    package org.mm.xiao;


    public class A {
    protected void say() {
    System.err.println("AAAAAAAAAAAAAA");
    }
    }

    定义Test和B在同一包下

    package hello.mm;

    import org.mm.xiao.A;
    public class Test extends A {

    /*@Override
    protected void say() {
    // TODO Auto-generated method stub
    super.say();
    }*/


    }

    package hello.mm;

    public class B {


    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new Test().say();//错误
    }

    }

    这里B和Test在同一包下,但没访问到,原因就是Test继承A的时候方法是浅拷贝,

    就是说Test里面根本没有say()这个方法,仅仅是有个指针或者说引用指向了A的say()

    方法,所以在hello.mm包下跟本调不到say()方法。但如果把say()在Test里面重写了,

    那样就不会报错了。或者如下一样的继承也是可以的。

    package hello.mm;


    public class B extends Test{


    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new B().say();
    }


    }

    这里就差不多了。主要是对protected修饰符及浅拷贝的理解。


    展开全文
  • JAVA protected用法几点

    千次阅读 2013-09-23 12:07:05
    先说几个protected的使用原则,后面再看对应的例子。  protected 的属性和方法可以在本包和子类访问  非同包的子类里面,不能直接使用父类,或者其它包的子类访问  考试大提示: 代码,这个是基类   package test...
  • java protected 与默认权限的区别

    千次阅读 2012-07-20 11:28:56
    作用域 当前类  同package 子孙类 其他package  ...protected √ √ √ ×  friendly(default) √ √ × ×  private √ ×
  • Javaprotected详解

    千次阅读 2017-04-01 11:16:32
    Javaprotected详解类NewObject中有protected修饰的方法或者属性,则: •同一个包中: •可在同一个包里的子类中实例化 NewObject 类获得对象,然后可用该对象访问protected修饰的方法或者属性,即 . 操作访问。...
  • javaprotected 使用总结

    千次阅读 多人点赞 2016-08-22 11:31:45
    最近看了java基础,发现java中访问权限中的其它说的模糊,此以protected属性作为讲解。 转自(感谢):http://www.bitscn.com/plus/view.php?aid=20796.  1. protected 访问控制符能被用于方法和成员变量。  ...
  • JAVAprotected权限

    2014-11-06 19:48:49
    2.今天做Think in java的习题发现,同一个包内的一个类调用另一个类的protected数据是可以的。代码如下: package mnmlist; class Mnmlist{ public static void pt() { Hello hi=new Hello(100); System....
  • JAVAprotected的作用

    千次阅读 2017-05-07 14:47:33
    1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用 ... 3、protectedprotected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他
  • Java父类protected变量属性

    千次阅读 2019-08-14 20:02:25
    首先对于Java中的protected访问控制符,具有如下属性 protected 访问控制符能被用于方法和成员变量 声明为protected的方法和成员变量能被同一个包里的所有类所访问,就像默认修饰符package一样 能被该类的子类所...
  • JAVAprotected 修饰符 的作用

    千次阅读 2019-01-10 10:40:13
    之前学习C++的类的时候,发现设计一个类时,很少用到protected权限修饰符,一般都用public和private。需要被外部访问到的用public修饰,不需要被外部访问的就... 直到最近在用Java编写一个CTS测试用例,才发现了pro...
  • Javaprotected详解!

    千次阅读 2012-06-26 13:36:51
    Javaprotected详解! 最近看java面试题,要求解释protected修饰符的机制 在网上一搜或是查书,得到的结果都是这么写的 protected 的属性和方法可以在本包和子类访问   这里的访问 我不太明白是什么意思。。...
  • Java: protected访问权限

    千次阅读 2015-04-22 16:05:31
    面试题 以下(D)添加到ComputerBook中不会出错 class Book{ protected int getPrice(){ return 30; } } public class ComputerBook ...A) protected float getPrice(){} ...B) protected int getPrice(int p
  • Java中的protected关键字

    千次阅读 2018-07-21 17:11:35
    下面归纳一下Java用于控制可见性的4个访问修饰符: 仅对本类可见---private 对所有类可见---public 对本包和所有子类(本包的)可见---protected 对本书可见——默认,不需要修饰符 public cla...
  • javaprotected权限和友好权限 声明protected权限的变量和方法允许不在同一包中的类访问 不声明权限(友好)的变量和方法只能被当前包下的类所访问
  • Java关键字: protected

    千次阅读 2012-03-10 23:08:57
    Java关键字: protected 在开发中,经常遇见protected关键字。特别是一些回调方法中,今天小结一下。 下面先展示一下关于Java中访问权限的修饰符之间的关系,如下图所示: 做几个测试,说明...
  • javaprotected的访问权限

    千次阅读 2019-02-01 16:16:37
    java in a nutshell》中的一段话: protected access requires a little more elaboration. Suppose class A declares a protected field x and is extended by a class B, which is defined in a different ...
  • Javaprotected访问控制级别

    千次阅读 2015-09-10 14:59:56
    protected 访问级别略大于default,两者在同包下皆是可以访问相关类的受保护实例变量与方法。 《Java in a Nutshell》中“与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类...
  • Javaprotected语义解释

    万次阅读 2007-12-18 11:56:00
    在一权威的java教材中提到“protected" 修饰的方法和属性对于包外的子类是可见的,其实这个表达有些不够严密,导致很多人产生歧义。经过论坛讨论和大量的程序测试,对“protected"语义的探究逐渐明晰。现总结如下: ...
  • 关于JAVAprotected类型

    千次阅读 2012-12-13 20:59:06
    protected 的属性和方法可以在本包和子类访问 非同包的子类...// Base.java package test.base; //创建包于文件夹下的文件夹base下 public class Base {  int n[]=new int[10];  protected int testInt; //p
  • javaprotected权限总结

    千次阅读 2012-12-05 16:02:37
    包含protected成员的类A,与A在同一包中的其他类可以访问A的protected成员, 与A不在同一包中的类只能是A的子类可以访问protected成员(继承下来的),即使创建出来的A的对象也无法调用protected成员
  • javaprotected 1. protected 访问控制符能被用于方法和成员变量。  2. 声明为protected的方法和成员变量能被同一个包里的所有类所访问,就像默认修饰符package一样。  3. 能被该类的子类所访问,子类...
  • Java-Protected访问权限问题

    千次阅读 2017-06-17 11:39:54
    如代码所示,基类T1和子类T2,以及TestProtected类位于同一个包中,在TestProtected类中,可以实例化T2,并访问T1中的protected方法。 T1和T2位于同一包中,可以在继承类T2中创建T1的对象,并通过该对象访问T1中的...
  • javaprotected权限与默认权限的区别

    万次阅读 多人点赞 2018-05-17 20:09:56
    java中最容易混淆的访问权限就是protected和default先看看所有的访问权限总结下面三条:1、在同一个包中,所有的类都能够访问某一个类中所有非private权限的方法或者属性。2、一个包中的类不能通过继承访问另一个...
  • java中的protected方法

    2014-01-08 16:35:59
    java中的protected方法可以被同包和它的子类访问 在其它包new 的父类访问不了,在其它包new的子类可以访问

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 855,032
精华内容 342,012
关键字:

javaprotected

java 订阅