JAVA 入坑教程 | 章节一 基础概念

JAVA 章节一 基础概念


学JAVA,首先得知道JAVA是什么,JAVA能做什么事,JAVA有哪些概念和特性,首先我们从JAVA是什么开始入手带大家入坑:

前两篇内容我们提到了,JAVA的一些概念和特性,这篇文章我们来补足剩余的基本概念,当然,每篇文章的概念性东西会根据节奏走,每篇文章不会一次性带入太多的概念。

  • OOP:Object Oriented Programming , 面向对象的程序设计
  • JAVA  三大特性
  • JAVA  其它的基础概念



一、OOP思想

首先我们来回顾下历史,OOP的许多原始思想都来之于Simula语言,并在Smalltalk语言的完善和标准化过程中得到更多的扩展和对以前的思想的重新注解。可以说OO思想和OOPL几乎是同步发展相互促进的。与函数式程序设计(functional-programming)和逻辑式程序设计(logic-programming)所代表的接近于机器的实际计算模型所不同的是,OOP几乎没有引入精确的数学描叙,而是倾向于建立一个对象模型,它能够近似的反映应用领域内的实体之间的关系,其本质是更接近于一种人类认知事物所采用的哲学观的计算模型。由此,导致了一个自然的话题,那就是OOP到底是什么?[D&T 1988][B.S 1991] .。在OOP中,对象作为计算主体,拥有自己的名称,状态以及接受外界消息的接口。在对象模型中,产生新对象,旧对象销毁,发送消息,响应消息就构成OOP计算模型的根本。 
对象的产生有两种基本方式:
一种是以原型(prototype)对象为基础产生新的对象。一种是以类(class)为基础产生新对象。原型的概念已经在认知心理学中被用来解释概念学习的递增特性,原型模型本身就是企图通过提供一个有代表性的对象为基础来产生各种新的对象,并由此继续产生更符合实际应用的对象。而原型-委托也是OOP中的对象抽象,代码共享机制中的一种。一个类提供了一个或者多个对象的通用性描叙。从形式化的观点看,类与类型有关,因此一个类相当于是从该类中产生的实例的集合。而这样的观点也会带来一些矛盾,比较典型的就是在继承体系下,子集(子类)对象和父集(父类)对象之间的行为相融性可能很难达到,这也就是OOP中常被引用的---子类型(subtype)不等于子类(subclass) [Budd 2002]。而在一种所有皆对象的世界观背景下,在类模型基础上还诞生出了一种拥有元类(metaclass)的新对象模型。即类本身也是一种其他类的对象。以上三种根本不同的观点各自定义了三种基于类(class-based),基于原型(prototype-based)和基于元类(metaclass-based)的对象模型。而这三种对象模型也就导致了许多不同的程序设计语言(如果我们暂时把静态与动态的差别放在一边)。是的,我们经常接触的C++,Java都是使用基于类的对象模型,但除此之外还有很多我们所没有接触的OOPL采用了完全不一样的对象模型,他们是在用另外一种观点诠释OOP的内涵。 
什么是oop的基本思想呢?
把组件的实现和接口分开,并且让组件具有多态性。不过,两者还是有根本的不同。oop强调在程序构造中语言要素的语法。你必须得继承,使用类,使用对象,对象传递消息。gp不关心你继承或是不继承,它的开端是分析产品的分类,有些什么种类,他们的行为如何。就是说,两件东西相等意味着什么?怎样正确地定义相等操作?不单单是相等操作那么简单,你往深处分析就会发现“相等”这个一般观念意味着两个对象部分,或者至少基本部分是相等的,据此我们就可以有一个通用的相等操作。再说对象的种类。假设存在一个顺序序列和一组对于顺序序列的操作。那么这些操作的语义是什么?从复杂度权衡的角度看,我们应该向用户提供什么样的顺序序列?该种序列上存在那些操作?那种排序是我们需要的?只有对这些组件的概念型分类搞清楚了,我们才能提到实现的问题:使用模板、继承还是宏?使用什么语言和技术?gp的基本观点是把抽象的软件组件和它们的行为用标准的分类学分类,出发点就是要建造真实的、高效的和不取决于语言的算法和数据结构。当然最终的载体还是语言,没有语言没法编程。stl 使用c++,你也可以用ada来实现,用其他的语言来实现也行,结果会有所不同,但基本的东西是一样的。到处都要用到二分查找和排序,而这就是人们正在做的。对于容器的语义,不同的语言会带来轻微的不同。但是基本的区别很清楚是gp所依存的语义,以及语义分解。例如,我们决定需要一个组件swap,然后指出这个组件在不同的语言中如果工作。显然重点是语义以及语义分类。而oop所强调的(我认为是过分强调的)是清楚的定义类之间的层次关系。oop告诉了你如何建立层次关系,却没有告诉你这些关系的实质。 
(这段不太好理解,有一些术语可能要过一段时间才会有合适的中文翻译——译者) 
面向对象的编程方法OOP是九十年代才流行的一种软件编程方法。它强调对象的“抽象”、“封装”、“继承”、“多态”。我们讲程序设计是由“数据结构”+“算法”组成的。从宏观的角度讲,OOP下的对象是以编程为中心的,是面向程序的对象。



