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属性只能在子类内部访问。

时间: 2024-08-29 00:53:37

C++的继承和Java继承的比较的相关文章

Java—继承

继承 继承是类与类的一种关系,是一种"is a"的关系.注意:java中的继承是单继承,一个类只有一个父类. 继承的好处:子类拥有父类的所有属性和方法(private修饰的无效),实现代码的复用 语法规则:class 子类 extends 父类{} 父类对象的属性和子类对象的属性并没有关系,是两个属性 方法的重写 如果子类对继承父类的方法不满意,可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则:返回值类型.方法名.参数类型及个数,都要与父类继承的方法相同. 继承的

Java 继承、多态与类的复用

摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了它的实现机制和详细应用.此外,为了更好地理解继承和多态.我们对final关键字进行了全面的介绍. 在此基础上.我们介绍了Java中类的载入及初始化顺序.最后.我们对面向对象设计中三个十分重要的概念–重载.覆盖与隐藏进行了详细的说明. 要点: 继承 组合,继承,代理 多态 final 关键字 类载入及

Java继承知识总结

Java中的继承作为Java面向对象三大特性之一,在知识点上而言,还是很多的.现做出如下总结: 1. 继承的概念: 继承在本职上是特殊--一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的 一些属性或方法. 2. 继承中的初始化顺序: 从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类属性和实例属性).方法(包括类方法和实例方法).构造器和 初始化块(包括类的初始化块和实例的初始化块).对于继承中的初始化顺序,又具体分为类的初始化和对象的初

Java 继承与重写、重载

1.类的继承 1)继承 父类:所有子类所共有的属性和行为 子类:子类所特有的属性和行为 通过extends关键字来实现类的继承 子类(Sub class)可以继承父类(Super class)的成员变量及成员方法,同时也可以定义自己的成员变量和成员方法 Java语言不支持多重继承,一个类只能继承一个父类(单一继承),但一个父类可以有多个子类 继承具有传递性,子类的子类可以继承父类的父类的成员变量及成员方法 2)继承中构造方法(super关键字) Java规定:构造子类之前必须先构造父类 子类的构

java继承和多态

java方法直接调用原理推测 有错误还望指正 当直接调用某对象的某方法时  会更具该对象获取到类信息对象   在从类信息对象中找到该方法 没找到 获取父类信息对象继续查找 找到了执行  jdk距离实现是通过反射还是其它? 如果按以上原理    以下情况解释不通 创建一子类对象  赋值给一父类指针变量  通过父类指针变量掉run方法   run方法在父类或子类中为私有  这种情况调用的是父类的run方法 并非子类的run方法 反射jar包 package extend; import org.ju

Java继承,多态,组合应用

继承:  面向对象的三大特征之一:    是类和类之间的一种拓展关系,是一种从一般到特殊的关系;    格式: sub   extends Super,  我们把sub称为子类或者拓展类, 把super称为父类或者基类(超类)   泛化: 把子类中的共性抽取到父类的过程; 特化: 子类在父类的基础之上,拓展自己特有的状态和特征;    Object: 是所有类的直接父类后间接父类;      class  Student{} 等价于  class  Student extends Object{

Java继承

public class Employee { public static String superStr = "SUPERSTR"; public String test() { return "SUPERTEST"; } public String test2() { return "SUPERTEST2"; } } public class Manager extends Employee { public static void main

Java继承改进

一.java继承改进 首先,多继承的缺点: 1.继承多个父类,父类中方法名相同,产生歧义 2.父类中方法同名,子类未覆盖,也会歧义 所以,java改进,类只能单继承,接口可以多继承 接口中只有抽象方法和静态常量 1.抽象方法只能在实现接口类中实现,调用时调用实现类的方法 2.静态变量在编译期间将确定调用关系了,存在冲突也会在编译的时候提示错误 ,而且引用变量一般直接使用类名或接口名,避免产生歧义. 1.1继承的初始化 继承关系是传递的.如,类C继承类B,类B继承类A,则类C既有从类B继承下来的变

继承(JAVA)

继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力. 一.继承的基本语法: 在Java语言中,用extends关键字表示一个类继承了另一个类.例如: public class Sub extends Base{ ....... } Sub类到底继承了Base类的哪些东西呢?分为以下两种情况: ① 当Sub类和Base类位于同一个包中:Sub类继承Base类中public.Protected和默认访问级别的成员变量和成员方法 ② 当