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; //无参构造方 ...
随机推荐
- python实现决策树C4.5算法(在ID3基础上改进)
一.概论 C4.5主要是在ID3的基础上改进,ID3选择(属性)树节点是选择信息增益值最大的属性作为节点.而C4.5引入了新概念"信息增益率",C4.5是选择信息增益率最大的属性作 ...
- BZOJ 3674: 可持久化并查集模板
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...
- bzoj3252: 攻略 优先队列 并查集 贪心
考场上自己yy出来的做法..... Code: #include<cstdio> #include<algorithm> #include<queue> #incl ...
- [NOIP2015提高组]运输计划
题目:BZOJ4326.洛谷P2680.Vijos P1983.UOJ#150.codevs4632.codevs5440. 题目大意:有一棵带权树,有一些运输计划,第i个运输计划从ai到bi,耗时为 ...
- ConEmu windows上的终端工具
ConEmu Windows terminal 官网: http://conemu.github.io/
- 【IDEA】Error: java: Compliance level '1.6' is incompatible with target level '1.8'. A compliance level '1.8' or better is required解决办法
在运行的时候常常出现如下错误: Error: java: Compliance level '1.6' is incompatible with target level '1.8'. A compl ...
- FPGA design flow
FPGA engineering process usually involves the following stages: Architecture design. This stage invo ...
- Understanding IIS Bindings, Websites, Virtual Directories, and lastly Application Pools
In a recent meeting, some folks on my team needed some guidance on load testing the Web application ...
- php中局部变量和全局变量
php中局部变量和全局变量 代码1:函数内部使用函数外部变量错误方法 <?php $name = 'fish'; function animal() { echo $name; } animal ...
- 关于commJS 和 es6 的一些区别
CommonJS模块与ES6模块的区别 本文转自 https://www.cnblogs.com/unclekeith/archive/2017/10/17/7679503.html CommonJS ...