c++ protected_合理使用protected关键字,确保类属性的安全性
继承和组合的选择
我们之前学过,继承是隐式的,组合是显示的,其实实际当中组合和继承都可以在新的类里面放他们的子对象。不过区别是,组合中成员对象一般都是private修饰的,但是为了让用户直接访问新类里面组合对象,就需要将组合的成员对象设置为public。
我们来看一个例子:
class E {
public void s(){}
public void r(){}
public void s(){}
}
class W {
public void i(int p){}
}
class WD {
public void ru(){}
public void rd(){}
}
class D {
public WD wd = new WD();
public void op(){}
public void cl(){}
}
public class C{
public E e = new E();
public W[] w = new W[4];
public D
l = new D(),
r = new D();
public C() {
for(int i = 0; i < 4; i++){
w[i] = new W();
}
}
public static void main(String[] args) {
C c = new C();
c.l.w.ru();
c.w.[0].i(60);
}
}
对于继承而已,我们一般可以把它当做公共类来用,也就是说导出类是专用类,基类是通用的公共类,也可以称为通用类。
如何使用protected关键字
protected关键字的访问权限是介于private和public之间的,比如有时候我们不想让类的用户访问某个成员,但是又想让导出类和同一个包里面的类访问,那么就可以使用protected关键字来实现。但是通常我们不建议用protected关键字来修饰类的成员,一般建议用private关键字来修饰,确保类属性的安全性,但是我们可间接使用protected方法来实现导出类和同一个包类的访问权限。
我们来举个例子看一下:
class V {
private String name ;
protected void set(String n){ name = n;}
public V (String name){ this.name = name}
public String toString(){
return “is ” + name;
}
}
public class C extends V{
private int or;
public C(String name, int or) {
super(name);
this.or = or;
}
public void change(String name,int or) {
set(name);
this.or = or;
}
public String toString(){
return “C ” + or+”: ” +super.toString();
}
public static void main(String[] args) {
C c = new C(“LL”,10);
print(c);
c.change(“B”,20);
print(c);
}
}
/*Output:
C 10: is LL
C 19: is B
通过这个例子我们可以看出,change()方法之所以可以调用方法set(),就是因为方法set()的访问权限是protected。
除此之外,而且我们还可以看出导出类C里面的toString()方法重写了基类的方法。
向上转型
继承的概念中,导出类可以看作是基类的一种类型。比如现在有一个乐器类I作为基类,还有一个吉他类J作为导出类,我们来看一下用这两个类来书写的例子,我们会理解的更加透彻:
class I {
public void play()
static void r(I i){
i.play();
}
}
public class W extends I {
public static void main(String[] args) {
W w = new W();
I.r(w);
}
}
在这个例子中我们看到,r()方法本应该传递一个I类型的参数,但实际却传递了一个W类型的参数,这很让人费解,但是也没有报错。其实这块进行了一个向上的转化,叫做向上转型,也就是说将W类型转为了I类型,是一个向上的过程。
向上转型是属于安全的转型,但是在转型的过程中,会丢失基类中没有的方法。与向上转型相反的就是向下转型,也就是基类或者叫通用类转为专用类或者叫导出类。
讲到这里,我们都知道,继承和组合都可以复用代码,但是什么时候使用继承,什么时候使用组合,这就需要分析一下,我们需要向上转型不,如果需要向上转型,就要使用继承,如果不需要向上转型,那就最好不要用继承。
c++ protected_合理使用protected关键字,确保类属性的安全性相关推荐
- Java——this关键字(调用本类属性、调用本类方法、表示当前对象)
目录 1.调用本类属性 2.调用本类方法 3.表示当前对象 this是一个非常灵活的关键字,不会明确表示一个固定概念,比如int,它就是表示一个整型. 1.调用本类属性 类中有许多成员,大部分情况下类 ...
- Java-Day11 面向对象遍程的入门 (类属性的默认值、构造方法、类的成员、static关键字、类的成员加载顺序、Java(权限)访问修饰符)
目录 1. 类的属性的默认值问题 2. 构造方法(Constructor) 3. 类的成员 3.1 类的成员之一:属性 3.2 UML类图 4. static关键字 5. 类的成员加载(运行)顺序 6 ...
- 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)
27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...
- 类属性的特征java_java定义类、属性、方法
Java是面向对象的程序设计语言,Java语言提供了定义类.定义属性.方法等最基本的功能.类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用到类的对 ...
- c#类属性和实例属性_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...
定义类 类由class member类成员组成,包含字段.属性.方法和事件.其中字段和属性为类的数据成员,用来存储数据:方法负责数据的传递和运算.使用类之前,要进行声明,声明的语法如下: Class ...
- Python中的类属性和类方法(静态方法、私有属性和私有方法)
一.类属性和类方法 类的方法 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数 代码块: class Student(object ...
- 基于Qt5.14.2和mingw的Qt源码学习(三) — 元对象系统简介及moc工具是如何保存类属性和方法的
基于Qt5.14.2和mingw的Qt源码学习(三) - 元对象系统简介及moc工具是如何保存类属性和方法的 一.什么是元对象系统 1.元对象系统目的 2.实现元对象系统的关键 3.元对象系统的其他一 ...
- php中如何声明静态属性,PHP使用static关键字声明静态属性和静态方法
PHP使用static关键字声明静态属性和静态方法 在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法. 静态属性和静态方法不需要在被类实例化的情况下就可以直接使用. ...
- java定义类属性方法_java定义类、属性、方法
Java是面向对象的程序设计语言,Java语言提供了定义类.定义属性.方法等最基本的功能.类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用到类的对 ...
最新文章
- java 集成grizzly_java – 在Grizzly上使用JaaS和Jersey
- makefile中的零星知识点
- HTML基础_Day01
- 假设磁盘块与缓冲区大小相同,每个盘块读入缓冲区的时间为10μs,由缓冲区送至用户区的时间是5μs,系统对每个磁盘块数据的处理时间为2μs。若用户需要将大小为10个磁盘块的
- 解决VS2005 远程工具无法通过同步软件连接S5pv210 样机的问题
- python爬虫有学c的必要吗_可以一边学python爬虫一边学c语言吗?
- jsp内置对象*session
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_17_常用的函数式接口_Function接口中的方法andThen...
- java内存泄露 垃圾回收_Java面试中底层垃圾回收、代码安全、内存泄露
- Web组态—低代码物联网组态平台
- 干货丨7款易上手C语言编程软件推荐
- 操作系统面试知识点总结
- 【C语言】深度剖析数据在内存中的存储
- 逍遥模拟器上传服务器文件,逍遥模拟器后台操作
- rxjava面试题,android教程零基础入门
- 计算机建立excel文件,我的电脑不能新建excel!电脑excle无法使用
- 网页播放器看视频页面绿屏解决方法
- 出现`webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`报错
- 【三维目标检测】Complex-Yolov4详解(一): 数据处理
- 利用分洽法求一组数据中最大的两个数。