日记 - Think in java 之 对象导论 一

【以下为个人日记】

类(class) - 抽象数据类型

某一类型的变量 - 对象 - 被实例化了的类

操作变量 - 调用对象请求 - 发送对象消息


四个访问指定词:

public:  表示任何人都可调用,开放个调用者
private:  表示除类型创建者和内部方法外,任何人不能访问
protected:  表示除子类和类型的内部方法外,任何人不能访问
默认:  仅同一个包内的成员可以访问,对包外成员表示private


JAVA的五个基本特性:

一、万物皆为对象:  将对象当做奇特的变量,它可存储数据。主要由成员变量和方法组成。将需要解决的任何概念表示为程序中的对象。

二、程序是对象的集合,他们通过发送消息来告诉彼此要做的:  要请求一个对象,就必须对该对象,发送一条调用请求(消息)。
例如:new Gun().Shooting();这句话可以理解成“给我一把枪,然后我用这把枪开枪射击”,看似是我调用了Gun的shooting方法然后达到了射击的目的,但是做出射击这件事的是Gun这个对象,我的调用就好似给Gun这个对象一个射击的命令(消息)。

三、对象内部可以有其他兑现构成的存储:  可由此构建复杂的体系,同时将其复杂性隐藏在简单性的背后。

四、每个对象都拥有其他类型:  每个对象都是某个类的一个实例(我们常说的“new一个对象出来”==“把这个类实例化”)。每个类的最重要区别于其他类的特性就是“可以发送什么样的消息给它”。

五、某一特定类型的所有对象都可以接收同样的消息:  换句话说就是“某一特定类型发出的消息可以被某一特定类型的所有对象接收”。可简单的理解成多态。

每个对象在内存中都有唯一的地址。


每个对象都有一个接口:  (帮助理解接口的作用)接口确定了对某一特定对象所能发出的请求。  在类型中,每一个可能的请求都有一个方法与之相关联,当向对象发送请求时,与之关联的方法就会被调用。举例来说,有许多种灯,他们各不相同,但是都有一个开关来亮灯和灭灯,我们不需要知道开关下的电路是如何实现的,我们只要请求开关灯就好了。而接口就等于是确定了对灯的操作只有“开”和“关”两个方法。


每个对象都提供服务:  将对象想象成“服务提供者”。(编程设计思路)在良好的的面向对象设计中,每个对象都可以很好的完成一项任务,但是它并不试图做更多事。


被隐藏的具体实现:  开发过程中其实可以分为“类创建者”和“客户端程序员”。 “客户端程序员”负责收集各种用来实现快速应用开发的类。“类创建者”的目标是构建类,这种类只向“客户端程序员”暴露必须的部分,隐藏的部分代表这些类脆弱的部分,也是最容易被粗心的或者不知情的“客户端程序员”所毁坏的部分。  因此将某些实现隐藏起来有助于减少程序BUG,用于保护程序本身。
{
public:表示紧随其后的元素对任何人都是可用的
private:表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素
protected:与private类似,区别在于继承的类可以访问protected成员,但不能访问private
           成员
默认访问权限:没有使用任何访问指定词时,它将发挥作用。这种权限通常被称作包访问权
              限,因为包外的类无法访问
}


复用具体实现:  这是一个我们一直都在用以至于被忽略的特性。我们可以通过已有的对象来组合出新的类。这样的自由组合也就是复用的体现了。



依赖:   这一段是我的额外理解。复用,以及接下来的继承与接口都跟依赖有关。A类的实现需要调用B对象,那么我们就说A依赖于B,B是A的依赖对象。假设你有十多个类的实现都调用了一个C类,那么当C类进行某些改动甚至删除的时候,也就意味着依赖C的十多个类都需要改动,伤不起啊。
当你的程序变得庞大后你要好好的管理程序内部的依赖关系,如情非得已,不要去修改你的依赖对象,只要修改你当前类的实现方式就好,甚至可以创建一个新的类来实现功能。


继承:   给大家看一段我学习时写的死循环

public class A {
public A(){
new B();
System.out.println("我是A,我调用B");
}

        public void kick(){
        }
}

public class B extends A{
public B(){
System.out.println("我是B,先调用我");
}

        public void hit(){
        }

public static void main(String[]args){
new B();
}
}
上述代码是一个A类和一个B类,它会造成一个运行时的错误 "Exception in thread "main" java.lang.StackOverflowError",一个死循环。要理解这个死循环的产生,需要两个知识点,一个是构造函数,一个就是继承。

当B类继承A类时,B类内部就会获得隐藏的A类的所有方法,可以这样理解“A是几何图形,B是三角形,‘三角形也是几何图形’”。

而且当调用B的构造函数时,A的构造函数也会被调用,也就是说创建了对象A和对象B。

以A和B类为例,B类可以调用A类的kick方法,A类无法调用B类的hit方法。如果在B类里也加入同名的kick方法,就会“覆盖”A类的kick方法。“覆盖”的结果就是,当你使用B.kick();时,调用不到A的kick方法了

被继承类为父类,继承类为子类。以A和B类为例,A是父类,B是子类。A又可称基类,B可称导出类。你可以用父类类型来引用子类对象,也就是:“A a = new B();”,不可反过来使用,这个被称为多态,是java中十分重要的一种机制。
当你用a变量引用B类的时候,这引用本身被称为“向上转型”。你无法用a调用B的任何方法,因为a变量是一个A类型,你要把a变量当成A类来使用,哪怕a引用的是一个B类型。如果B类里也有kick方法,“a.kick();”会调用B类的kick方法,因为a变量实际上是引用了B对象。

Think in java(第四版)十分详细的讲解了多态,以及传统意义上的函数调用“前期绑定”,以及泛化对象

单根继承结构:在Java中所有的类最终都继承自单一的基类。

多态: 假设多边形是一个对象,那么三角形、正方形、五角星等都属于多边形这个对象的衍生类。而多边形本身没有特定形状,它本身只是一个抽象概念,但多边形会有棱角等特性是其所有衍生类所共有的。

    动态绑定:将一条消息发给对象时,如果并不知道对方的具体类型是什么,但采取的行动同样是正确的,这种情况就叫作“多形性”。对面向对象的程序设计语言来说,它们用以实现多形性的方法叫作“动态绑定”。编译器在系统运行时会负责所有细节控制。

    抽象类和接口:抽象类对象无法被创建,抽象类中的抽象方法只能被继承它的类去实现(继承一个抽象类后必须实现其抽象方法,除非继承抽象类的子类也是一个抽象类),通过创建一个抽象方法,我们可以将一个方法置入接口中,不必再为那个方法提供可能毫无意义的主体代码。

猜你喜欢

转载自lcl088005.iteye.com/blog/2004587