精华内容
下载资源
问答
  • java访问类的私有变量和方法

    千次阅读 2015-09-19 12:15:37
    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; class A { ... private String a = "私有变量1";... private String b = "私有变量
    import java.lang.reflect.Field;  
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    class A {  

        private String a = "私有变量1";  
        private String b = "私有变量2"; 
        
        private String hidden()
        {
           return "我是私有方法,不可见";
        }



    public class B {    
        public static void main(String []args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {  
            A node = new A();  
            Method  [] methods = A.class.getDeclaredMethods();
            for(Method m:methods)
            {
            //修改方法的访问权限
            m.setAccessible(true);
            System.out.println(m.invoke(node));
            }
            Field []fields = A.class.getDeclaredFields();  
            for(Field field : fields) {  
                field.setAccessible(true);  
                try {    
                    System.out.println(field.get(node));  
                } catch (IllegalArgumentException e) {  
                    e.printStackTrace();  
                } catch (IllegalAccessException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
    展开全文
  • java私有变量到底有没有继承? //父类 public class A { public int publicNum = 3; //公开变量 private int privateNum = 4; //私有变量 } //子类 public class B extends A{ int a = publicNum; //直接对...

    java中私有变量到底有没有继承?

    //父类
    public class A {
        public int publicNum = 3;  //公开变量
        private int privateNum = 4; //私有变量
    }
    
    //子类
    public class B extends A{
        int a = publicNum;      //直接对父类共开变量操作
        int b = privateNum;     //对私有变量操作编译报错
    }
    

    关于继承的理解

    继承的目的是为了对共有属性和行为的抽取,以此达到提高代码复用性的目的,从内存角度分析,继承的本质是在创建子类对象new的过程,调用了父类构造器super();因此在子类对象的堆内存中有一片父类对象的堆内存空间,子类可以调用父类非私有成员变量和方法。

     //空参构造
         public B() {
             super();      //默认调用父类空参构造,如果手动给出则不会默认给出
         }
     }
    

    也就是说继承的本质是因为对父类构造器的调用,在子类堆内存中生成了父类对象的堆内存,内存图解如下:在这里插入图片描述
    理论上来讲,对父类成员的操作都应该发生在子类创建对象之后(调用父类构造器之后),但是从代码上来看,显然在extends关键字之后,就已经能够对父类成员进行操作了,只是不创建子类对象,无法打印查看,这大概也是官方API文档的说法,父类私有成员不能被继承,在学习继承概念的时候,很多人会说私有成员变量是可以继承的,只是需要通过setter&getter方法间接访问。
    但是这种间接访问的形式不应该在任何无关类中都可以允许的吗?即便类和类之间没有子父类关系,通过public的get()方法不是同样可以访问吗,所以这跟继承又有什么特殊关系?

    总结

    关于父类成员继承的问题我个人更倾向是对父类成员的复制,但他又区别于复制,因为如果子类复制了父类成员,那么私有成员应该属于子类的本类成员,理论是可以操作的。
    个人目前理解是,对于访问权限允许的成员,子类是复制父类成员,而对于访问权限之外的成员,依旧遵循权限保护问题,只能间接访问
    记录问题博文,后期做自己回顾用

    展开全文
  • Java子类访问父类私有变量的思考

    千次阅读 2020-06-30 17:42:12
    父类User,包含私有变量name和money; 以及两个构造函数和基本的getter方法。 public class User { public User() { } public User(String name, int money) { this.name = name; this.money = money; } ...

    示例如下:
    父类User,包含私有变量name和money;
    以及两个构造函数和基本的getter方法。

    public class User {
        public User() {
        }
    
        public User(String name, int money) {
            this.name = name;
            this.money = money;
        }
    
        public String getName() {
            return name;
        }
    
        public int getMoney() {
            return money;
        }
    }
    

    子类Manager继承User

    public class Manager extends User {
        public Manager() {
        }
    
        public Manager(String name, int money) {
            super(name, money);
        }
        private String name;
        private int money;
        public void show(){
            System.out.println("我是"+this.name+",我有"+this.money+"元钱");
            System.out.println("我是"+this.getName()+",我有"+this.getMoney()+"元钱");
            System.out.println("我是"+super.getName()+",我有"+super.getMoney()+"元钱");
        }
    }
    

    主类ClassDemo新建一个Manager对象,并调用其show()函数。

    public class ClassDemo {
        public static void main(String[] args) {
            Manager m=new Manager("q",1);
            m.show();
        }
    }
    

    结果如下

    我是null,我有0元钱---1
    我是q,我有1元钱------2
    我是q,我有1元钱------3
    

    其中结果1容易理解,本类中的两个变量没有初始化,返回的是默认值。

    结果2一开始感觉很困惑,子类继承了父类的getName()和getMoney(),可并没有继承私有变量name和money,这里返回的值是谁的呢?

    之后了解了一下这一部分的内存原理,原来新建子类时,会先在堆中新建一个父类,父类的变量和方法,以及子类独有的变量和方法,二者共同组成了子类空间。
    所以,新建子类后,父类中的private变量虽然不能被子类继承,但却是真实存在的,只是不可被直接访问,只能间接使用。
    结果2中,Manager对象其实在创建时就已经在构造函数中通过super(name,money)给name和mongey这两个父类私有变量赋值了。而在使用this.getName()方法时,该方法是从父类继承,所以方法内使用的变量也是父类的这两个私有变量,所以在结果2中返回的是自定义的两个值。
    结果3中,super()直接通过父类调用getter方法,返回值当然也是两个父类私有变量。
    不过,如果在子类Manager中重写getter方法,结果2就发生了改变。

    public class Manager extends User {
        public Manager() {
        }
    
        public Manager(String name, int money) {
            super(name, money);
        }
    	/*****************************新增重写方法***************************/   
        @Override
        public String getName() {
            return name;
        }
    
        @Override
        public int getMoney() {
            return money;
        }
    	/*****************************************************************/
        private String name;
        private int money;
        public void show(){
            System.out.println("我是"+this.name+",我有"+this.money+"元钱");
            System.out.println("我是"+this.getName()+",我有"+this.getMoney()+"元钱");
            System.out.println("我是"+super.getName()+",我有"+super.getMoney()+"元钱");
        }
    }
    
    我是null,我有0元钱---1
    我是null,我有0元钱---2
    我是q,我有1元钱------3
    

    因为现在本类Manager中已经有了getter()方法,所以方法内直接调用本类的两个name,money变量,因此结果2返回的是两个初始值。

    参考

    Java中子类能不能继承父类的私有变量和方法?
    JAVA中的父类私有成员变量的继承问题

    展开全文
  • 关于java私有成员变量访问

    千次阅读 2018-08-04 11:27:14
    java 主类M中可以直接访问自身的私有成员,就算在main中 new 一个自己,也只是自身静态方法中的一个局部变量,该局部变量依然可以访问自身的private成员,只要该局部变量身处自身所在类M。 主类M外面定义了其它类A,...

    java 主类M中可以直接访问自身的私有成员,就算在main中 new 一个自己,也只是自身静态方法中的一个局部变量,该局部变量依然可以访问自身的private成员,只要该局部变量身处自身所在类M。

    主类M外面定义了其它类A,然后在主类的main方法中编写如下 语句 :

    1、M m = new M ,那么可通过 m.p 直接访问主类私有成员,因为该语句身处M类体中

    2、A a = new A ,那么不能通过 a.p直接访问私有成员,因为该语句身处M类体中,不在A类体中

    读大学时学C++的惯性思维就是:private成员永远不能被new出来的变量直接访问,必须在类体中用public get() / set() 封装,然后new 出来的变量只能通过get()/set()访问,那时一直不能接受和理解的是,main方法在某个类体中,而且还能自己new自己。现在终于理解了。

    转载于:https://blog.51cto.com/maplebb/2154376

    展开全文
  • Java反射机制访问私有方法和变量

    千次阅读 2017-01-06 20:49:14
    Java反射机制访问私有方法和变量背景利用Java的反射机制,可以得到运行时的类信息(RTTI),与传统RTTI不同的是,反射可以在运行时才得到.class文件,从而打开和检查.class文件,所有Java的反射具有很强的灵活性。...
  • public class StudentDemo { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InstantiationException, ... } 获取私有变量与私有方法同理。
  • java反射访问私有变量和私有方法

    千次阅读 2010-06-25 00:31:00
    java反射访问私有变量和私有方法 引言 对于软件开发人员来说,单元测试是一项必不可少的工作。它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在。但是,在写单元...
  • java 基础 私有变量不可以继承吗?

    千次阅读 2015-01-15 12:51:16
    [java] view plaincopy public class YuanXingMode {     /**   */   public static void main(String[] args) {   "color:#ff0000;">ConcretePrototype pro = new ...
  • java访问私有方法

    千次阅读 2020-04-16 17:29:12
    Java中对方法的定义存在四种修饰符,分别是public、protected、default、private,作用域分别如下: public protected protected private 同一个类 true true true true 同一个包 ...
  • 平常访问/修改类对象的私有属性,需要使用gei/set方法访问,这里我们也可以通过反射机制直接访问/修改
  • 父类的私有变量和私有方法虽然在子类对象中,但是对于子类对象而言是不可见的,无法直接访问和调用,必须通过父类的成员方法(或者父类的构造方法)才能访问和调用,正是因为这样的特性,所以 Java 官方文档将其描述...
  • 下面小编就为大家带来一篇利用反射获取Java类中的静态变量名及变量值的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Java中的私有成员变量private

    千次阅读 2020-05-25 15:54:05
    要想访问私有成员变量,必须定义一对Getter/Setter方法 且方法必须以getXxx/setXxx规则命名 对于getXxx来说,不能有参数,返回值的类型要与成员变量类型一致 对于setXxx来说,不能有返回值,参数类型要与成员变量...
  • 按照我之前的理解,父类的私有变量只有当前类能访问,子类不能访问,所以子类不能继承父类的私有变量。子类可以通过get set方法访问到父类的私有变量,那么,这个访问的变量是哪里的?是父类变量的?还是子类实际上...
  • Java的反射工具很强大,有句著名的话:No reflection ,no frameworks.纳整理一个小工具类:/** * @Author 落叶飞翔的蜗牛 * @Date 2018/3/10 * @Description ... * 获取私有成员变量的值 * @param instanc...
  • 1、被访问的类FanShe package com.demo.test2; public class FanShe { public int x; private int y; public FanShe() { } public FanShe(int x,int y) { this.x=x; this.y=y; } private String ...
  • java 子类访问父类私有成员变量

    千次阅读 2017-02-24 15:14:00
    class person { private String name; private int age; ...public person (){} ...public person(String name ,... // 这里就能访问到父类私有化成员变量; } 转载于:https://www.cnblogs.com/yimian/p/6438683.html
  • for (Object arg:args) { //处理applicationCode Class<?> argClass = arg.getClass(); Field applicationCode =null; try { app...
  • 主要介绍了Java反射如何修改private final成员变量值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 关于Java子类访问父类的私有变量

    千次阅读 2013-10-25 13:14:33
    为了测试,我写了三个java类, father.java son.java test.java 专门来测试,关于局部变量,以及子类调用父类的私有变量。  father.java 如下:
  • Java如何访问private变量

    千次阅读 2014-07-01 21:39:21
    大家都知道private变量是无法访问的,一编译就报错根本...首先定义一个最简单的类,只有一个私有变量和一个公开的方法。代码如下: class Foo { private String message = "This is a Foo."; public void show()
  • ...import java.lang.reflect.Field; public class Demo { private static Field declaredField; public static void main(String[] args) throws Exception{ Class clazz = Student.cla...
  • //这个程序中最主要的目的就是访问私有的年龄值 /*之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。 对访问的数据进行操作。提高代码健壮性。 */ //年龄定义是私有的,我们现在想要去...
  • java 中通过反射获取私有变量的值

    千次阅读 2015-05-04 16:46:17
    我们都知道如果一个变量用...现在我将通过反射访问私有变量。 下面是一个私有变量的bean:public class PrivateField { private String name = "qq"; private String password = "qqpassword"; }下面是得到私有变
  • 因为成员变量的初始化时间先于类的构造函数执行前,自然保证了成员变量已经被赋值。(2)静态方法中,先实例化类,利用实例化类的引用才能调用。 3、this关键字:(1)不能在静态方法中使用。 ...
  • import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectDemo { public static void main(String[] args) throws Exception { Class clazz = PackageClazz.
  • Java反射访问私有变量和私有方法

    千次阅读 2011-04-25 21:03:00
    引言  对于软件开发人员来说,单元测试是一项必不可少的工作。它既可以验证程序的有效性...  尽管有很多经验丰富的程序员认为不应该提倡访问类的私有成员变量或方法,因为这样做违反了 Java 语言
  • 资料一:  引言  对于软件开发人员来说,单元测试是一项必不可少的工作。...本文总结了访问类的非公有成员变量或方法的四种途径,以方便测试人员在需要访问类非公有成员变量或方法时进行选择。
  • Java 反射小案例(静态私有成员的获取)-kaki的博客 源类: package com.icbc.task; public class Perpson { private static String NAME = "孙悟空"; public void printName(){ System.out.println(NAME); }...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 179,012
精华内容 71,604
关键字:

java访问私有变量

java 订阅