java继承类怎样使用父类的protected方法和属性

作者&投稿:祖庭 (若有异议请与网页底部的电邮联系)
Java能不能继承父类的protected和private方法~

写个试试嘛

父子类定义
先写一个父类,定义方法和变量
public class Father { public String fatherPublicString = "father public"; protected String fatherProtectedString = "father protected"; private String fatherPrivateString = "father private"; public void fatherPublicMethod(){ System.out.println("father public method"); } protected void fatherProtectedMethod(){ System.out.println("father protected method"); }
private void fatherPrivateMethod(){ System.out.println("father private method"); }之后再写一个子类,定义方法和变量
public class Child extends Father { public String childPublicString = "child public"; protected String childProtectedString = "child protected"; private String childPrivateString = "child private"; public void childPublicMethod() { System.out.println("child public method"); } protected void childProtectedMethod() { System.out.println("child protected method"); } private void childPrivateMethod() { System.out.println("child private method"); }}然后我们先看一下值子类能不能继承父类的一些共有私有属性
我们使用getDeclaredFields()和getFields()方法,想来看一下JDK帮助文档怎么定义者两个方法的

* getFields() * 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。* getDeclaredFields() * 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段
JDK帮助文档写的很清楚了,我就不再做解释了,主要看看getDeclaredFields()能不能获得父类的私有属性

代码
//遍历Field数组public static void iteratorField(Field[] fields) { for (Field field : fields) { System.out.println(field.getName()); } System.out.println("-------------------------"); }Class childClass = Class.forName("com.reflection.Child");Client.iteratorField(childClass.getFields());Client.iteratorField(childClass.getDeclaredFields());摸摸搭,我们来看一下结果
//getFields childPublicString fatherPublicString ------------------------- //getDeclaredFields childPublicString childProtectedString childPrivateString -------------------------

结果让我很失望,表示使用getFields将继承的public共有属性给弄过来了,虽然getDeclaredFields将private属性和protected属性也获得到了,但是他居然没有得到从父类继承下来的public共有属性!!虽然APi说的很清楚,但是这样的话怎么对父类的属性进行处理呢??还有protected属性应该也是能够获得的啊,没办法,换方法.

try { System.out.println(name +" field " +class1.getField(name)); System.out.println("-------------------------"); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { System.out.println(e.getMessage() + " NoSuchFieldException"); } try { System.out.println(name +" declaredField " + class1.getDeclaredField(name)); System.out.println("---------------------------------------------"); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { System.out.println(e.getMessage() + " NoSuchFieldException"); } Client.getField(childClass, "fatherPublicString"); Client.getField(childClass, "fatherProtectedString"); Client.getField(childClass, "fatherPrivateString");

结果…..还是没有办法得到啊,怎么破?
fatherPublicString field public java.lang.String com.reflection.Father.fatherPublicString --------------------------------------------------------------------------------------- fatherPublicString NoSuchFieldException fatherProtectedString NoSuchFieldException fatherProtectedString NoSuchFieldException fatherPrivateString NoSuchFieldException fatherPrivateString NoSuchFieldException12345671234567

没办法只有用getSuperClass()获得父类了
//其他方法不变 Client.getField(childClass.getSuperclass(), "fatherPublicString"); Client.getField(childClass.getSuperclass(), "fatherProtectedString"); Client.getField(childClass.getSuperclass(), "fatherPrivateString"); //结果getDeclaredField方法正常拿到父类的public,protected,private属性 fatherPublicString field public java.lang.String com.reflection.Father.fatherPublicString ------------------------- fatherPublicString declaredField public java.lang.String com.reflection.Father.fatherPublicString --------------------------------------------- fatherProtectedString NoSuchFieldException fatherProtectedString declaredField protected java.lang.String com.reflection.Father.fatherProtectedString --------------------------------------------- fatherPrivateString NoSuchFieldException fatherPrivateString declaredField private java.lang.String com.reflection.Father.fatherPrivateString ---------------------------------------------

好吧,我也是心醉了,都继承了,我还拿不到父类的private,protected对象,非的我从父类拿,QAQ,这个先放一放,看看Method能给我们带来什么惊喜
Method的private,protected,private方法探讨
还是一样,我们通过getDeclaredMethods()和getMethods()来获得Method方法,一下是这两个方法的定义
* getMethods() * 返回一个包含某些 Method 对象的数组,这些对象反映此 Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。* getDeclaredMethods() * 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

人家都告诉你了可以有从超类上继承的东东,看来有希望了,我们测试下:
//获得的Method方法迭代打出 public static void iteratorMethods(Method[] methods){ for(Method method : methods){ System.out.println(method.getName()); } System.out.println("---------------------------------------------"); }//客户端调用,我调!我调!Class childClass = Class.forName("com.reflection.Child");Client.iteratorMethods(childClass.getMethods());Client.iteratorMethods(childClass.getDeclaredMethods());12345678910111234567891011
结果ing…..
childPublicMethod fatherPublicMethod wait wait wait hashCode getClass equals toString notify notifyAll --------------------------------------------- childPublicMethod childProtectedMethod childPrivateMethod ---------------------------------------------
俺内心是拔凉拔凉的…………..,也是只能得到子类的一些方法,继承的protected, private呢?!我们获得他的父类,打印一下看看
fatherPublicMethod wait wait wait hashCode getClass equals toString notify notifyAll --------------------------------------------- fatherPublicMethod fatherProtectedMethod fatherPrivateMethod --------------------------------------------

那我最后就可以得到一个结论: 继承的话,private, protected都会被继承下来,private只有内部类,才会对其暴露.或者是被包装的protected,public包装的private可以被访问(话说有这么用么?这不是自己找罪受么?)
第二个问题,其实我这个问题有点错误,其实可以从反射中获得,只不过方法不是那么直接罢了,我们看下面的程序
private static Field getField(Class clazz, String fieldName) throws NoSuchFieldException { try { return clazz.getDeclaredField(fieldName); } catch (NoSuchFieldException e) { //子类得不到,我们就从父类拿喽! Class superClass = clazz.getSuperclass(); if (superClass == null) { throw e; } else { return getField(superClass, fieldName); } }}
获得method方法也是如此,子类的得不到就一直遍历,查找父类,获得想要的Field or Method.


总结
public , protected是会被子类继承的,private的继承有条件—内部类
父类的protected,private的Field和Method没有办法被直接得到,只有通过递归遍历superClass进行查找
以后我们写程序的时候如果需要修改protected或者是private值,尽量为其创建一个public的set方法,方便反射调用(这也很好的解释了spring的注入,一开始建议不要写在Field上)

可以的,protected对于子类、同一个包中的类来说,可以访问,不同包的类不能访问,这是protected的访问权限决定的
作用域 当前类 同一package 子孙类 其他package

public √ √ √ √

protected √ √ √ ×

friendly √ √ × ×

private √ × × ×

只要名字和父类的不一样的可以直接访问,默认是父类的属性和方法;如果名字一样的话,加上super是父类的,加上this是子类的。

怕混淆,可以显式使用this和super来确认!

但是,在java编程规范里,一般只会在你重写的方法里调用父类对应的方法.
比如在TestSamePackageSubClass里的getTestInt(), 你可以调用super.getTestInt()
而TestSamePackageSubClass的其他方法里,则直接调用getTestInt() (自己有就是自己的,否则是父类的), 除非你要显式调用父类super.getTestInt(). 可以这么用,但违背了java 继承的本意

如果不存在同名的属性可以直接访问就行了,编译时或自动添加this 和super。

当然也可以用this. 和super区分父类或子类
this.表示子类的属性或方法 而super.表示父类的属性或方法。

我觉得是你吧例子要表达的东西理解错了

例子中test()中是new了一个Base, 然后调用Base中的protected方法, 它要表达的意思是, 同一包中其它类是可以使用对象的protected方法的

而test2()没有经过new, 而直接使用Base的protected方法, 要表达的意思子类可以使用父类的protected方法

如果你这个子类和Base类不是同一包中, 那么test()会报错, 而test2()仍然正确

两个test表达的是protected方法在什么情况下能被看到
1. 同一包中的其它类new出的对象可以看到

2. 子类中直接看到

而你问的是怎么调用子类的protected方法, 这个和java的多态性有关, 而不是和protected性质有关

当然也可以用this. 和super区分父类或子类
this.表示子类的属性或方法 而super.表示父类的属性或方法。


Java继承Java继承的特征
Java的继承机制具有显著的特性,它允许类之间的信息传递和扩展。首先,继承关系是双向且递归的,如类C继承类B,而B又继承类A,这使得C类不仅继承A类的属性和方法,也继承了B类的所有特性,同时还可以添加自身的特性和功能。这种隐式的继承机制使得C类的属性和方法更为丰富,且清晰地反映出类之间的层次...

java继承多态和抽象类接口?
(3)Java中继承的实现:public class 子类extends 父类{} (4)继承的单根性:在Java中一个类只能有一个父类;传递性:一个Java类可以父类,父类也可以有父类。(5)所有类的根类:Object类,又叫基类或超类。Object类是每个Java类的父类,要么是直接的父类,要么就是间接的父类。Object类中的三个...

java继承类怎么创建?
你好,很高兴回答你的问题。java语言中创建继承类可以通过下面的语法来创建。public class 子类 extends 父类{} 如果有帮助到你,请点击采纳。

java继承类怎样使用父类的protected方法和属性
只要名字和父类的不一样的可以直接访问,默认是父类的属性和方法;如果名字一样的话,加上super是父类的,加上this是子类的。

如何在Java中使用子类继承父类的父类,举个例子看看,谢谢
class Animal{\/\/动物类 public String name="haha";\/\/名字 public void say() {\/\/说话方法 System.out.println(name+" say hi");} } class Cat extends Animal{\/\/猫类继承了动物类 } public class Test { public static void main(String[] args) { Cat cat=new Cat();\/\/实例化一个猫...

java子类如何继承父类怎么写啊?
举例:public class Parent{\/\/定义父类}public class Son extends Parent{\/\/通过extends,son类继承了父类Parent}补充:(1)继承就是在现有类的基础上构建亲的类。(2)当一个类继承一个现有类后,可以对被继承类中的属性和方法进行重用。(3)在Java中,一个类只能有一个父类,不支持多继承。

java:接口,什么时候用extends?什么时候用implements?\\
类继承类时,单继承:使用 extends ,例如: A extends B 接口继承接口时,多继承:使用 extends ,例如: A extends B,C 类实现接口时,多实现: 使用 implements , 例如: A implements B,C

写java时 在什么样的情况下,需要使用到继承?
4.工厂设计模式,第三条中获取接口的方法其实就是一种简单工厂设计模式,这样做的优点是可以满足日后的扩展以及维护,换一种实现直要修改获取方法的返回值就可以了。 至于继承有什么缺点?它肯定没有不继承的快,因为实例化继承类的机制是 先复制父类成员到内存中,然后复制自己的成员。然后执行父类构造...

java 如果一个类继承两个类 方法名怎么写
\/java只能单继承,希望同时继承多个类的话可以考虑implements.比如说:class A extends B implements C, D{\/\/ ... }java不允许多继承,但允许implement 多个接口,事实上,接口也可以说是一个类,只不过,里面有很多没有实现的方法,需要你在子类中实现。

java: 类A已经继承类B,由于业务的需要还要继承类C ,怎么实现?谢谢!_百...
一定要继承吗? java只支持单继承,可以考虑聚合,将类C包含进A类中

塘沽区17245298957: 在JAVA中,子类继承父类时,怎样使用父类的构造函数?怎样重写父类的构造函数? -
汤颖君菏: java中子类无法继承父类构造函数,因此不能重写父类构造函数,但是可以在子类构造函数中通过super()调用父类构造函数

塘沽区17245298957: java中的super引用父类 -
汤颖君菏: 子类继承父类之后,可以在子类中调用父类的非私有的方法和属性,这个是Java 的继承机制决定的.而且子类还可以重写父类的方法,修改父类的属性的值,这个是Java 的多态特性.至于实现机制你更本不用去管,程序员只要理解继承机制就可以了

塘沽区17245298957: Java 继承了一个父类,父类下定义了其他类.如何调用其他类的方法? -
汤颖君菏: 你好,提问者: 向下转型,例如一下代码:class Person{ public void add(){}; } class Student extends Person{ public void delete(){}; } class LaoShi extends Person{ public void update(){} } public class CeShiDemo{ public static void main(String[] args){ Person p = new Person(); Student s = (Student)p; s.delete(); } }

塘沽区17245298957: java中子类调用从父类继承下来的变量一定要加super么? -
汤颖君菏: 继承的变量?应该是方法吧,并且是非private的方法;这种方法不一定要super的,看你的实际需要.继承的变量也是只能访问非private的

塘沽区17245298957: java中子类继承了父类就可以使用父类的方法了,那为什么还要用super? -
汤颖君菏: 你可以不用super, 用这个的原因是你的子类方法想覆盖父类方法,但是又想需要父类方法的功能,所以先super 调用父类方法后加上自己的一些实现

塘沽区17245298957: Java 怎样能灵活运用多态?子类继承父类后,父类声明的属性是怎么用的?求高手解答~~谢了!!最好举例子 -
汤颖君菏: Java的多态跟swing有什么关系..... 可以总结它为: 一、使用父类类型的引用指向子类的对象; 使用父类类型的引用指向子类的对象; 二、该引用只能调用父类中定义的方法和变量; 该引用只能调用父类中定义的方法和变量; 如果子类中重写...

塘沽区17245298957: java中子类继承父类后,子类就能调用父类的方法吧?,为啥我写的子类不能调用父类的方法呢? -
汤颖君菏: 一般是可以的,但如果父类的方法修饰符是特定的就不能被继承.作用说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly.域 当前类 同一package 子孙类 其他package public Y Y Y Y protected Y Y Y N friendly Y Y N N private Y N N N Y是可以被继承和使用,N是不能,看看你定义的父类方法的修饰符吧!

塘沽区17245298957: java中子类继承父类的属性之后,必须要'显示调用'的时候才好用吗? -
汤颖君菏: 子类继承父类的所有方法和属性,除了private以外都可以调用的啊.构造方法里的super是调用父类的构造方法,如果子类要继承含参数的构造方法则必须要写这一句,因为子类默认继承父类不含参数的构造方法.

塘沽区17245298957: 关于java中子类继承父类的构造方法 -
汤颖君菏: java继承中对构造函数是不继承的,只是调用(隐式或显式). 举例说明:public class FatherClass { public FatherClass() {System.out.println(100);}public FatherClass(int age) {System.out.println(age);} }public class SonClass extends ...

塘沽区17245298957: java中子类继承父类时获得父类成员继承规则是什么 -
汤颖君菏: 权限public > 包(package,默认,也就是什么权限修饰符都不加) > proteced > private 子类继承了父类的所有成员(这样说实际是不对的),但只能访问父类的非private成员.你可以认为子类持有一个名为supper的父类实例. 当父类和子类方...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网