zoukankan      html  css  js  c++  java
  • 【读书笔记】Java面向对象编程

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    初步:

    1.传统的面向过程的结构化开发方法 Vs 以对象为最小系统的面向对象的开发方法
    2.对象模型:
    1)自底向上的抽象:抽象三层次
    把问题领域中的事物抽象为具有特定属性和行为的对象。
    把具有相同属性和行为的对象抽象为类
    若多个类之间存在一些共性(具有相同的属性和行为),把这些共性抽象到父类中。
    注意在Java中抽象有两种意思:
    a.作为动词,指的是上述思维过程。
    b.作为形容词,可以用来abstract修饰类和方法。abstract修饰方法时表明这个方法没有具体的实现,仅仅描述类具有的功能。abstract修饰类时表明表明这个类不能被实例化
    2)自顶向下的分解:
    一个计算机系统->主机、显示器、键盘、鼠标
                      |
                    分为处理器、内存
    面向对象亦支持自顶向下。
    3.面向对象的相关理念
    1)万物皆为对象。
    2)每个对象都是唯一的,世界上没有完全相同的两片树叶,在JVM中,保证对象的唯一性是在内存中分配唯一的地址。
    3)对象具有属性和行为。
    4)对象具有状态,也就是说某个瞬间对象的各个属性都有取值。
    5)对象都属于某一个类,类是具有相同属性和行为的对象的集合。同一类的所有实例具有相同的属性,但其取值不一定相同,类的所有实例具有相同行为,父类和子类之间的实力则可能采用不同的方式来实现相同的功能。建立对象时,JVM将类载入内存,然后以其为模板进行对象的构建。
    6)每个对象都具有特定的功能,相对于其他对象而言,它的功能就是为其他对象提供服务。而服务的提供则是通过方法实现的。
    7)接口是一个抽象的概念,指系统对外提供的所有服务,描述了系统能提供哪些服务,但是不包含服务的实现细节。利用接口提高了子系统之间松耦合性。某个子系统内部的实现发生了改变,但是只要接口不变,就不会影响到主机子系统。在Java中,接口有两个意思:a.对象中表现为public类型的方法,在外可以被调用。b.用interface关键字定义的实实在在的接口,它用于明确地描述系统对外提供的所有服务。
    8)面向对象编程对于封装的实现主要是通过访问控制机制来进行封装的,这种机制能控制对象的属性和方法的访问权限。封装的原则:a.把尽可能多的东西藏起来,对外提供简捷的接口。b.把所有属性藏起来,必要的设置和读取用getter和setter
    9)继承中,父类用Private修饰的属性和方法对子类的透明。
    10)多态是指当系统A访问系统B的服务时,系统B可以通过多种实现方式来提供服务,而A全然不知。
    11)动态绑定是指JVM在运行时根据引用对象的不同绑定方法实现多态。

    UML建模语言初步

    1.UML采用一些标准图形元素来直观的表示对象模型,是一种可视化的面向对象的建模语言。
    2.框图初步:
    用例图、类框图、组件图和部署图4个图形构成了系统的静态模型,而状态转换图,时序图和协作图则构成了系统的动态模型。因此,UML的主要框图也可以归纳为静态模型和动态模型两大类。
    a.用例图
    描述了系统提供的功能,帮助团队明确系统的动能需求。包含内容:
    角色:使用系统特定功能的用户。用人形符号表示。角色与用例是使用的关系。
    用例:表示某个功能。用椭圆符号表示。用例之间是包含和扩展的关系。用例的细节和处理流程以文档的形式来描述,具体内容见书P25。
    b.类框图
    显示了系统的静止结构,包括类(矩形表示,上层为类名,中层为属性,下层为行为方法,抽象类和方法都用斜体表示)和类之间的关系。
    c.时序图
    显示用例的详细流程,有两个维度:
    水平维度:显示对象之间发送消息的过程。
    垂直维度:显示发送消息的时间顺序。
    d.协作图
    与时序图包含的信息相同。两者的区别是协作图不参照时间,直接显示对象与角色之间的交换过程。
    e.状态转换图
    对于状态转换比较复杂的对象,才有必要用此来描述。状态转换图的基本元素有初始点、状态之间的转移,状态、终止点。
    f.组件图
    显示系统中组建之间的依赖关系,以及和其他第三方组建(例如类库)的依赖关系,还可以显示源代码文件的物理组织结构。这里的组件也就是指软件系统中的每个子系统。
    g.部署图
    表示软件系统如何部署到硬件环境中,能够展示系统中的组件在硬件环境中的物理布局。
    3.类之间的关系:
    a.关联:类之间的特定对应关系。一般的,类A中有定义类型为类B的属性。
    b.依赖:类之间的调用关系。类A要访问类B的属性和方法,或类A负责实例化B,则称类A依赖于B.
    c.聚集:整体和部分的关系。分为普通聚集关系(比如台灯和灯泡之间可以将灯泡卸下)和强聚集关系(集成声卡和主板间的关系,无法拆卸),前者带有set方法,而后者则无set方法。与关联的区别在于整体对象会制约它的组成对象的生命周期。
    d.泛化:类之间的集成关系。
    e.实现:类实现接口的关系。
    4.使用UML简介
    得出UML框图后可以从被依赖的组件开始编程,注意使用一些设计模式。

    语言初步

    1.每个源文件中包含内容:
    零个或一个包声明、零个或多个包引入、零个或多个类声明、零个或多个接口声明。至多只有一个类或者接口是public的,而且源文件必须以其中public类型的类的名字命名。
    1)包声明语句:
    用于把该源文件中的类和接口放在特定的包中,一个源文件中只能有一个package语句,也可以省略表示为在默认包,该包没有名字。这就意味着在该源文件中定义的包和接口都在同一个包中。package语句必须放在源文件第一行。例如:package com.abc.dollapp
    包的作用:
    a.区分名字相同的类。b.实施访问控制。c.划分和组织Java应用中的各种类。
    包的命名规范:
    a.一般采用小写。
    b.包含创建者、所属项目名称、处于项目所处的哪些位置等信息。
    c.一般采用URL命名规范的反转,例如,类名com.abc.netstore.common,SysContent,这意味着SysContent类由abc公司开发,属于netstore项目,位于netstore.common中。
    d.Java不强制要求包名。
    2)包引入语句:
    使用其他包中的类和接口。注意import语句不会意味着JVM会把所有的类和接口加载到内存中并对它们初始化。
    注意:若同时引用了两个来自不同包的同名类,那么必须通过完成类名来区分。
    3)方法声明:
    返回值类型 方法名 (参数列表){
        方法主体
    }
    4)main()方法:
    public static void main (String[] args),其实public和static的位置可以调换,由于用static修饰的方法默认都是final(不能被子类覆盖),所以加上final也没事。
    类中可以通过重载的方法提供多个不作为的应用程序入口的main方法。
    5)注释:
    注意/** ... */出现在任何声明之前都会被视为JavaDoc。
    6)关键字:
    注意friendly和sizeof不是Java关键字,这与c++不一样。
    7)标识符:
    a.首字母必须是字母、下划线、美元符号、人民币符号。其中不能包含-、#等字符。
    b.没有长度限制,但是大小写敏感。
    c.官方的命名规范有
      类名和接口名:首字母大写,若多个单词拼成则每个单词首字母大写。
      方法和变量名:首字母小写,若多个单词拼成则除第一个单词外的其他单词首字母大写。
      包名:小写。注意源文件的位置,比如若使用默认包,则Doll.java在根目录下,若类名为com.abc.dollapp.doll.Doll,则源文件Doll.java要在/com/abc/dollapp/doll目录下。
      常量名:大写形式,多个单词用下划线隔开。
    2.编译Java源文件
    javac [options] [sourcefiles]
    常用选项:
    -classpath 路径  ——覆盖classpath环境变量,是指定class类的路径
    -sourcepath 路径 ——指定Java源文件的路径,指定类的源文件的路径
    -d 目录 ——指定目录
    -verbose ——输出详细编译器信息
    3.运行Java程序
    java someClass
    常用选项:
    -classpath 路径  ——覆盖classpath环境变量,是指定class类的路径,对于Java类则设定根目录
    -verbose ——输出详细编译器信息
    -D<属性名=属性值> ——设置系统属性,例如:java -DUser="tom" SomeClass,则SomeClass中调用的System.getProperty("user")则得到tom
    -jar 指定运行某个Jar文件中的特定Java类,对于Jar包指定全路径
    使用注意:
    a.必须指定主程序类的完整名字,例如,
    b.在classpath中,类文件的存放位置必须和包名匹配。
    4.JavaDoc的使用
    JavaDoc有一系列的标志
    javadoc 标记有如下一些:
    标记             用于                 作用
    @author     对类的说明         标明开发该类模块的作者
    @since        对类、属性、方法的说明    指定最早出现的版本
    @version     对类的说明         标明该类模块的版本
    @see             对类、属性、方法的说明     参考转向,也就是相关主题,用于产生链接
    @link        对类、属性、方法的说明    与@see一样,但是其能嵌入到注释语句中
    @param         对方法的说明         对方法中某参数的说明
    @return     对方法的说明         对方法返回值的说明
    @exception     对方法的说明         对方法可能抛出的异常进行说明
    @deprecated    对类、属性、方法的说明    表示已经不推荐使用
    5.JVM简介
    运行程序的步骤:
    1)把.class文件中的二进制数据加载到内存中。
    2)对类的二进制数据进行验证
    3)解析并执行指令
    运行时数据区:
    堆区——存放对象的一个指向方法区的引用
    方法区——存放类的类型信息、类型信息包括静态变量和方法信息,而方法信息中包含类的所有方法的字节码。
    栈区——局部变量(指向堆区),主方法的调用
    例如:Doll beibei = new Doll("贝贝");
    其中beibei在栈区,指向一个名字为“贝贝”的Doll实例(在堆区),而Doll实例含有的方法则指向方法区。


    操作符简介

    1.注意"=" "==" "!="还能操作各种引用类型。而"+"除了可以操作包含Boolean类型以外的基本数据类型外,还可以操作string类型。
    2.多数操作符都是从左到右运算的,但是赋值操作是从右到左。
    3.整型操作符在计算表达式时,若一个操作元是long,那么结果也是long,否则不管操作元是byte还是short、char,运算结果都是int。
    4.算术右移位操作符>>
    符号位是0的左端就补零(正数),否则补一。a>>b等价于(a/2)^(b%32).
    5.逻辑右移位操作符>>>
    左端都是加0.
    6.左移操作符<<
    右端加0.
    7.短路操作符
    &&和||都是短路操作符,而&和|是非短路操作符。也就是说前者只需能根据操作符左边的表达式推出整个表达式的布尔值,而后者只能全部计算出来。
    8.!为一元操作符,只能用于Boolean表达式。
    9.使用+时,若一个操作元是string,而另一个操作元是引用类型,则调用引用对象的toString()方法获得字符串。
    10.两边都是引用类型时,==只在两个引用类型引用的是同一个对象时结果为True。只有具有同种类型或有继承关系时才可以比较,否则编译出错。
    11.instanceof操作符
    obj instanceof ClassName/Interface,当左边为右边的类、直接或间接父类、直接或间接实现的接口时返回为TRUE。
    两边的操作元必须是同种类或有继承关系的。数组类型也可以使用instanceof进行比较。
    12.类型强制转换
    从低位类型到高位类型会进行自动转换,而从高位类型到低位类型需要进行强制类型的转换。从double、float、long、int类型一直检测,若最终没有转换为上述任何一种数据类型,则统一转化为int。例如:
    short a=1,b=1;
    short c = a + b;//出错,此时a+b的结果已经转化为了int,可以将c变为int,或强制转化为short。
    又如:
    int x=6;
    double d=7.1;
    System.out.println((x>d)?99.9:9);//输出9.0,因为9已经被转化为了double。
    直接数在变量所属类型的取值范围之内,就允许自动转换,但是对于变量给变量赋值则需要在适时的时候强制转换类型。
    引用类型的变量之间赋值时,子类给直接或间接父类赋值,会自动进行类型转换,父类给直接或间接子类赋值,需要强行转换类型。

    流程控制

    1.switch(expr)语句中,expr的类型必须是与int类型兼容的基本类型,即包括byte、short、char、int。而case valueN中valueN也是这个要求,并且valueN必须为各不相同的常量。
    2.Java中的循环支持标号,例如:
    outer:
      for (;;)
      {
      inner:
       for (;;)
       {
       xxxx;
       xxxxx;
        continue  inner;
      }
       break  outer;
    }

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

  • 相关阅读:
    edgedb 内部pg 数据存储的探索 (四) 源码编译
    edgedb 内部pg 数据存储的探索 (二) 创建数据库命令说明
    edgedb 内部pg 数据存储的探索 (三) 源码包setup.py 文件
    python 集成cython && push 测试pip 仓库
    python 集成cython 简单测试
    click python cli 开发包
    转载一篇阿里云Terraform 开发指南
    zabbix 4.2 支持 timescledb 了
    edgedb 内部pg 数据存储的探索 (一)基本环境搭建
    Podman and Buildah for Docker users
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2822361.html
Copyright © 2011-2022 走看看