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; //无参构造方 ...
随机推荐
- childNodes.length和form.length的不同
我们知道,DOM里面提供了element.childNodes.length属性,childNodes 属性返回节点的子节点集合,以 NodeList 对象. 那么childNodes包含哪些节点呢? ...
- Glide加载圆形图片第一次只显示默认图片
Glide加载圆形图,又设置了默认图,很多时候第一次加载的时候只显示默认图.下面的方案可以解决.\ Glide.with(AudioDetailActivity.this) .load(cover) ...
- sql server 中查询数据库下有多少张表以及同义词等信息
--查询数据库有多少张表SELECT count(0) from sysobjects where xtype = 'u' 复制代码 解释:sysobjects系统对象表. 保存当前数据库的对象.如约 ...
- [洛谷P1343]地震逃生
题目大意:有n个点m条单向边,每条边有一个容量.现有x人要分批从1走到n,问每批最多能走多少人,分几批运完(或输出无法运完). 解题思路:一看就是网络流的题目.每批最多能走多少人,即最大流.分几批运完 ...
- rsync---远程数据同步工具
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而 ...
- 关于memset赋最值
出处[辗转山河弋流歌 by 空灰冰魂] blog.csdn.net/vmurder/article/details/46537613 memset(a, 0x3f, sizeof(a)) //int, ...
- 洛谷 P1604 B进制星球
P1604 B进制星球 题目背景 进制题目,而且还是个计算器~~ 题目描述 话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球.因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2 ...
- Strom 简介,ppt
数据的生成可以看做一连串发生的离散事件, 这些事件流会伴随着不同的数据流.操作和分析,都会由一个通用的软件框架和基础设施来处理. Storm 是 实时流计算框架之一.它提供了可容错 ...
- poj 1681 Painter's Problem(高斯消元)
id=1681">http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. ...
- Windows 8 快捷键收集整理
Windows键快捷方式列表 Windows键:打开開始屏幕 Windows键+空格键:切换输入语言和键盘布局 Windows键+O:禁用屏幕翻转 Windows键+,:暂时查看桌面 Windows键 ...