自我参考-Java基础

来源:互联网 发布:淘宝开内衣店店铺简介 编辑:程序博客网 时间:2024/05/20 16:43

Java开发前奏、基础

一、Java 程序的运行机制和JVM

  1、Java语言比较特殊, 由Java编写的程序需要经过编译步骤,但这个编译步骤不会产生特定平台的机器码,而是生成一种与平台无关的字节码(也就是.class文件)。这种字节码不是可执行性的,必须使用Java解释器来解释执行。因此可以认为: Java是编译型和解释型语言的结合体。或者说,Java语言既不是纯粹的编译型语言,也不是纯粹的解释型语言。

  ★ Java程序的执行过程,必须经过先编译,后解释两个步骤。

1、首先采用通用的java编译器将java源程序编译成为与平台无关的字节码文件(class文件);2、然后由java虚拟机(JVM)对字节码文件解释执行。

  注意:java字节码具有平台无关性、可以在各种不同系统平台中运行,但是需要有不同版本的java虚拟机,不同系统平台的java运行环境其java虚拟机是不一样的。

  2、Java语言里,负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。JVM是可以运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高运行效率。

  3、当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体的平台。 只面向JVM。不同平台上的JVM都是不同的,但他们都提供了相同的接口。JVM是Java程序跨平台的关键部分。只要为不同的平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。显然,相同的字节码程序需要在不同的平台上运行,这几乎是“不可能的”, 只有通过中间的转换器才可以实现,JVM就是这转换器。

  4、JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。
Oracle公司制定的Java虚拟机规范在技术上规定了JVM的统一标准,具体定义了如下细节:

 指令集、寄存器、类文件的格式、栈、垃圾回收堆、存储区。

  Oracle公司制定的这些规范的目的是为了提供统一的标准,最终实现了Java程序的平台无关性。

二、垃圾回收机制

  在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是”无用信息”,这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。
  垃圾回收能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾回收机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用Java语言编程的时候,靠垃圾回收机制可大大缩短时间。其次是它保护程序的完整性, 垃圾回收是Java语言安全性策略的一个重要部份。

三、结构化程序设计
  结构化程序设计(structured programming)是进行以模块功能和处理过程设计为主的详细设计的基本原则。结构化程序设计是过程式程序设计的一个子集,它对写入的程序使用逻辑结构,使得理解和修改更有效更容易。
  基本思想:任何程序都可以用三种基本结构表示,限制使用无条件转移语句(goto)
  结构化程序:由三种基本结构反复嵌套构成的程序叫 结构化程序。
  优点:结构清晰,易读,提高程序设计质量和效率。

四、程序的三种基本结构
1、顺序结构
2、选择结构

  • 二分支选择结构
    二分支选择结构

  • 多分支选择结构
    多分支选择结构

3、循环结构

  • 当型循环结构
    这里写图片描述
  • 直到型循环结构
    这里写图片描述

五、面向对象程序设计简介
  面向对象程序设计(Object Oriented Programming,OOP)是目前最流行的一种计算机编程架构。
  OOP达到了软件工程的三个主要目标:重用性、灵活性和扩张性。为了实现整体运算,每个对象都能够接收信息。处理数据和向其他对象发送信息。
  系统分析和系统设计也越来越多地采用面向对象方法

OOA 面向对象的分析方法
OOD 面向对象的设计方法
OOP 面向对象的程序设计方法

六、面向对象编程有4个基本特征:
  抽象。抽象就是将一些事物的共性和相似点抽离出来,并将这些属性归为一个类,这个类只考虑这些事物的共性和相似之处,并且会忽略与当前业务和目标无关的那些方面,只将注意力集中在与当前目标有关的方面。
  封装。封装是为了隐藏内部实现细节,是保证软件部件具有优良的模块性的基础。封装的目标就是要实现软件部件“高内聚,低耦合”,防止程序之间的相互依赖性带来的变动影响。
  继承。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法(Override,重写方法)使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
  多态。多态是运行时刻接口匹配的对象相互替换的能力。指程序定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译期并不确定,而是在程序运行期间才确定(称之为动态绑定),即一个引用变量指向的是哪个类的实例对象,在编译期间并不确定,在运行阶段才能决定,因此,这样就可以使得引用变量绑定到各种不同的类实现上,从而实现不同的行为。多态性增强了软件的灵活性和扩展性。

七、Java 的面向对象特征

1、封装(encapsulation)

  • 概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

  • 好处:将变化隔离。便于使用。提高重用性。提高安全性。

  • 封装原则:将不需要对外提供的内容都隐藏起来;把属性都隐藏,提供公共方法对其访问。

2、继承(inheritance)

  • 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。

  • 新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

  • 子类可以直接访问父类中的非私有的属性和行为。

通过 extends 关键字让类与类之间产生继承关系。如下:

class SubDemo extends Demo{} 

继承提高了代码的复用性。

继承的出现让类与类之间产生了关系,提供了多态的前提

继承的特点:

Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。

class SubDemo extends Demo{} //这是对的class SubDemo extends Demo1,Demo2...//这是错的Java支持多层继承(继承体系)        class A{}class B extends A{}class C extends B{}

定义继承需要注意:
  不要仅为了获取其他类中某个功能而去继承
  类与类之间要有所属关系,xx1是xx2的一种。  
  
   补充:

  1. super和this的用法相同:this代表本类应用;super代表父类引用 。当子父类出现同名成员时,可以用super进行区分,子类要调用父类构造函数时,可以使用super语句。
  2. 在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。
      
    注意:

    • 子类中所有的构造函数默认都会访问父类中空参数的构造函数,因为每一个构造函数的第一行都有一条默认的语句super();子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。

    • 当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。

    • 覆盖时,子类方法权限一定要大于等于父类方法权限;静态只能覆盖静态。
      父类中的私有方法不可以被覆盖。

    • 被final修饰的类是一个最终类,不可以被继承。 被final修饰的方法是一个最终方法,不可以被覆盖。
      被final修饰的变量是一个常量,只能赋值一次内部类只能访问被final修饰的局部变量。

    • 继承与重载:一是子类与父类的关系,二是重载方法的调用问题。

3、多态(polymorphism)
   方法的重写、重载与动态连接构成多态性。Java只允许单继承,这样做虽然保证了继承关系的简单明了,但是功能上有很大的限制,所以,Java引入了多态性的概念。此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。

多态性:发送消息给某个对象,让该对象自行决定响应何种行为。 

  通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
  java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

  • 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。

  • 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

原创粉丝点击