C++的继承和Java继承的比较
在C++中继承可分为公有继承(public)保护继承(protected)和私有继承(private),而在Java中默认只有一种继承(相当于C++中的公有继承)下面我们来看一段代码
#include <iostream>
using namespace std; class A{
int aprivate;
void Aprivate(){
cout << "A类的private方法" << endl;
}
protected:
int aprotected;
void Aprotected(){
cout << "A类的protected方法" << endl;
}
public:
A(){}
A(int a, int b, int c):aprivate(a), aprotected(b), apublic(c){}
int apublic;
void Apublic(){
cout << "A类的public方法" << endl;
}
}; //class B : private A{ //public:
// B(){}
// B(int a, int b, int c):A(a, b, c){}
// void Bpublic(){
// Aprotected();
// cout << "B类的public方法----" << aprotected << endl;
// }
//}; int main(){
A a(100, 200, 300);
a.Apublic();
// a.Aprotected();
// a.Aprivate();
cout << a.apublic << endl;
// cout << a.aprotected << endl;
// cout << a.aprivate << endl; return 0;
}
我们定义了一个类A,可以看到:
1、类A外部我们只可以访问公有成员(public),protected和private的成员均不可访问。
2、类A内部成员函数可以访问所有成员,包括(public、protected、private).
上面这两个特点和Java是完全相同的。
下面我们来让B类继承子A类,代码如下:
class B : private A{
public:
B(){}
B(int a, int b, int c):A(a, b, c){}
void Bpublic(){
Aprotected();
cout << "B类的public方法----" << aprotected << endl;
}
};
将上面的继承改为私有继承、保护继承、公有继承,都有以下结论:
1、子类B内部可以访问父类的非private成员。
2、子类B和父类A在类体外部均不可访问类的私有(private)成员。
3、如果是公有继承(public),则子类B在外部可访问父类A的公有属性(如 Apublic()方法)。
4、如果是私有继承和保护继承,子类B在外部不可访问类A的所有属性。
5、如果是保护继承,在B类中继承自A类的保护属性和公有属性均变为保护属性,同理私有继承。
上面这些描述可能有些绕,其实我们可以从上面的结论中看到如下结论,继承方式(public、protected、private)会改变子类继承自父类属性的访问权限(private、protected、public),如下:
| public | protected | private | |
| 共有继承 | public | protected | 不可见 |
| 私有继承 | private | private | 不可见 |
| 保护继承 | protected | protected | 不可见 |
从上面的分析我们可以看出继承方式可以改变子类继承子父类属性的访问区域,所以如果此时有子类C继承自B类,同样会影响到C类对A类成员的访问。
下面我们来看看Java中的继承,先来看一段代码:
public class A {
private int aprivate;
int afriendly;
protected int aprotected;
public int apublic;
private void Aprivate(){
System.out.println("A类的private方法");
}
void Afriendly(){
System.out.println("A类的friendly方法");
}
protected void Aprotected(){
System.out.println("A类的protected方法");
}
public void Apublic(){
System.out.println("A类的public方法");
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
//a.Aprivate();
a.Afriendly();
a.Aprotected();
a.Apublic();
//System.out.println(a.aprivate);
System.out.println(a.afriendly);
System.out.println(a.aprotected);
System.out.println(a.apublic);
}
}
可以看到:
1、Java比C++多了一个friendly访问权限,应为C++中没有包的概念(是命名空间).
2、Java中的protected属性是可以在类外部访问的。
3、Java中的friendly属性可以在相同包下的类外部访问。
注意:protected属性也可以在同一个包类访问,如果Test类和A类不在同一个包下的话,上面的a.Afriendly()和a.Aprotected()均不可访问。
public class B extends A{
public void Bpublic(){
Afriendly();
Aprotected();
Apublic();
}
}
B b = new B();
b.Bpublic();
b.Afriendly();
b.Aprotected();
b.Apublic();
可以看到:
1、Java中的继承不区分(私有继承和公有继承)所以继承后相当于C++中的公有继承。
2、Java中的protected成员是可以在类外部被访问的(protected和friendly的前提是在同一个包下)。
下面我们再来看一个特点:
public class B extends A{
@Override
public void Afriendly() {
super.Afriendly();
System.out.println("重写了A类的Afriendly方法");
}
public void Bpublic(){
Afriendly();
Aprotected();
Apublic();
}
}
可以看到:
1、在子类B中重写A类的Afriendly方法的时候我们可以将访问权限增大(如上面的public)
2、Java中的文件中只能有一个public类。
3、Java中的外部类(对应的是内部类,这里暂且不谈)只能被修饰为public或friendly,不能被修饰为private或protected.
最后我们来做一个总结吧:
1、在Java中有四种权限,public可以在整个工程访问,protected属性可以在本类和子类的整个工程访问,friendly属性可以在本类的整个工程访问,private只能在本类内部访问。
2、在C++中又三中权限,public可以在整个工程访问,protected属性只能在本类内部和子类的内部访问,private属性只能在子类内部访问。
另外C++中可以多继承,一个多继承的例子如下:
#include <iostream>
using namespace std; class B1{
int b1;
public:
B1(int i){
b1 = i;
cout << "构造函数 B1." << i << endl;
}
void print(){
cout << b1 << endl;
}
}; class B2{
int b2;
public:
B2(int i){
b2 = i;
cout << "构造函数 B2." << i << endl;
}
void print(){
cout << b2 << endl;
}
}; class B3{
int b3;
public:
B3(int i){
b3 = i;
cout << "构造函数 B3." << i << endl;
}
int getb3(){
return b3;
}
}; class A : public B2, public B1{
int a;
B3 bb;
public:
A(int i, int j, int k, int l):B1(i), B2(j), bb(k){
a = l;
cout << "构造函数 A." << l << endl;
} void print(){
B1::print();
B2::print();
cout << a << ", " << bb.getb3() << endl;
}
}; int main(){
A aa(1, 2, 3, 4);
aa.print();
return 0;
}
C++的继承和Java继承的比较的更多相关文章
- 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean
7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...
- Java基础进阶:继承重点摘要,继承详解,方法重写注意事项,方法重载与重写的区别,抽象类,代码块, 附重难点,代码实现源码,课堂笔记,课后扩展及答案
继承重点摘要 *继承的特点: 子类在初始化之前,一定要先完成父类数据的初始化 子类在初始化之前,一定要先访问父类构造,完成父类数据的初始化 系统在每一个构造方法中默认隐藏了一句super(); 如果我 ...
- Java继承与组合
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
- JAVA继承时构造函数的问题
今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...
- Java继承知识总结
Java中的继承作为Java面向对象三大特性之一,在知识点上而言,还是很多的.现做出如下总结: 1. 继承的概念: 继承在本职上是特殊——一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种 ...
- Java继承和接口
接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...
- Java继承的初始化
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- 继承(JAVA)
继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力. 一.继承的基本语法: 在Java语言中,用extends关键字表示一个类继承了另 ...
- 9.20 java继承
package liu0920; //继承 public class Person { //属性 姓名和年龄 private String name; private int age; //无参构造方 ...
随机推荐
- laravel 自定义全局函数
在 app 目录下创建一个 Helpers 目录,在此目录下创建文件.这些文件就是全局函数文件.如叫:function.php 加载此文件: 1 . 在 bootstrap/autoload.php ...
- javascript面向对象编程,带你认识封装、继承和多态
原文链接:点我 周末的时候深入的了解了下javascript的面向对象编程思想,收获颇丰,感觉对面向对象编程有了那么一丢丢的了解了~很开森 什么是面向对象编程 先上一张图,可以对面向对象有一个大致的了 ...
- HTML图片映射
<img>图片映射 <map>与<area>一起使用来定义一个图像映射(一个可点击的链接区域). <img src="cat.jpg" a ...
- GIL解释锁及进程池和线程池
官方介绍 ''' 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nati ...
- caioj 1112 树形动态规划(TreeDP)7:战略游戏
这道题和上一道题非常相似 这道题是看边,上一道是看点. 但是状态定义不同 看边的话没有不放不安全这种状态 因为当前结点的父亲无法让这颗子树没有看到的边看到 所以这种状态不存在 而上一道题存在不放不安全 ...
- 洛谷—— P1926 小书童——刷题大军
https://www.luogu.org/problem/show?pid=1926#sub 题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人 ...
- error:assign attribute must be unsafeunretained
今天在使用协议的过程中.偶然发现这样使用 ? 1 2 3 4 5 6 7 8 9 10 @interface AppDelegate (){ id<chatdelegate> t ...
- 【Hibernate步步为营】--(一对多映射)之单向关联
上篇文章讨论了双向关联的一对一映射,用了两个章节,主要是从主键和外键两种关联映射展开具体讨论.双向关联的映射须要在两个映射文件里分别加入相互的相应关系.斌刚在相应的类中加入相应的关联类的属性.这样在一 ...
- 使用LruCache和DiskLruCache来下载图片
LruCache是一个非常好用的图片缓存工具: 主要做法是:滑动图片时将图片的bitmap缓存在LruCache<String, Bitmap>中,退出程序后将图片缓存进文件中.採用Dis ...
- numpy 数据类型与 Python 原生数据类型
查看 numpy 数据类型和 Python 原生数据类型之间的对应关系: In [51]: dict([(d, type(np.zeros(1,d).tolist()[0])) for d in (n ...