二、JAVA 三大特性(图)

JAVA 入坑教程 | 章节一 基础概念_第1张图片

上面是三大特性的概念与对比图,我们来分析一下:

Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。

OO:面向对象设计是把重点放在对象及对象的接口上的一个编程技术。

1.抽象: 
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。

抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。

抽象包括两个方面,一是过程抽象,二是数据抽象。 

2.继承: 

继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。

对象的一个新类可以从现有的类中派生,这个过程称为类继承。

新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。

派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 

3.封装: 

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。

面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 

4. 多态性: 

  多态性是指允许不同类的对象对同一消息作出响应。

多态性包括参数化多态性和包含多态性。

多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 

总结:动态绑定里有一个非常重要的特性:就是无需对现存的代码进行修改,就可以对程序进行扩展。所以要记住,多态是开放封闭原则的基础。 



三、JAVA 其它的基础概念

  • String 和StringBuffer的区别 

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。    

  • int 和 Integer 有什么区别 
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 
原始类型 -->> 封装类 
boolean -->> Boolean 
char -->> Character 
byte -->> Byte 
short -->> Short 
int -->> Integer 
long -->> Long 
float -->> Float 
double -->> Double 

引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 


  • String是最基本的数据类型吗

基本数据类型包括byte、int、char、long、float、double、boolean和short。 

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 


  • final类:为防止他人从你的类上派生新类,此类是不可扩展的。

  • Java中的每一个类都是从Object类扩展而来的。 

  • 抽象类:规定一个或多个抽象方法的类本身必须定义为abstract。例: public abstract string getDescripition

  • 重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载.编译器必须挑选出调用哪个方法

  • 继承:通过扩展一个类来获得一个新类叫继承(inheritance),而所有的类都是由Object根超类扩展而得,根超类下文会做介绍。

  • JAVA 对象的3个主要特性 

1.ehavior---说明这个对象能做什么。

2.tate---当对象施加方法时对象的反映。 

3.dentity---与其他相似行为对象的区分标志。

每个对象有唯一的indentity 而这3者之间相互影响。


  • JAVA 类之间的关系:

use-a :依赖关系

has-a :聚合关系

is-a :继承关系--例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法.(个性存在于共性中)


  • 构造对象使用构造器:构造器的提出,构造器是一种特殊的方法,构造对象并对其初始化。

例:Data类的构造器叫Data

New Data()---构造一个新对象,且初始化当前时间。

Data dujinyang=new Data()---把一个对象赋值给一个变量dujinyang,从而使该对象能够多次使用,此处要声明的使变量与对象变量二者是不同的

.new 返回的值是一个引用。

构造器特点:

      1. 构造器可以有0个,一个或多个参数
      2. 构造器和类有相同的名字
      3. 一个类可以有多个构造器
      4. 构造器没有返回值
      5. 构造器总是和new运算符一起使用


  • 接口(Interface)说明类该做什么而不指定如何去做,一个类可以实现一个或多个interface

  • 接口不是一个类,而是对符合接口要求的类的一套规范。

若实现一个接口需要2个步骤:

1)声明类需要实现的指定接口。

2)提供接口中的所有方法的定义。

---- 声明一个类实现一个接口需要使用implements 关键字,接口不是类,不能用new实例化一个接口。


  • 什么是超类(基类)?什么是派生类?

一个类只有一个超类(基类),但一个类能实现多个接口。(记:Java中的一个重要接口:Cloneable.)

什么是基类?其实就是父类,继承里的两个类,一个子类一个父类,基类等于父类,派生类等于子类。

基类、超类、父类都是一个意思,不同说法而已。 

比如: 

class BaBa{} 

class A extends BaBa{} 

这就可以说BaBa是A的基类,BaBa是A的超类,BaBa是A的父类;反过来,A就是BaBa的子类,或者叫派生类。



  • 内部类:一个内部类的定义是定义在另一个内部的类。

原因是:

1)一个内部类的对象能够访问创建它的对象的实现,包括私有数据。

2)对于同一个包中的其他类来说,内部类能够隐藏起来。

3)匿名内部类可以很方便的定义回调。

4)使用内部类可以非常方便的编写事件驱动程序。




你可能感兴趣的