Java中的继承,封装,多态三种体系与C++的区别

  

继承体系是三种体系中与C++区别最大的地方

 

  java中所有普通成员函数自动默认为虚函数,函数覆盖时除了遵守一些原有C++特性外,函数前的访问修饰符必须不低于父类的权限。

 

关键词abstract:

 

  包含一个abstract方法(即抽象方法)的类必须修饰为abstract。abstract方法也就是C++中的纯虚函数,抽象类用法同C++的抽象类一致,抽象类不可建立实例,抽象类的子类必须覆盖抽象类中的所有抽象方法,否则子类仍然为抽象类。

 

关键词extends:

  java为了避免多重继承时产生的两仪性问题只支持单一继承,每个类只能有一个父类,派生方式只有一种不再分公有私有保护派生,以关键字extends继承。当程序员设定一个类时没有为其显示的指定一个父类,那么默认该类继承自Object。


 
关键词interface,implements:

 

  为了弥补java中不能多继承的问题,java中出现新的数据类型“接口”,定义一个接口interface,实现一个接口implements,接口内不允许出现静态函数和函数重载。

 

  接口中的成员方法前默认都是public,abstract。成员数据前默认加final与static。

 

  接口可extends多个接口,但要保证多个继承来的接口内不存在重载的抽象函数。

 

  接口可以被多实现,即一个类可以拥有多个接口。因为接口中的所有成员方法都是抽象方法(也就是C++中的纯虚函数)所有成员数据都是静态常量,所以多实现时不存在两仪性问题。

 

  接口与继承的主要思想区在于,基本功能继承,扩展功能实现接口。

 

  由上可以看出,java使用单一继承避免C++中的两仪性问题,又为了可以拥有多继承的关系而设定了接口,接口内的所有成员函数被强制限定为抽象函数,所有成员数据被强制限定为静态常量,这样以来很好的解决了多重继承下产生的两仪性问题。其整体作用就是为了代替C++中的虚基类。虽然过程稍显繁琐,但在可靠性方法比虚基类安全很多,换句话说java中多继承时多个基类中相同的成员函数只可能有一个拥有函数体。


 

封装体系有较小变动
 

  首先因为Java纯面向对象性,所以Java中所有元素皆被看做是一个对象,理论上来讲任何一个元素都是存在于类中的,比如main函数也被封装进一个类中以static修饰,其中函数重载,类的包含,类的构造等特性都予以保留。

 

  Java中没有析构函数,没有复制构造函数,因此没有隐示构造,对象必须也只能用new关键词创建在堆中。构造函数间可以使用this()函数相互调用,但不可产生递归。同时Java中拥有一个super关键词,用法同this一样,指向的是唯一继承而来的那个基类。同样可以使用super()函数调用基类的构造函数,super的作用替代了C++中构造初始化的功能,其作用与原理如C++构造函数Structure(): BaseClass(){} 中的BaseClass一致,因此super()与this()都必须写在构造函数的第一行,有且只能有一个存在。

 

Java中类元素:构造代码块,静态代码块:

 

  构造代码块,优先于构造函数执行,用于该类的所有对象初始化时被调用

 

  静态代码块,在类中用static修饰的无名代码块为静态代码块,一个类的静态代码块随着类的加载而执行,多数情况下为初始化类与类的静态数据使用

 

  构造代码块,静态代码块可使用多个


访问权限:

 

public:   修饰的成员在任何地方都可以访问。同C++特性一致

 

protected: 修饰的成员只有在同一包(包java的新特性)内使用,或是在其它包中派生该类的子类

 

default:   Java中的新成员修饰,为默认修饰,即不写任何修饰的情况。该种情况下除了在包外不可见,在包外派生出的子类也不可见,只能在同一包的的范围内有效。

 

private:         被修饰的变量与函数除了本类中都不可见包括子类,同C++特性一样


Java中类是可以被修饰权限的。默认情况下,包内可以访问,包外无法访问,public修饰后任何地方都可以访问。

 

默认构造函数的权限与类权限相同。

 

包的作用:

对类文件进行分类管理。


给类提供多层命名空间。


写在程序文件的第一行。


类的全称是包名点类名。


包也是一种封装的形式。

 

  包的性质和目录一样,其实也就是目录,Java编译后每一个类对应一个class文件,在同一目录下的class文件可以相互调用。

 

  定义一个类所属的包可以在程序的第一行 package PackName(包名);

 

  调用非当前包下的类首先要保证该类被修饰为了public。然后有两种方法调用。

 

  • 使用。import PackName(包名).ClassName(类名); 将包导入到当前class文件中。可以使用*通配符。

 

  • 使用包名点类名,如new PackName.Object();

 

  • 使用import stataic 包名.类名.静态成员名,可以将该类内的静态成员直接导入到当前文件,省去在使用该成员时前的作用域标识。可以使用*号将类中所有静态成员导入。

 

多态体系没有变动

 

  Java仍然保持C++的原有多态性,除了指针被改为引用外,其它功能和用法没任何变动。


 
  有必要说明的几点:Java中所有非静态函数自动被修饰为virtual,也就是说所有函数自动拥有多态性,但多态性同样仅限于函数,成员变量与静态变量仍然没有多态性。根据C++中虚函数表的原理,推测Java中应该也有这么一个表,所有非静态函数一经加载自动将函数体地址添加进该表中,以达到动态联编时的多态性。但成员变量没有这样的表,所以不存在多态性。

 

  另外:Java中可以使用特有的匿名类书写格式。如下所示:

public class Demo {

	void anonymity(){
		
		Data data = null;
		
		data = new Data() {
			@Override
			void code() { 
				System.out.println("Hello Word!"); 
			}
		};
	}
}

abstract class Data {
	abstract void code();
}

  以上代码演示建立一个Deta的匿名子类同时建立这个子类的对象并覆写Data类中的code方法,然后将对象交给一个Date类的引用保存,当anonymity函数结束后,在外部使用data引用,仍然可以产生一个动态联编时的多态效果。这个data引用甚至可以是外部的,即使anonymity函数结束后只要data引用存在,那么创建的匿名类依然有效。

 

  Data可以为abstract类也可以为interface也可以为普通类。其后的大括号内可以覆写多个方法,和添加方法或数据,但必须同样遵守抽象函数的必须覆写特性。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值