在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继承的比较的更多相关文章

  1. 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean

    7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...

  2. Java基础进阶:继承重点摘要,继承详解,方法重写注意事项,方法重载与重写的区别,抽象类,代码块, 附重难点,代码实现源码,课堂笔记,课后扩展及答案

    继承重点摘要 *继承的特点: 子类在初始化之前,一定要先完成父类数据的初始化 子类在初始化之前,一定要先访问父类构造,完成父类数据的初始化 系统在每一个构造方法中默认隐藏了一句super(); 如果我 ...

  3. Java继承与组合

    Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...

  4. JAVA继承时构造函数的问题

    今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...

  5. Java继承知识总结

    Java中的继承作为Java面向对象三大特性之一,在知识点上而言,还是很多的.现做出如下总结: 1. 继承的概念: 继承在本职上是特殊——一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种 ...

  6. Java继承和接口

    接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...

  7. Java继承的初始化

    /** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...

  8. 继承(JAVA)

    继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力. 一.继承的基本语法: 在Java语言中,用extends关键字表示一个类继承了另 ...

  9. 9.20 java继承

    package liu0920; //继承 public class Person { //属性 姓名和年龄 private String name; private int age; //无参构造方 ...

随机推荐

  1. linux上将另一个文件内容快速写入正在编辑的文件内

    一.我们看到 www 目录下有两个文件.like.php 内有一行字母,而 loo.php 内什么也没有. 二 .我们来编辑 loo.php. 三.用下面的命令将 like.php 的内容复制到 lo ...

  2. 洛谷1019 单词接龙 字符串dfs

    问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  3. WHU 1552 Seats 枚举

    题意: 有一个年级中7个班的n个学生. 一天,他们毫无顺序的站成一排.请计算最小的交换次数,使得 相同班的同学都站在一起. (只有站在一起的人才能交换) 思路: 如果知道班级的最终排列就能在很短的时间 ...

  4. python中一些有用的函数------持续更新中

    strip() 函数 用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列. str2 = " Runoob " # 去除首尾空格 print (str2.strip()) ...

  5. 【Cocos2d-x 3.0】游戏开发之win32配置环境搭建project

    作者:Senlern 转载请注明,原文链接:http://blog.csdn.net/zhang429350061/article/details/37958275 非常久没有写教程了.如今认为还是要 ...

  6. Swift:UIKit中Demo(一)

    关于Swift的基本概念及语法知识.我在前面的章节中已经介绍了非常多.这一节和下一节主要有针对性的解说Swift在实际UIKit开发中的使用场景及注意点.先来看看Demo的终于效果图. Demo分析: ...

  7. 【AHOI2013】【BZOJ3238】差异

    Description Input 一行,一个字符串S Output 一行.一个整数.表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...

  8. CSS3 实现RSS图标

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>CSS3 实现RSS图标&l ...

  9. CSS 相对/绝对(relative/absolute)定位与jQuery的控制显示隐藏

    曾经写显示隐藏老是用jq方法控制: dom.show(); dom.hide(); 事实上这样还是有非常多缺陷的. 这是html结构: <div class="holi"&g ...

  10. 111.final与override

    #include <iostream> using namespace std; class myclass { public: //后面加一个final,则禁止虚函数被子类重写 //fi ...