1、传统笔试题访问级别如下:
2、父类私有属性与私有方法,子类能否继承?
结论:子类可以继承父类私有属性与私有方法,但是不能直接访问,可以通过反射访问。
3、测试代码
/**
* 文件名:Person.java
*
* 版本信息:
* 日期:2017年2月17日
* Copyright 运联实泰 Corporation 2017
* 版权所有
*
*/
package com.yl.extend;
/**
* 此类描述的是:
*
* @author: zengqi
* @version: 2017年2月17日 上午10:10:45
*/
public abstract class Person {
private static String PRIVATE_STATIC = "person private static";
public static String PUBLIC_STATIC = "person public static";
private static final String PRIVATE_STATIC_FINAL = "person private static final";
public static final String PUBLIC_STATIC_FINAL = "person public static final";
private String name;
private boolean sex;
protected String height;
public String weight;
public abstract void run();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
private void privateMethodTest() {
System.out.println("privateMethodTest");
}
protected void protectedParent() {
}
private void privateParent() {
}
}
/**
* 文件名:Max.java
*
* 版本信息:
* 日期:2017年2月17日
* Copyright 运联实泰 Corporation 2017
* 版权所有
*
*/
package com.yl.extend;
/**
* 此类描述的是:
* @author: zengqi
* @version: 2017年2月17日 上午10:12:42
*/
public class YelloMan extends Person {
public static String manPublicStatic;
public static final String manPublicStaticFinal = "manPublicStaticFinal";
private static String manPrivateStatic;
private static final String manPrivateStaticFinal = "manPrivateStaticFinal";
public String manPublic;
/* (non-Javadoc)
* @see com.yl.extend.Person#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println();
System.out.println(this.getName()+" YelloMan is running");
}
private String age;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
private void privateTest(){
System.out.println("privateTest");
}
protected void protectedTest() {
System.out.println("privateTest");
}
private static void privateStaticTest(){
System.out.println("privateStaticTest");
}
public static void publicStaticVoidTest(){
System.out.println("publicStaticVoidTest");
}
}
/**
* 文件名:Test.java
*
* 版本信息:
* 日期:2017年2月17日
* Copyright 运联实泰 Corporation 2017
* 版权所有
*
*/
package com.yl.extend;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 此类描述的是:
* @author: zengqi
* @version: 2017年2月17日 上午10:14:04
*/
public class Test {
public static void main(String[] args) throws Exception{
YelloMan man = new YelloMan();
man.setAge("25");
man.setHeight("177");
man.setName("zhangsan");
man.setSex(true);
//子类能够继承父类的私有属性 通过debug可以看到this中有父类的私有属性
man.run();
Class<YelloMan> clazz = YelloMan.class;
//通过反射 可以看到 反射 getDeclaredFields能获取子类的任意属性,获取不到父类的任何属性
System.out.println("----------clazz.getDeclaredFields()-------------");
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields){
field.setAccessible(true);
System.out.println(field.getName());
}
System.out.println("----------clazz.getFields()-------------");
//通过反射 可以看到 反射 getFields能获取子类与父类的公共的属性
Field[] fieldArry = clazz.getFields();
for(Field field:fieldArry){
field.setAccessible(true);
System.out.println(field.getName());
}
//通过反射 getDeclaredMethods可以获取子类的任意方法 但不能获取父类的
System.out.println("----------clazz.getDeclaredMethods()-------------");
Method[] methods = clazz.getDeclaredMethods();
for(Method m:methods){
System.out.println(m.getName());
}
//clazz.getMethods可以获取子类与父类的公共方法 所以一般框架给对象注入值的时侯,
//一般是用get与set方法去注入
System.out.println("----------clazz.getMethods()-------------");
Method[] methodArry = clazz.getMethods();
for(Method m:methodArry){
System.out.println(m.getName());
}
//父类私有属性访问
Field[] pFieldArry = ((Class) clazz.getGenericSuperclass()).getDeclaredFields();
System.out.println("----------pClazz.getDeclaredFields()-------------");
for(Field field:pFieldArry){
field.setAccessible(true);
System.out.println(field.getName());
}
//获取父类的字节码
System.out.println("----------pClazz.getDeclaredFields()-------------");
Class pClazz = clazz.getSuperclass();
Field[] pfields = pClazz.getDeclaredFields();
for(Field field:pfields){
field.setAccessible(true);
System.out.println(field.getName());
}
}
}