面向对象思想2【笔记】

面向对象思想

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

感谢观看,文笔有限,博客不出彩,还请多多见谅
原文地址:https://www.cnblogs.com/jokingremarks/p/14474075.html