Java放弃之旅(一)-Thinking in Java

    技术2023-09-01  95

    Java Road

    Part1

    Java的设计思想(OOP面向对象编程)百度一下

    1.OOP特性

    万物皆为对象程序是对象的集合,他们通过发送消息来告诉彼此要想做的每个对象都有自己的有其他对象构成的存储每个对象都有其类型(每个对象都是某个类的一个实例instance)某一特定类型ed所有对象都能接受同样的消息

    2.接口与对象 通常在描述类时使用UML(Unified Modelling Language)图来进行表示,上部代表了类名,中部可以是数据成员,底部通常为方法(一般只写公共的方法) 接口确定对某一对象所能发出的请求,你需要做的事情就是:

    创建Light类定义这个对象的引用向对象发送消息 Light It=new Light(); It.on();

    3.设计中的边缘控制(针对于客户端程序员与类库创建者)

    让客户端程序员无法触及他们不应该触及的地方让类库程序员可以改变类内部的工作方式而不影响到客户端程序员

    边界设定的标识符: (1)protect:类型额创建者和类型内部创建的方法以及继承的类可以访问 (2)private:类型额创建者和类型内部创建的方法之外的不能访问 (3)public:对任何人可用 (4)默认访问权限:当不使用前面三种标识符时,即可发挥作用。该权限被称为 包访问权限,可以访问在一个包中的其它类成员,但是在包之外,如同private一样,不可被访问 4.伴随多态的可互换对象

    泛化操作编译器不能产生传统意义上的函数调用。在非面向对象程序设计中,函数的调用会产生前期绑定,即产生一个对具体函数的调用,运行时将调用解析到要被执行的代码的绝对地址。由此,在OOP中,直到运行时才知道代码的地址。OOP中采用的是后期绑定,为了达到后期绑定,Java中引入一段代码来取代绝对地址的调用,这段代码是用储存在对象中的信息来确定方法体的地址。C++若要使用后期绑定的灵活性需要用到virtual关键字;而在Java中,动态绑定是默认,可直接使用多态。 void dosomething(Shape shape){ shape.erase(); //... shape.draw(); //... } Circle circle=new Circle(); Triangle trianle=new Triangle(); Line line new Line(); dosomthing(circle); dosomthing(triangle); dosomthing(line); dosomething()可以传达给Shape任何消息,它的子类也能接受到,这是因为向上转型(upcasting)

    5.单根继承结构 Java中所有的类都继承自Object这个终极基类,因此,Java可以方便的实现垃圾回收机制:所有的对象都保证其有类型信息,不会因此陷入僵局。 6.可以引用多个对象的对象类型-容器 一、不同容器提供了不同的接口与外部行为; 二、不同容器对于某些操作具有不同的效率; 7.参数化类型 可以储存Object类型的容器可以储存任何东西。要使用这类容器,要在其中置入对象的引用。由于Java中采用的单根继承,在置入这些对象的引用时,这些对象丢失其身份,都将转化为Object对象的引用。当取回时,就是取回这些Object对象的引用。 如果要将Object引用转化为原先的身份,需要使用到向下转型,向上转型是安全的,向下转型是不安全的

    向下转型并不是彻底危险的,如若向下转型为错误类型,会有异常提醒为了解决向下转型的问题,使用参数化类型机制,它是一个编译器可以自动定制作用于特定类型上的类向下转型和运行时的检查需要耗费额外的时间表示方法为一对尖括号,括号中是类型信息 ArrayList<Shape> shapes=new ArrayList<Shape>();

    8.控制对象的生命周期

    C++采用效率控制,给予程序员选择的权利:对象的存储空间和生命周期在编写程序时确定,将对象置于堆栈(自动变量区或限域变量)、静态存储区域在堆(heap)的内存池中动态的创建对象。Java完全采用了动态内存分配方式,在创建新对象的动态实例时,需要用到new关键字。采用堆时,不知道对象的生命周期,使用C++语言时可能会产生内存泄漏,Java提供了”垃圾回收器”机制,知道对象何时不会被使用,并自动释放对象所占用的内存。

    (哦,我亲爱的秃头兄弟,今天你有好好使用洗发水了么)

    Processed: 0.014, SQL: 9