继承和组合的选择

我们之前学过,继承是隐式的,组合是显示的,其实实际当中组合和继承都可以在新的类里面放他们的子对象。不过区别是,组合中成员对象一般都是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关键字,确保类属性的安全性相关推荐

  1. Java——this关键字(调用本类属性、调用本类方法、表示当前对象)

    目录 1.调用本类属性 2.调用本类方法 3.表示当前对象 this是一个非常灵活的关键字,不会明确表示一个固定概念,比如int,它就是表示一个整型. 1.调用本类属性 类中有许多成员,大部分情况下类 ...

  2. Java-Day11 面向对象遍程的入门 (类属性的默认值、构造方法、类的成员、static关键字、类的成员加载顺序、Java(权限)访问修饰符)

    目录 1. 类的属性的默认值问题 2. 构造方法(Constructor) 3. 类的成员 3.1 类的成员之一:属性 3.2 UML类图 4. static关键字 5. 类的成员加载(运行)顺序 6 ...

  3. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

  4. 类属性的特征java_java定义类、属性、方法

    Java是面向对象的程序设计语言,Java语言提供了定义类.定义属性.方法等最基本的功能.类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用到类的对 ...

  5. c#类属性和实例属性_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...

    定义类 类由class member类成员组成,包含字段.属性.方法和事件.其中字段和属性为类的数据成员,用来存储数据:方法负责数据的传递和运算.使用类之前,要进行声明,声明的语法如下: Class ...

  6. Python中的类属性和类方法(静态方法、私有属性和私有方法)

    一.类属性和类方法 类的方法 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数 代码块: class Student(object ...

  7. 基于Qt5.14.2和mingw的Qt源码学习(三) — 元对象系统简介及moc工具是如何保存类属性和方法的

    基于Qt5.14.2和mingw的Qt源码学习(三) - 元对象系统简介及moc工具是如何保存类属性和方法的 一.什么是元对象系统 1.元对象系统目的 2.实现元对象系统的关键 3.元对象系统的其他一 ...

  8. php中如何声明静态属性,PHP使用static关键字声明静态属性和静态方法

    PHP使用static关键字声明静态属性和静态方法 在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法. 静态属性和静态方法不需要在被类实例化的情况下就可以直接使用. ...

  9. java定义类属性方法_java定义类、属性、方法

    Java是面向对象的程序设计语言,Java语言提供了定义类.定义属性.方法等最基本的功能.类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用到类的对 ...

最新文章

  1. java 集成grizzly_java – 在Grizzly上使用JaaS和Jersey
  2. makefile中的零星知识点
  3. HTML基础_Day01
  4. 假设磁盘块与缓冲区大小相同,每个盘块读入缓冲区的时间为10μs,由缓冲区送至用户区的时间是5μs,系统对每个磁盘块数据的处理时间为2μs。若用户需要将大小为10个磁盘块的
  5. 解决VS2005 远程工具无法通过同步软件连接S5pv210 样机的问题
  6. python爬虫有学c的必要吗_可以一边学python爬虫一边学c语言吗?
  7. jsp内置对象*session
  8. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_17_常用的函数式接口_Function接口中的方法andThen...
  9. java内存泄露 垃圾回收_Java面试中底层垃圾回收、代码安全、内存泄露
  10. Web组态—低代码物联网组态平台
  11. 干货丨7款易上手C语言编程软件推荐
  12. 操作系统面试知识点总结
  13. 【C语言】深度剖析数据在内存中的存储
  14. 逍遥模拟器上传服务器文件,逍遥模拟器后台操作
  15. rxjava面试题,android教程零基础入门
  16. 计算机建立excel文件,我的电脑不能新建excel!电脑excle无法使用
  17. 网页播放器看视频页面绿屏解决方法
  18. 出现`webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`报错
  19. 【三维目标检测】Complex-Yolov4详解(一): 数据处理
  20. 利用分洽法求一组数据中最大的两个数。

热门文章

  1. 使用POI读取excel文件内容
  2. 链家java_链家2018春招Java工程师编程题题解
  3. NGINX最新API管理模块已可用,针对内部和外部API进行了优化
  4. 『Python × C++』函数传参机制学习以及对比
  5. linux文件系统基本知识
  6. 设计模式:桥接模式(Bridge Pattern)
  7. 循环神经网络基础介绍
  8. Asp.Net生命周期系列一
  9. T-SQL查询进阶--变量
  10. SQL重复记录查询(常用)