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; //无参构造方 ...
随机推荐
- webi和universe
Universe是一个包含以下内容的文件: 1 一个或多个数据库中间件的连接参数. 2 称为对象的SQL结构,映射到数据库中的实际SQL结构,如列,表和数据库函数.其中对象是按类分组的.用户既可以看到 ...
- JavaScript总结(3)
第3章 获取用户的输入 <script>10 intA=prompt("请输入第一个数字","");11 intB=prompt("请输入 ...
- selenium自动化框架介绍------unittest版本
首先说下unittest的两个问题:1.未实现失败重跑 2.未实现远程的分布式(即多线程呼起多台远程计算机,并行进行用例的执行), 为什么要使用框架: 比较方便,只需要写用例就行,而不用考虑结构.还 ...
- CentOS下安装SVN服务端
---恢复内容开始--- 1.使用yum安装 yum install subversion 2.创建仓库 1.创建成功后在svn下面多了几个文件夹. cd /home mkdir svn svnadm ...
- NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统
原文:NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统 前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的 ...
- 【Codeforces Round #462 (Div. 1) B】A Determined Cleanup
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 设\(设f(x)=a_d*x^{d}+a_{d-1}*x^{d-1}+...+a_1*x+a_0\) 用它去除x+k 用多项式除法除 ...
- ArcGIS api for javascript——鼠标悬停时显示信息窗口
描述 本例展示当用户在要素上悬停鼠标时如何显示InfoWindow.本例中,要素是查询USA州图层的QueryTask的查询结果.工作流程如下: 1.用户单击一个要素 2.要素是“加亮的”图形. 3. ...
- Liquibase简介(1)
Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. Liquibase具备如下特性: * 不依赖于 ...
- uvalive 4730王国kingdom(并查集+线段树)
题意:有T组測试数据.每组数据的N表示有N个城市,接下来的N行里每行给出每一个城市的坐标(0<=x,y<=1000000),然后有M(1<M<200000)个操作,操作有 ...
- iOS xib View宽高不能改变
IOS - xib(Interface Builder,view) - can't change view size(view不能改变大小问题) 今天在试着swift语言写个demo,,当中遇到了这个 ...