面向对象思想
PS:类似于这种list<T.>,请将最后的.给去除掉
继承
继承的关系就是一种is-a的关系
子类增加或修改基类(增加成员变量,函数)
java中所有函数都相当于c++中的虚函数
封装
默认也称package private
尽量只使用private和public
派生类中修改封装可见性
比如private改成public或者是public变成private,这是不建议使用的
不可变性
不可变对象 immutable objects
可以引用传递,可以缓存
线程安全
final关键字的使用
在类申明中,类不可以被继承
函数申明,函数不可以在派生类中重写
变量申明,变量不可以指向其他对象
Static final变量,用于定义变量,名称一般大写
实现不可变性
使用final关键字无法保证不可变性
从接口定义,类的实现上保证不可变性
泛型
以list为例,有很多种类型
一般来说,类型很多的话,可能就是建错了
从list到list<T.>
规定list中的元素只能是类型T
ArrayList<integer.>,ArrayList<string.>
Linkedlist<integer.>,linkedlist<string.>
虽然规定了只能是类型T,但是在实现的时候无所谓T是什么类型,但是要告诉T到底是什么类型,然后保证其中的元素的类型,这就是泛型的情况
语法方面
Java type erasure
早期java是没有泛型的
为了兼容性,在运行的时候会将所有的泛型内容erase,泛型单纯就是给编译器看的
运行的时候,list,list<string.>,list<integer.>,这三个是没有区别的
运行的时候怎么知道泛型的类型?
比如有
不清楚的话可以换一个方法
删掉了以后编译器可以保证,那么编译器是怎么保证的,这里有一个概念covariance,是有一些反直觉的
ArrayList<integer.>是list<integer.>吗?答案是,是的
那么list<integer.>是list<object.>吗?答案是,不是的
将list<integer.>转换成list<object.>的方法
第一个,new ArrayList<object.>(intlist)
第二个,强制转换,很危险可能会丢失数据,但是也可以,所以要先想想为什么要转换
泛型中对于c++的虚函数表(没有类型,就是一内存块)
java开发者来说,是理解面向对象的具体实现
对于c++开发来说,虚函数表是很重要的
对于c++和java来说,可以理解这两种设计语言的不同之处
例如
End