码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础

时间:2016-09-08 23:09:05      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

这两天回忆一些Java基础,感觉自己很多地方都不是很牢固,也花费在不少时间和不少流量在手机上查资料。

还是写下来这些东西以免再忘记。

同时还是要记住多动手,编程最重要的就是动手敲啊,有想法有疑问就要自己去实现去验证。

1. 访问控制

  技术分享

  Java的默认访问权限(包访问权限)跟C++中的友元很像其实,都具有一定的特殊性。

  同一个包中的类是可以任意访问其他类的非私有成员的,而如果继承关系发生在同一个包中,子类继承的所有非私有成员都是可见的。

  但如果继承不是发生在同一个包中则会有很大不同,通过继承导入的包,子类只有继承的保护和公有成员才是可见的。

  导入的包只能导入该包内的公有类和该公有类的公有成员,保护成员在子类中可见,但即使在子类中也不能通过父类对象来访问保护成员,只能通过子类访问继承后的保护成 员。

  继承发生的时候其实子类都会继承父类的所有成员,不管是私有保护或者公有,只是访问修饰符不同导致了可见性的不同。

  C++中的友元,允许访问友元类的所有变量,包括私有变量包括通过对象或对象作为函数引用参数访问。在子类中是不可以通过对象访问父类的保护成员的。只有公有成员可以通过对象或对象指针访问。

  C++有三种继承方式,最常用的还是public继承,而且Java直接阉割了其他的两种继承方式。

    关于类成员的protected权限,其实是很值得琢磨的我觉得。

  介于private和public之间,在Java中,在同一个包内发生的继承就不说了,除了非私有成员其他类(包括子类)都可以任意访问,包括通过对象访问,子类继承的除非私有成员外也都具有可见性。和如果在不同包下的继承,在子类中就没有办法通过父类对象访问protected成员,在这一点上和C++还是很像,C++中子类是没有办法通过父类对象访问父类的保护成员的。

 

 

  关于访问控制,其实OOP思想的语言都大同小异,不管是Java,C++,还是C#。

2. 抽象类与接口

  抽象类中可以没有抽象方法,但具有抽象方法的类必须定义为抽象类,抽象类不能实例化。

  接口中的变量自动具有public static final属性,接口中的方法自动具有public abstract属性,接口允许多继承。

  C++中含有纯虚函数的类称为虚基类,和Java中的接口比较像,但虚基类中的函数除了纯虚函数都可以有自己的实现,虚基类同样不能实例化。纯虚函数不能有自己的函数体,但是纯虚析构函数除外。

3. 重写与重载

  C++中用虚函数来实现多态机制,而Java中的类的方法都是隐式的虚函数。

  重写(覆盖、override、overwrite)是子类和父类的变量名变量类型、方法名方法参数的类型个数顺序完全一样。

  重载是函数名相同,参数类型、参数个数有一个不同,参数顺序的差异可不可以构成重载视情况而定,函数的返回值不同构不成重载。

  在子类中访问父类被覆盖的成员变量或方法,Java用super,C#用base,C++用作用域运算符::。

  动态绑定的时候如果访问成员变量的话,都是访问父类引用(Java)或父类指针(C++)指向的父类的成员变量,C++和Java皆如此。

  动态绑定的话只有存在重写的情况才会调用子类的方法函数,如果不存在重载就直接在父类中寻找,如果找不到就报错。

  如下面的例子:输出  ”father“。

  技术分享

  Java中可以有所谓的”跨类重载“,但是C++中却不允许,具体可以参考这篇博文:http://blog.csdn.net/anialy/article/details/7621619

  而C++中肯定也有可以突破这种限制的方法,见这里:http://blog.csdn.net/autumn20080101/article/details/8514813

  关于C++的虚函数与重写,我觉得这篇文章讲的很好:C++的虚函数与重写

4. Java/C++中的hash_map/unordered_map的实现原理。

  其实就是一个哈希函数,配合数组和链表实现,会存在数组的重新动态分配的过程。

Java基础

标签:

原文地址:http://www.cnblogs.com/niuxichuan/p/5854761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!