精华内容
下载资源
问答
  • C ++中public , private继承protected继承有什么区别? 我在SO上发现所有问题都与特定情况有关。#1楼如果您从另一个公开继承,那么每个人都知道您正在继承,并且任何人都可以通过基类指针来使用您。如果您...

    C ++中的public , private继承和protected继承有什么区别? 我在SO上发现的所有问题都与特定情况有关。

    #1楼

    如果您从另一个类公开继承,那么每个人都知道您正在继承,并且任何人都可以通过基类指针来使用您。

    如果您保护性地继承您的子类,则可以多态使用您。

    如果您私下继承,则只有您自己才能执行父类方法。

    这基本上象征着其余班级对您与父母班级关系的了解

    #2楼

    class A

    {

    public:

    int x;

    protected:

    int y;

    private:

    int z;

    };

    class B : public A

    {

    // x is public

    // y is protected

    // z is not accessible from B

    };

    class C : protected A

    {

    // x is protected

    // y is protected

    // z is not accessible from C

    };

    class D : private A // 'private' is default for classes

    {

    // x is private

    // y is private

    // z is not accessible from D

    };

    重要说明:类B,C和D都包含变量x,y和z。 这只是访问的问题。

    关于受保护和私有继承的用法,您可以在这里阅读。

    #3楼

    公共继承为IS-A关系建模。 用

    class B {};

    class D : public B {};

    每个D 是一个 B

    私有继承为IS-IMPLEMENTED-USING关系(或任何所谓的关系)建模。 用

    class B {};

    class D : private B {};

    D 不是 B ,但是每个D在实现中都使用B 始终可以通过使用遏制来消除私有继承:

    class B {};

    class D {

    private:

    B b_;

    };

    该D也可以使用B来实现,在这种情况下,可以使用其b_ 。 与继承相比,包含是类型之间的紧密耦合,因此通常应首选。 有时使用包容代替私有继承不如私有继承方便。 通常这是懒惰的la脚借口。

    我认为没有人知道什么protected继承模型。 至少我还没有看到任何令人信服的解释。

    #4楼

    限制继承的可见性将使代码无法看到某个类继承了另一个类:从派生到基础的隐式转换将不起作用,从基类到派生的static_cast也将不起作用。

    只有类的成员/朋友可以看到私有继承,只有成员/朋友和派生类可以看到受保护的继承。

    公共继承

    IS-A继承。 按钮是一个窗口,在需要窗口的任何地方,也可以传递按钮。class button : public window { };

    受保护的继承

    受保护的术语实施。 很少有用。 在boost::compressed_pair使用,以从空类派生并使用空基类优化节省内存(下面的示例不使用模板保持原状):struct empty_pair_impl : protected empty_class_1 { non_empty_class_2 second; }; struct pair : private empty_pair_impl { non_empty_class_2 &second() { return this->second; } empty_class_1 &first() { return *this; // notice we return *this! } };

    私人继承

    以术语实施。 基类的用法仅用于实现派生类。 对于特征和大小重要的情况很有用(仅包含函数的空特征将利用空的基类优化)。 不过,通常围堵是更好的解决方案。 字符串的大小很关键,因此在这里很常见template struct string : private StorageModel { public: void realloc() { // uses inherited function StorageModel::realloc(); } };

    公众成员

    骨料class pair { public: First first; Second second; };

    存取器class window { public: int getWidth() const; };

    受保护的成员

    为派生类提供增强的访问权限class stack { protected: vector c; }; class window { protected: void registerClass(window_descriptor w); };

    私人会员

    保留实施细节class window { private: int width; };

    请注意,C样式强制转换允许以定义的安全方式将派生类强制转换为受保护的基类或私有基类,并且也可以强制转换为另一个方向。 应不惜一切代价避免这种情况,因为它可以使代码依赖于实现细节-但是,如有必要,您可以使用此技术。

    #5楼

    私人的:

    基类的私有成员只能由该基类的成员访问。

    上市:

    该基类的成员,其派生类的成员以及在该基类和派生类之外的成员都可以访问该基类的公共成员。

    受保护的:

    基类的成员及其派生类的成员都可以访问基类的受保护成员。

    简而言之:

    私人的 :基地

    保护 :基本+派生

    公开 :基础+派生+任何其他成员

    展开全文
  • getFields方法只能获取类及其父类的公共字段 获取父类的私有字段需要先使用getSuperClass获取父类Class,然后通过父类Class的getDeclaredFields方法获取父类的所有字段 下面我们举个简单的栗子: 这是我们定义...

    终于于于于于休息啦,上来先说结论。

    结论:

    1. getDeclaredFields方法仅对类本身的字段有效果,对于继承的父类的字段无效
    2. getFields方法只能获取类及其父类的公共字段
    3. 获取父类的私有字段需要先使用getSuperClass获取父类Class,然后通过父类Class的getDeclaredFields方法获取父类的所有字段

     下面我们举个简单的栗子:

    这是我们定义的一个父类,其中定义了一个公共字段superDesc,和一个私有字段superName

    public class SuperModel {
    
    	private String superName;
    	public String superDesc;
    
    	public String getSuperDesc() {
    		return superDesc;
    	}
    	public void setSuperDesc(String superDesc) {
    		this.superDesc = superDesc;
    	}
    	public String getSuperName() {
    		return superName;
    	}
    	public void setSuperName(String superName) {
    		this.superName = superName;
    	}
    
    }

    这是我定义的一个子类,其中也定义了一个公共字段modelDesc和一个私有字段modelName

    public class Model extends SuperModel {
    
    	public String modelDesc;
    	private String modelName;
    
    	public String getModelDesc() {
    		return modelDesc;
    	}
    	public void setModelDesc(String modelDesc) {
    		this.modelDesc = modelDesc;
    	}
    	public String getModelName() {
    		return modelName;
    	}
    	public void setModelName(String modelName) {
    		this.modelName = modelName;
    	}
    }

    下面我使用了三个测试方法来测试。

    public class ReflectTest {
    	public static void main(String[] args) {
    		Model model = new Model();
    		model.setSuperDesc("父类公开字段");
    		model.setSuperName("父类私有字段");
    		model.setModelDesc("子类公开字段");
    		model.setModelName("子类私有字段");
    
    		//通过getFields方法遍历字段获取model字段
    		getNameByGetFields(model);
    
    		//通过getDeclaredFeilds方法获取model字段
    		getNameByDeclaredFields(model);
    
    		//通过getSuperClass方法获取model字段
    		getNameBySuperClass(model);
    	}
    
    	private static void getNameByGetFields(Model model) {
    		Class<? extends Model> sonClass = model.getClass();
    		try {
    			Field[] fields = sonClass.getFields();
    			System.out.println("通过getFields方法遍历字段获取model字段:       ");
    			for (Field field : fields) {
    				System.out.println(field.getName() + ":" + field.get(model));
    			}
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		}
    	}
    
    	private static void getNameByDeclaredFields(Model model) {
    		Class<? extends Model> sonClass = model.getClass();
    		try {
    			System.out.println("通过getDeclaredFeilds方法获取model字段:      ");
    			Field[] fields = sonClass.getDeclaredFields();
    			for (Field field : fields) {
    				field.setAccessible(true);
    				System.out.println(field.getName() + ":" + field.get(model));
    			}
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		}
    	}
    
    	private static void getNameBySuperClass(Model model) {
    		Class<? extends Model> sonClass = model.getClass();
    		try {
    			System.out.println("通过getSuperClass方法获取superName字段    ");
    			Class<?> superclass = sonClass.getSuperclass();
    			Field[] fields = superclass.getDeclaredFields();
    			for (Field field : fields) {
    				field.setAccessible(true);
    				System.out.println(field.getName() + ":" + field.get(model));
    			}
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		}
    	}
    }

     当我使用getFields方法遍历所有字段时,输出了以下信息:

    这说明getFileds方法只能获取公共字段,但是可以同时获取本身和父类的公共字段

    以下是JDK文档中的描述:


     当我使用getDecleadFields遍历所有字段时,输出了以下信息:

    这说明getDecleadFields方法只能获取类本身的字段,但是不能获取父类的字段

    以下时JDK文档中的描述:


    当我使用getSuperClass获取父类Class后再使用父类的Class的getDecleadFields方法,不出所料,输出的父类所有的字段。

    这说明要获取父类的私有字段必须先获取它的Class对象。而要遍历一个对象应该出现的所有字段,就需要遍历这个对象和这个对象的父类所有字段,不能一次性直接获取到所有字段。

    最后给个分享个不错的JDK API在线文档地址,点过去进首页能发现惊喜哦。JDK8中文API在线文档

    Over

     

    展开全文
  • 结论:getDeclaredFields方法仅对类本身的字段有效果,对于继承的父类的字段无效getFields方法只能获取类及其父类的公共字段获取父类的私有字段需要先使用getSuperClass获取父类Class,然后通过父类Class的...

    终于于于于于休息啦,上来先说结论。

    结论:

    getDeclaredFields方法仅对类本身的字段有效果,对于继承的父类的字段无效

    getFields方法只能获取类及其父类的公共字段

    获取父类的私有字段需要先使用getSuperClass获取父类Class,然后通过父类Class的getDeclaredFields方法获取父类的所有字段

    下面我们举个简单的栗子:

    这是我们定义的一个父类,其中定义了一个公共字段superDesc,和一个私有字段superName

    public class SuperModel {

    private String superName;

    public String superDesc;

    public String getSuperDesc() {

    return superDesc;

    }

    public void setSuperDesc(String superDesc) {

    this.superDesc = superDesc;

    }

    public String getSuperName() {

    return superName;

    }

    public void setSuperName(String superName) {

    this.superName = superName;

    }

    }

    这是我定义的一个子类,其中也定义了一个公共字段modelDesc和一个私有字段modelName

    public class Model extends SuperModel {

    public String modelDesc;

    private String modelName;

    public String getModelDesc() {

    return modelDesc;

    }

    public void setModelDesc(String modelDesc) {

    this.modelDesc = modelDesc;

    }

    public String getModelName() {

    return modelName;

    }

    public void setModelName(String modelName) {

    this.modelName = modelName;

    }

    }

    下面我使用了三个测试方法来测试。

    public class ReflectTest {

    public static void main(String[] args) {

    Model model = new Model();

    model.setSuperDesc("父类公开字段");

    model.setSuperName("父类私有字段");

    model.setModelDesc("子类公开字段");

    model.setModelName("子类私有字段");

    //通过getFields方法遍历字段获取model字段

    getNameByGetFields(model);

    //通过getDeclaredFeilds方法获取model字段

    getNameByDeclaredFields(model);

    //通过getSuperClass方法获取model字段

    getNameBySuperClass(model);

    }

    private static void getNameByGetFields(Model model) {

    Class extends Model> sonClass = model.getClass();

    try {

    Field[] fields = sonClass.getFields();

    System.out.println("通过getFields方法遍历字段获取model字段: ");

    for (Field field : fields) {

    System.out.println(field.getName() + ":" + field.get(model));

    }

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    }

    }

    private static void getNameByDeclaredFields(Model model) {

    Class extends Model> sonClass = model.getClass();

    try {

    System.out.println("通过getDeclaredFeilds方法获取model字段: ");

    Field[] fields = sonClass.getDeclaredFields();

    for (Field field : fields) {

    field.setAccessible(true);

    System.out.println(field.getName() + ":" + field.get(model));

    }

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    }

    }

    private static void getNameBySuperClass(Model model) {

    Class extends Model> sonClass = model.getClass();

    try {

    System.out.println("通过getSuperClass方法获取superName字段 ");

    Class> superclass = sonClass.getSuperclass();

    Field[] fields = superclass.getDeclaredFields();

    for (Field field : fields) {

    field.setAccessible(true);

    System.out.println(field.getName() + ":" + field.get(model));

    }

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    }

    }

    }

    当我使用getFields方法遍历所有字段时,输出了以下信息:

    34914a5be48fa7a9cc1fb872220acfc0.png

    这说明getFileds方法只能获取公共字段,但是可以同时获取本身和父类的公共字段

    以下是JDK文档中的描述:

    0c0571f20613b82e5e802a7a74bf65c7.png

    当我使用getDecleadFields遍历所有字段时,输出了以下信息:

    e6a2a56ada8b4a875c084fd5420778f6.png

    这说明getDecleadFields方法只能获取类本身的字段,但是不能获取父类的字段。

    以下时JDK文档中的描述:

    dac66d429a4646c172008977c6189482.png

    当我使用getSuperClass获取父类Class后再使用父类的Class的getDecleadFields方法,不出所料,输出的父类所有的字段。

    32e1f78a005cd47331d8db84b24638a0.png

    这说明要获取父类的私有字段必须先获取它的Class对象。而要遍历一个对象应该出现的所有字段,就需要遍历这个对象和这个对象的父类所有字段,不能一次性直接获取到所有字段。

    最后给个分享个不错的JDK API在线文档地址,点过去进首页能发现惊喜哦。JDK8中文API在线文档

    Over

    展开全文
  • 结论:getDeclaredFields方法仅对类本身的字段有效果,对于继承的父类的字段无效getFields方法只能获取类及其父类的公共字段获取父类的私有字段需要先使用getSuperClass获取父类Class,然后通过父类Class的...

    终于于于于于休息啦,上来先说结论。

    结论:

    getDeclaredFields方法仅对类本身的字段有效果,对于继承的父类的字段无效

    getFields方法只能获取类及其父类的公共字段

    获取父类的私有字段需要先使用getSuperClass获取父类Class,然后通过父类Class的getDeclaredFields方法获取父类的所有字段

    下面我们举个简单的栗子:

    这是我们定义的一个父类,其中定义了一个公共字段superDesc,和一个私有字段superName

    public class SuperModel {

    private String superName;

    public String superDesc;

    public String getSuperDesc() {

    return superDesc;

    }

    public void setSuperDesc(String superDesc) {

    this.superDesc = superDesc;

    }

    public String getSuperName() {

    return superName;

    }

    public void setSuperName(String superName) {

    this.superName = superName;

    }

    }

    这是我定义的一个子类,其中也定义了一个公共字段modelDesc和一个私有字段modelName

    public class Model extends SuperModel {

    public String modelDesc;

    private String modelName;

    public String getModelDesc() {

    return modelDesc;

    }

    public void setModelDesc(String modelDesc) {

    this.modelDesc = modelDesc;

    }

    public String getModelName() {

    return modelName;

    }

    public void setModelName(String modelName) {

    this.modelName = modelName;

    }

    }

    下面我使用了三个测试方法来测试。

    public class ReflectTest {

    public static void main(String[] args) {

    Model model = new Model();

    model.setSuperDesc("父类公开字段");

    model.setSuperName("父类私有字段");

    model.setModelDesc("子类公开字段");

    model.setModelName("子类私有字段");

    //通过getFields方法遍历字段获取model字段

    getNameByGetFields(model);

    //通过getDeclaredFeilds方法获取model字段

    getNameByDeclaredFields(model);

    //通过getSuperClass方法获取model字段

    getNameBySuperClass(model);

    }

    private static void getNameByGetFields(Model model) {

    Class extends Model> sonClass = model.getClass();

    try {

    Field[] fields = sonClass.getFields();

    System.out.println("通过getFields方法遍历字段获取model字段: ");

    for (Field field : fields) {

    System.out.println(field.getName() + ":" + field.get(model));

    }

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    }

    }

    private static void getNameByDeclaredFields(Model model) {

    Class extends Model> sonClass = model.getClass();

    try {

    System.out.println("通过getDeclaredFeilds方法获取model字段: ");

    Field[] fields = sonClass.getDeclaredFields();

    for (Field field : fields) {

    field.setAccessible(true);

    System.out.println(field.getName() + ":" + field.get(model));

    }

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    }

    }

    private static void getNameBySuperClass(Model model) {

    Class extends Model> sonClass = model.getClass();

    try {

    System.out.println("通过getSuperClass方法获取superName字段 ");

    Class> superclass = sonClass.getSuperclass();

    Field[] fields = superclass.getDeclaredFields();

    for (Field field : fields) {

    field.setAccessible(true);

    System.out.println(field.getName() + ":" + field.get(model));

    }

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    }

    }

    }

    当我使用getFields方法遍历所有字段时,输出了以下信息:

    357ce551b58338a63a57b246a393a371.png

    这说明getFileds方法只能获取公共字段,但是可以同时获取本身和父类的公共字段

    以下是JDK文档中的描述:

    3e0e2c6de3bc938d6abffe3d4faeb360.png

    当我使用getDecleadFields遍历所有字段时,输出了以下信息:

    ca82a399f7f5f572f80b0534ecd9c43b.png

    这说明getDecleadFields方法只能获取类本身的字段,但是不能获取父类的字段。

    以下时JDK文档中的描述:

    70724ef3850e2e956146bd7f45f1a11f.png

    当我使用getSuperClass获取父类Class后再使用父类的Class的getDecleadFields方法,不出所料,输出的父类所有的字段。

    05c640671eccb0e4cfcef04034f25fb1.png

    这说明要获取父类的私有字段必须先获取它的Class对象。而要遍历一个对象应该出现的所有字段,就需要遍历这个对象和这个对象的父类所有字段,不能一次性直接获取到所有字段。

    最后给个分享个不错的JDK API在线文档地址,点过去进首页能发现惊喜哦。JDK8中文API在线文档

    Over

    展开全文
  • 抽象类和接口的区别

    2020-05-19 14:00:31
    抽象类和接口 1.变量区别 接口中除了有static, final变量,不能有其他变量。而抽象类中可以定义普通变量。 总结:接口里定义变量只能是公共的静态常量,抽象类中变量是普通变量 2.方法区别 接口中方法...
  • public void dog 称之为公共的。被它修饰的类,属性方法不仅可以跨类访问, 而且允许跨包(package)访问。 void dog没有加任何修饰符,我们通常说这是...被其修饰的类、属性以及方法只能被该类的对象访问,其子类不
  • 现在,我想学习C ++中的结构类之间的区别。 请讨论技术差异以及在OO设计中选择一个或另一个的原因。我将从一个明显的区别开始:如果您未指定public:或private: :,则结构的成员默认为public; 默认情况下,类的...
  • Python不像C++、Java、C#等有明确的公共私有或受保护的关键字来定义成员函数或属性,它使用约定的单下划线“_""__"双下划线作为函数或属性的前缀来标识。使用单下划线还是双下划线,是有很大的区别的。 1. 单...
  • getDeclaredMethods()返回Method对象一个数组,这些对象反映此Class对象表示的类或接口声明所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承方法。 getMethods()返回一个包含某些Method...
  • 在我的一次采访中,我被要求解释一个接口一个抽象类的区别。这是我的回应:Java接口的方法是隐式抽象的,不能有实现。Java抽象类可以具有实现默认行为的实例方法。在Java界面中声明的变量默认为final。抽象类可能...
  • C#接口和JAVA的区别

    千次阅读 2008-08-01 14:04:00
    C#接口和JAVA的区别? 接口是一种“主干”,包含方法签名但是没有方法的实现。在这个方面,接口与抽象一样,只包含抽象方法。C# 接口非常类似于 Java 接口,工作原理基本一样。接口的所有成员都定义为公共成员,...
  • 用get与set,我想也更能很好理解,私有变量及公共变量区别与作用 首先看一下,private与public意思,private:私有,public:公有,顾名思义他两是将、对象或者方法、私有化与公有化 首先,我们先来分析...
  • JAVA访问修饰符有:Public、Private、Protectdefault,合计4种。默认是default, 不需要书写。 ...②private: Java语言中对访问权限限制最窄修饰符,一般称之为“私有的”。被其修饰...
  • 正经地讲: 1、public是公有的公共变量 任何类都可直接访问,其他类不需要通过成员函数(get()和set())就可以访问。...本类和子类可直接访问,介于public和private之间。继承于基类子类,可直接访问基类pro
  • 1.getMethods是获取类中所有公共方法,包括继承自父类的 2.getDeclaredMethods是获取类中自己声明的...获取到一个类的实体后,你可以获取到该类中所有的方法,甚至父类中所有方法(包括私有) getClass().getSuperC...
  • 类和类之间关系有如下几种 : 自身 : 指是自己 同包子类 : 子类 , 并且处于同一个包下 同包其他类 : 没有继承关系 , 但是处于同一个包下 不同包子类 : 子类 , 但是在另一个包下 不同包其...
  • Java中访问修饰符public、private、protecte、default意义讲解: public(接口访问权限...private(你无法访问): Java语言中对访问权限限制最窄修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能
  • getMothod()方法:调用公共方法,不能反射调用私有方法,有时使用不当会有NoSuchMethodException异常,具体来说就是:获取当前类和父类所有public方法。这里父类,指是继承层次中所有父类。比如说,A继承B...
  • 今天在程序中用到java反射机制时,遇到问题记录一下:我当时遇到问题是,我用反射getMethod()调用方法时,发生 NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法,后来...
  • 1.public java语言中访问限制最宽修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨访问,而且允许跨包访问。 2.private java语言中队访问权限限制最窄修饰符,一般称之为“私有的”。...
  • public: Java语言中访问限制最宽的修饰符,一般称之为“公共的...被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。protect: 介于public private 之间的一种访问修饰符,...
  •  今天在程序中用到java反射机制时,遇到问题记录一下:我当时遇到问题是,我用反射getMethod()调用方法时,发生NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法...
  • 1、public公共,加上这个修饰的类或属性,可以在同一个包或者别包里面访问2、private私有的,加上这个修饰的类或属性,只能在同类里访问,同包包不能访问3、protected保护,加上这个修饰的类或属性,只能在...
  • 今天在程序中用到java反射机制时,遇到问题记录一下:我当时遇到问题是,我用反射getMethod()调用方法时,发生 NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法,...
  • protected保护,加上这个修饰类或属性,只能在类和同包访问,别包不能访问 private私有的,加上这个修饰类或属性,只能在同类里访问,同包和别包不能访问 转载于:...
  • public 公共,加上这个...protected 保护,加上这个修饰类或属性,只能在类和同包访问,别包不能访问。在继承关系中,子类可以访问父类public,protected修饰方法和属性,但不能访问private修饰方法和属性。

空空如也

空空如也

1 2 3 4 5 6
收藏数 111
精华内容 44
关键字:

java私有类和公共类的区别

java 订阅