java语法基础

Java程序一般有两种。一种是application,他是运行在Java虚拟机上的程序,另一种是applet运行于支持Java语言的浏览器中。对于application个程序来说,每个项目有且只能有主类(与文件名相同),且在这个主类中有且只有能有一个主方法main方法。这就类似于C/C++的main函数所在的文件,由main函数来调用其他函数。Java中是在主方法中调用其它类。在Javac编译之后就形成了一个class文件,然后再在虚拟机上运行。对于applet,在applet中没有main()方法作为Java解释器的入口,因此必须编写HTML文件,把applet嵌入其中。

Java与C/C++基本语法的异同:

java中的基本类型有三种,数字型、字符型和布尔型。Java中一切都是对象,并且Java中所有对象都是在运行时动态创建的,创建的方法就是用new T。Java中没有全局变量,只有类成员变量和局部变量。Java中的常量用final修饰与const关键字很像。字符串在Java里面很特殊,在Java中包括 null在内的任何类型都能转换成字符串类型,因为在object中有一个ToString()方法,而其他类都继承了object类(万物皆对象)。在Java中数组也是一个对象,数组元素可以是基本类型或者引用类型,数组名也是一个引用。在Java中使用数组对象,1声明数组对象(不分配内存空间),2创建数组对象(分配内存空间,如果没有制定初始值,则为零或null)。Java语言通过垃圾回收机制简化了程序的内存管理。

java中面向对象程序设计的概念:

现实世界中就是由各种对象组成的,,复杂的对象可以由简单的对象组成。在研究对象时主要考虑对象的属性和行为。通常将属性及其行为相同的或相似的对象归为一类(求同存异)。类可以看作是一类对象的抽象,代表此类对象所具有的共同属性和行为。Java是一门面向对象的程序设计,程序的基本组成是类。程序在运行时由类生成对象,对象之间通过发送消息进行通信,进而完成一系列的操作。对象是程序的核心。面向对象程序设计的核心是对象。面向对象中涉及的主要概念有抽象、封装、继承和多态。抽象是对一类具体对象的抽象,得到他们共有的属性和行为,形成类,类就是他们的抽象。封装是有清楚的边界,所有对象的内部信息被限定在这个边界内,接口是对象向外界提供的方法,外界可以通过这些方法与对象进行交互。由于封装的特性禁止了外界对象直接操作类中的数据使得模块与模块之间只能通过严格控制的接口进行交互,这使得模块之间的耦合度大大降低,从而保证了模块具有很好的独立性,使得程序的维护和修改变的十分的容易。继承从某种程度上来说是反抽象或者说是更加具体的一种行为,他为类的重用提供了方便。但是Java只是允许单继承。多态是一个程序中同名的不同方法共存的情况,比如“启动”是所有交通工具的行驶的充要条件,但是不同的交通工具启动的方法也不尽相同。此时,我们可以定义“汽车启动”“轮船启动”,这些名字也都不一样,太麻烦了。而多态就可以帮助我们解决这个问题,只起一个名字“启动”,这样一来通过不同交通工具就都可以相应他们自己“启动”的方法了。Java中的类型其实不仅仅包括数据本身的格式和大小,还包括数据的方法,而类也是一种类型。他应该也能向integer一样进行运算,只不过,类的对象需要自己去定义他的运算(方法)。简单说,类是对一类对象的抽象,是对象的模板,而对象是这个类的具体实例。Java的基本数据类型有自动装箱与拆箱的功能,装箱——转换成integer类,拆箱——装换成基本数据类型。

Java中的类:

Java程序的入口是main方法。类的访问控制只有public共有类和默认类两种。public范围最广,谁都能用;默认类的访问范围控制在所属的包内。类成员的访问控制有public:与类的public一样;private:只能被这个类本身访问,在类外不可见;protected:只能被同一类及其子类的实例对象访问;默认的:在所属的包内各个类都能访问。Java中可以将一个类的声明放在一个文件中,也可以将多个类的声明放在一个文件中(在这种情况下,最多只能有一个类声明为共有类,即说明为public)

类的声明:Public存取控制,abstract/final表示类的类型,extends继承,implements类要实现的接口,用来存储对象的变量称之为引用变量,但是声明一个引用变量并没有 对象生成,此事还需要用new来构造,这时才分配内存空间,并将对象的引用赋值给引用变量。

Java中的数据成员:

数据成员变量可以是Java中的任意类型数据:简单类型、类、接口和数组。修饰符:public/private/protected访问控制符;static静态成员变量,寿命长,属于整个类,但不属于某个具体的对象,静态属性也用来存储经常需要共享的数据,还有在系统中用到的一些常量值也需要声明成静态,如圆周率PI。在构建对象时,具体的对象是不包含静态属性的。在访问时,既可以通过类名.类变量名、实例名.类变量名这两种方式来访问。注意:类方法是不能给访问对象属性的(static修饰,就像main方法不能直接在函数体内访问主类中的普通成员变量,因为他不知道应该返回什么值或者说是哪个对象的值。)final指定变量的值不能被修改;transient指明变量表示的是一个临时常量状态;volatile指明变量是一个共享变量,由多个线程共享的变量可以用volatile修饰,使得各个线程对该变量的访问能保持一致。

Java中的方法成员:

Java中的方法就是函数:public/private/protected访问权限控制符;static指明方法是一个类方法,类方法可以访问类属性,但不能直接访问对象属性;final指明方法是终结方法;abstract指明方法是一个抽象方法;native用来将Java代码与其他语言的代码集成起来;synchronized用来控制多个并发线程对共享数据的访问。方法的参数和返回值类型可以为void、简单数据类型和引用(接口、类和数组)。当方法的参数类型为基本数据类型时为值传递,参数为引用时采用引用传递。

Java的包:

1 编译单元与类空间

一个Java源代码文件称之为一个编译单元。一个编译单元中只能由一个public类,该类名与文件名相同。编译单元中的其他类往往只是public的辅助类。经过编译,每个编译单元的的每个类都会生成一个.class文件。Java的工作程序是一系列的.class文件,Java解释器负责寻找、加载和解释这些文件。由于类成员属于不同的类,所有类成员的名字都是相互隔离,不同类中相同名字的方法不会发生命名冲突。但是如果类名相同,那就有麻烦了。

2 包

包就是用于管理类的名字空间,利用包来划分名字空间,便可以避免类名冲突。一个包中可以包含若干个类文件,还可以包含若干个包。包名就是文件夹名,类名就是文件名。对于一个Java的编译单元来说,通常包括(所属包的声明(省略,则属于默认包);Import(引入)包的声明,用于导入外部类;类和接口的声明。)。为了使用其他包中所提供的类,需要使用import语句引入所需要的类。

Java中对象的初始化与回收还有方法的重载:

Java在生成对象时,会为对象分配内存空间,并自动调用构造函数对实例变量进行初始化,当对象不再使用时,系统会按情况调用垃圾回收程序将其占用的内存回收。

1对象初始化

构造方法是Java进行对象初始化的方法,每个类都有构造方法,用来初始化该类的一个新对象。构造方法名与类名相同,没有返回值类型,没有return语句(三无),如果有返回值则不为构造函数,这三个条件必须同时满足。构造方法就是完成对象的初始化工作,通常被声明为public。用户声明构造方法,系统不会产生默认构造方法,一般需要用户自己在编写一个构造方法;用户没有声明构造方法,系统自动生成一个构造方法,在这里要注意使用super用法,通过调用父类的构造函数来进行初始化。

2垃圾回收

内存泄漏是一个很重要的问题,Java运行时系统通过垃圾收集器周期性的释放无用内存对象所使用的内存来避免内存泄漏所造成的重大问题。当一个对象在程序中不再被使用时,即当前的代码段不属于当前对象的作用域或把对象的引用赋值为空,则该对象就变成了一个无用对象。当系统的内存佣金或程序调用System.gc()要求进行垃圾收集时,垃圾收集线程与系统同步运行,否则垃圾收集器在系统空闲时异步运行。Java中的每一个类都有一个finalize()方法用于释放资源,在对象进行垃圾回收前,Java运行时系统会自动调用对象的finalize()方法来释放系统资源,如关闭文件或socket等。finalize方法在java.lang.Object中声明,但并没有做任何事情。如果一个类需要释放内存以外的资源,则需要在类中重写finalize()方法。

Java异常处理:

通常程序中的错误分为三类,即编译错误——一般为语法错误,运行错误——比如0为除数、数组下标越界,逻辑错误——机器本身无法检测的错误。Java系统根据错误的等级分为错误和异常。错误——致命性的,异常——非致命性的,通过某种修正依然能够运行。Java提供了异常处理机制,在一个方法运行的过程中,如果发生了异常,则这个方法(或者Java虚拟机)便生成了一个代表该异常的对象(包含了异常非常详细的信息),并把它交给运行时系统,运行时系统找相应的代码来处理这一异常(把生成异常对象并提交的过程称为抛出(throw)一个异常);运行时系统在方法的调用堆栈中查找,从生成异常的方法开始回溯,直到找到包含异常处理的方法为止,这一过程称之为捕获(catch)一个异常。Java中所有的包都声明了这个异常类和错误类(Throwable——Exception、Error)。异常又分为检查型异常和非检查型异常。对于检查型异常,Java类必须在方法签名中声明他们所抛出的任何检查型异常。对于任何方法,如果他们调用的方法抛出了一个类型为E的检查型异常,那么调用者就必须捕获或者也声明抛出E(或者E的一个父类),对此编译器要进行检查。也就是说,检查型异常是Java强迫程序必须进行处理,处理的方法有两种:1 声明抛出异常:不在当前方法内处理异常,而是把异常抛到调用方法中。2 捕获异常:使用try{} catch{}块,捕获所发生的异常,并进行相应的处理。

3 Java中方法的重载

Java中方法的重载(overload)是指在一个类中可以有名字相同的多个方法,但这些方法的参数必须不同,或者是参数的个数不同,或者是参数的类型不同。返回值可以相同,也可以不同(方法重载不依据返回值的类型确定)。

Java中类的重用机制:

Java中与类的重用的有关内容有:类的继承、Object类、终结类与终结方法、抽象类、类的组合以及Java包。

1 Java中类的继承

继承是一种用已有类去创建新类的机制。一个新类从现有的类派生,这个过程称之为继承。派生出的新类称之为子类,已有的类称之为父类(超类)。继承能够很好的解决代码重用的问题。Java要求声明的每一个类都有父类,当没有显式指出时,父类隐含为java.lang包中的Object类。Java只能单继承(一个父类有多个子类、一个子类有多个父类)。继承时需要加extends关键字。子类继承了父类之后就有了父类的属性和行为,同时也可以在子类中定义自己的属性和行为。子类不能直接访问从父类继承过来的私有属性及方法,但可以使用public和protected的私有属性和方法。                属性的隐藏和覆方法盖是指子类从父类继承来的属性变量及方法可以重新加以定义。这里所谓的隐藏是指子类拥有了两个相同名字的变量,一个是自己的,一个是父亲的,当子类执行父亲的方法时用自己的属性,当执行从父类继承过来的方法时用父亲的方法。所以访问被隐藏的父类域,要么用父亲的方法,要么用super.。注意:子类不继承父类中的静态属性,但可以对父类中的静态变量进行操作。(这是为什么呢?在创建一个子类的时候,我们把创建的时候的堆内存内存划分为两个区域,其中有一个super区,在这个区域中,存放的是父类的成员属性。另一个就是this区域,在这个区域存放的是子类自己的成员属性。 在方法区中,同样包括了两个部分,一个部分是super的方法去,super的方法区,只能指向父类的成员属性和方法。另一个是this的方法区,this的权限就相对大一些,可以访问子类自己的属性和方法,同时还可以访问父类的public的属性和方法。 当子类在访问一个属性的时候,他首先会从this所指向的堆内存或者方法区寻找,如果找到了则执行,如果找不到,则要从super区中去寻找。这样理解覆盖就非常明了了,既是在子类中覆盖了父类的成员属性,然后输出,那么首先输出的就是子类的成员属性,不过父类中的成员属性同样存在)。           方法覆盖的原意是子类不需要使用父类继承过来的方法,而要去自己去定义方法,在声明时使用相同的方法名及参数表,但执行不同的功能。在方法覆盖中,由于同名方法隶属于不同的类,所以要解决调用时如何区分它们的问题,只需在方法名前面使用不同的类名或不同类的对象名。        Java中,使用constructor是生成实例对象的唯一方法。对于有继承时的构造函数来说,子类不继承父类的构造函数。如果在子类的构造函数的声明中没有明确调用构造函数父类的构造方法,则在构造子类对象时将自动调用子类构造方法(无参);如果子类中的构造方法的声明中调用父类构造方法,则调用语句必须是子类构造方法的第一句super(参数/没有参数)。

2 Java中的Object类

Object类是所有类的父类,构造方法为Object()。其中较为主要的方法有:

public final Class getClass()
//获取当前类所属的类信息,返回Class对象
public String toString()
//返回当前对象本身的有关信息,按字符串对象返回
public boolean equals(Object obj)
//比较两个对象是否是同一对象,是则返回true
protected Object clone()
//生成当前对象的一个副本,并返回这个独享
public int hashCode()
//返回该对象的hashcode
protect void finalize() throw Throwable
//定义回收当前对象时所要完成的资源释放工作
我们可以对这些方法进行重写覆盖。

3 Java中的终结类与终结方法

终结类有final修饰,表示此类不能再派生出新的类。原因从两方面考虑:安全问题与面向对象程序设计本身问题。终结方法有final修饰,表示子类重写与父类同名的final方法,如果写,编译器会直接报错。终结方法能够提高程序运行效率。在Java的运行环境中运行方式,他将首先在当前类中查找该方法,接下来在超类中查找,并一直沿类层次往上找,直到找到该方法为止(就像栈一样,方法后压入的先找)。

4 抽象类与抽象方法

抽象类是一个被认为不完全的类,有abstract修饰。抽象方法中仅有方法头,即,没有函数体,且必须用abstract修饰。若类A是抽象类,则A有没有抽象方法均可;反之,类A非抽象类,则必无抽象方法。若类A中有抽象方法,则A必为抽象类;若类A没有抽象方法,则A可以为抽象类。抽象方法的具体实现是由子类在他们各自的类声明中完成的。也就是说,各子类在继承了父类的抽象方法之后,再分别重写他们,形成若干个名字相同返回值相同,返回值相同,参数列表相同,但具体功能有一定差别的方法。

5 类的组合

组合类的构造函数好写。组合是整体与部分的关系,继承是旧事物生成新事物的关系。

6 包

语言包:java.lang提供了Java语言最基础的类。例如:Object、Boolean、Byte、Character、Short、Integer、Long、Float、Double、String(常量字符串)、StringBuffer(变量字符串类)、Math、System、Runtime、Class、ClassLoader。

实用包:java.util提供了实现各种不同实用功能的类。日期类(Date、Calendar、GregorianCalendar),集合类(Collection、Set、List、Enumeration、LinkedList、Vector、Stack、Hashtable、TreeSet),StringTockenizer

文本包:java.text提供了各种文本和日期格式。Format、DataFormat、SimpleDataFormat等

接口:

接口(interface)使抽象的层次更加深入了一层。可以将其想象为一个纯的抽象类,接口也包含了数据成员,但他们都默认为static和final,必须要初始化。接口只是一种形式,并不提供任何细节,他是面向对象程序设计的一个重要概念。接口的引进是为了实现多继承,同时免除C++中多继承那样的复杂性(不相干的类之间也有共同的属性和方法)。在一个具体的类中实现接口是比继承时更加好的选择(可能是因为子类的构造函数更加好些,直接调用接口的默认构造函数,几乎不用初始化,纯属猜测)。实现接口的类必须实现接口中的所有抽象方法(可以从现实意义进行理解),并且需要将这些方法声明成public。Java中可以实现多个接口,从某种程度上来说,也是实现了多重继承。接口与一般类一样,均可以通过扩展(extends)的技术来派生出新的接口。子接口不仅有父接口的成员,还能够添加新的成员。

塑型(类型转换type_casting):

对象类型转换:对象只能被转换为任何一个父类;对象所属类的一个接口(虽然不能用接口生成对象,但可以声明接口的引用变量,接口的引用变量可以指向任何实现了此接口的类对象);回到它自己的类(一个对象被塑型为父类或者接口后,还可以再被塑型,回到他自己所在的类)。隐式转换:当一个类要被塑型为父类或接口时,系统会进行自动塑型;对于引用变量,可以通过强制转换,将其还原为本来的类型。要注意:对于基本数据,塑型是将值从一种形式转换为另外一种形式的过程;对于对象,塑型并不是转换,而仅仅是将对象暂时当成一类对象来对待,而并没有去改变它,就像是带了一个面具一样。        塑型中实例方法的查找总是从对象创建时所属的类开始,沿类层向父类查找(前提是方法被重写,如果没有,则伪装成父类后,只能访问父类的方法和属性)。塑型中类方法的查找是在编译时进行的,所以总是在引用变量声明时所属的类中查找。        对于基本数据的类型转换,默认的只能实现从窄到宽的转换,且整数默认为int,实数默认为double。

多态:

由于所有的对象都可以被塑型为相同的对象Object,所以他们可以相应名字相同的方法,但是方法的功能不一样,这就叫多态。多态的基础是塑型和方法的重写(override)。换言之,多态必须是在子类和父类中有相同的方法签名,不然就不是多态。如果不是多态,则按塑型的规则进行属性和方法的查找。java中,构造函数体内也允许多态的存在,但是Cpp中是不允许的,因为cpp中构造函数调用在编译阶段都确定了的。

Java程序一般有两种。一种是application,他是运行在Java虚拟机上的程序,另一种是applet运行于支持Java语言的浏览器中。对于application个程序来说,每个项目有且只能有主类(与文件名相同),且在这个主类中有且只有能有一个主方法main方法。这就类似于C/C++的main函数所在的文件,由main函数来调用其他函数。Java中是在主方法中调用其它类。在Javac编译之后就形成了一个class文件,然后再在虚拟机上运行。对于applet,在applet中没有main()方法作为Java解释器的入口,因此必须编写HTML文件,把applet嵌入其中。

Java与C/C++基本语法的异同:

java中的基本类型有三种,数字型、字符型和布尔型。Java中一切都是对象,并且Java中所有对象都是在运行时动态创建的,创建的方法就是用new T。Java中没有全局变量,只有类成员变量和局部变量。Java中的常量用final修饰与const关键字很像。字符串在Java里面很特殊,在Java中包括 null在内的任何类型都能转换成字符串类型,因为在object中有一个ToString()方法,而其他类都继承了object类(万物皆对象)。在Java中数组也是一个对象,数组元素可以是基本类型或者引用类型,数组名也是一个引用。在Java中使用数组对象,1声明数组对象(不分配内存空间),2创建数组对象(分配内存空间,如果没有制定初始值,则为零或null)。Java语言通过垃圾回收机制简化了程序的内存管理。

java中面向对象程序设计的概念:

现实世界中就是由各种对象组成的,,复杂的对象可以由简单的对象组成。在研究对象时主要考虑对象的属性和行为。通常将属性及其行为相同的或相似的对象归为一类(求同存异)。类可以看作是一类对象的抽象,代表此类对象所具有的共同属性和行为。Java是一门面向对象的程序设计,程序的基本组成是类。程序在运行时由类生成对象,对象之间通过发送消息进行通信,进而完成一系列的操作。对象是程序的核心。面向对象程序设计的核心是对象。面向对象中涉及的主要概念有抽象、封装、继承和多态。抽象是对一类具体对象的抽象,得到他们共有的属性和行为,形成类,类就是他们的抽象。封装是有清楚的边界,所有对象的内部信息被限定在这个边界内,接口是对象向外界提供的方法,外界可以通过这些方法与对象进行交互。由于封装的特性禁止了外界对象直接操作类中的数据使得模块与模块之间只能通过严格控制的接口进行交互,这使得模块之间的耦合度大大降低,从而保证了模块具有很好的独立性,使得程序的维护和修改变的十分的容易。继承从某种程度上来说是反抽象或者说是更加具体的一种行为,他为类的重用提供了方便。但是Java只是允许单继承。多态是一个程序中同名的不同方法共存的情况,比如“启动”是所有交通工具的行驶的充要条件,但是不同的交通工具启动的方法也不尽相同。此时,我们可以定义“汽车启动”“轮船启动”,这些名字也都不一样,太麻烦了。而多态就可以帮助我们解决这个问题,只起一个名字“启动”,这样一来通过不同交通工具就都可以相应他们自己“启动”的方法了。Java中的类型其实不仅仅包括数据本身的格式和大小,还包括数据的方法,而类也是一种类型。他应该也能向integer一样进行运算,只不过,类的对象需要自己去定义他的运算(方法)。简单说,类是对一类对象的抽象,是对象的模板,而对象是这个类的具体实例。Java的基本数据类型有自动装箱与拆箱的功能,装箱——转换成integer类,拆箱——装换成基本数据类型。

Java中的类:

Java程序的入口是main方法。类的访问控制只有public共有类和默认类两种。public范围最广,谁都能用;默认类的访问范围控制在所属的包内。类成员的访问控制有public:与类的public一样;private:只能被这个类本身访问,在类外不可见;protected:只能被同一类及其子类的实例对象访问;默认的:在所属的包内各个类都能访问。Java中可以将一个类的声明放在一个文件中,也可以将多个类的声明放在一个文件中(在这种情况下,最多只能有一个类声明为共有类,即说明为public)

类的声明:Public存取控制,abstract/final表示类的类型,extends继承,implements类要实现的接口,用来存储对象的变量称之为引用变量,但是声明一个引用变量并没有 对象生成,此事还需要用new来构造,这时才分配内存空间,并将对象的引用赋值给引用变量。

Java中的数据成员:

数据成员变量可以是Java中的任意类型数据:简单类型、类、接口和数组。修饰符:public/private/protected访问控制符;static静态成员变量,寿命长,属于整个类,但不属于某个具体的对象,静态属性也用来存储经常需要共享的数据,还有在系统中用到的一些常量值也需要声明成静态,如圆周率PI。在构建对象时,具体的对象是不包含静态属性的。在访问时,既可以通过类名.类变量名、实例名.类变量名这两种方式来访问。final指定变量的值不能被修改;transient指明变量表示的是一个临时常量状态;volatile指明变量是一个共享变量,由多个线程共享的变量可以用volatile修饰,使得各个线程对该变量的访问能保持一致。

Java中的方法成员:

Java中的方法就是函数:public/private/protected访问权限控制符;static指明方法是一个类方法;final指明方法是终结方法;abstract指明方法是一个抽象方法;native用来将Java代码与其他语言的代码集成起来;synchronized用来控制多个并发线程对共享数据的访问。方法的参数和返回值类型可以为void、简单数据类型和引用(接口、类和数组)。当方法的参数类型为基本数据类型时为值传递,参数为引用时采用引用传递。

Java的包:

1 编译单元与类空间

一个Java源代码文件称之为一个编译单元。一个编译单元中只能由一个public类,该类名与文件名相同。编译单元中的其他类往往只是public的辅助类。经过编译,每个编译单元的的每个类都会生成一个.class文件。Java的工作程序是一系列的.class文件,Java解释器负责寻找、加载和解释这些文件。由于类成员属于不同的类,所有类成员的名字都是相互隔离,不同类中相同名字的方法不会发生命名冲突。但是如果类名相同,那就有麻烦了。

2 包

包就是用于管理类的名字空间,利用包来划分名字空间,便可以避免类名冲突。一个包中可以包含若干个类文件,还可以包含若干个包。包名就是文件夹名,类名就是文件名。对于一个Java的编译单元来说,通常包括(所属包的声明(省略,则属于默认包);Import(引入)包的声明,用于导入外部类;类和接口的声明。)。为了使用其他包中所提供的类,需要使用import语句引入所需要的类。

Java中对象的初始化与回收还有方法的重载:

Java在生成对象时,会为对象分配内存空间,并自动调用构造函数对实例变量进行初始化,当对象不再使用时,系统会按情况调用垃圾回收程序将其占用的内存回收。

1对象初始化

构造方法是Java进行对象初始化的方法,每个类都有构造方法,用来初始化该类的一个新对象。构造方法名与类名相同,没有返回值类型,没有return语句(三无)。构造方法就是完成对象的初始化工作,通常被声明为public。用户声明构造方法,系统不会产生默认构造方法,一般需要用户自己在编写一个构造方法;用户没有声明构造方法,系统自动生成一个构造方法。

2垃圾回收

内存泄漏是一个很重要的问题,Java运行时系统通过垃圾收集器周期性的释放无用内存对象所使用的内存来避免内存泄漏所造成的重大问题。当一个对象在程序中不再被使用时,即当前的代码段不属于当前对象的作用域或把对象的引用赋值为空,则该对象就变成了一个无用对象。当系统的内存佣金或程序调用System.gc()要求进行垃圾收集时,垃圾收集线程与系统同步运行,否则垃圾收集器在系统空闲时异步运行。Java中的每一个类都有一个finalize()方法用于释放资源,在对象进行垃圾回收前,Java运行时系统会自动调用对象的finalize()方法来释放系统资源,如关闭文件或socket等。finalize方法在java.lang.Object中声明,但并没有做任何事情。如果一个类需要释放内存以外的资源,则需要在类中重写finalize()方法。

Java异常处理:

通常程序中的错误分为三类,即编译错误——一般为语法错误,运行错误——比如0为除数、数组下标越界,逻辑错误——机器本身无法检测的错误。Java系统根据错误的等级分为错误和异常。错误——致命性的,异常——非致命性的,通过某种修正依然能够运行。Java提供了异常处理机制,在一个方法运行的过程中,如果发生了异常,则这个方法(或者Java虚拟机)便生成了一个代表该异常的对象(包含了异常非常详细的信息),并把它交给运行时系统,运行时系统找相应的代码来处理这一异常(把生成异常对象并提交的过程称为抛出(throw)一个异常);运行时系统在方法的调用堆栈中查找,从生成异常的方法开始回溯,直到找到包含异常处理的方法为止,这一过程称之为捕获(catch)一个异常。Java中所有的包都声明了这个异常类和错误类(Throwable——Exception、Error)。异常又分为检查型异常和非检查型异常。对于检查型异常,Java类必须在方法签名中声明他们所抛出的任何检查型异常。对于任何方法,如果他们调用的方法抛出了一个类型为E的检查型异常,那么调用者就必须捕获或者也声明抛出E(或者E的一个父类),对此编译器要进行检查。也就是说,检查型异常是Java强迫程序必须进行处理,处理的方法有两种:1 声明抛出异常:不在当前方法内处理异常,而是把异常抛到调用方法中。2 捕获异常:使用try{} catch{}块,捕获所发生的异常,并进行相应的处理。

3 Java中方法的重载

Java中方法的重载(overload)是指在一个类中可以有名字相同的多个方法,但这些方法的参数必须不同,或者是参数的个数不同,或者是参数的类型不同。返回值可以相同,也可以不同(方法重载不依据返回值的类型确定)。

Java中类的重用机制:

Java中与类的重用的有关内容有:类的继承、Object类、终结类与终结方法、抽象类、类的组合以及Java包。

1 Java中类的继承

继承是一种用已有类去创建新类的机制。一个新类从现有的类派生,这个过程称之为继承。派生出的新类称之为子类,已有的类称之为父类(超类)。继承能够很好的解决代码重用的问题。Java要求声明的每一个类都有父类,当没有显式指出时,父类隐含为java.lang包中的Object类。Java只能单继承(一个父类有多个子类、一个子类有多个父类)。继承时需要加extends关键字。子类继承了父类之后就有了父类的属性和行为,同时也可以在子类中定义自己的属性和行为。子类不能直接访问从父类继承过来的私有属性及方法,但可以使用public和protected的私有属性和方法。                属性的隐藏和覆方法盖是指子类从父类继承来的属性变量及方法可以重新加以定义。这里所谓的隐藏是指子类拥有了两个相同名字的变量,一个是自己的,一个是父亲的,当子类执行父亲的方法时用自己的属性,当执行从父类继承过来的方法时用父亲的方法。所以访问被隐藏的父类域,要么用父亲的方法,要么用super.。注意:子类不继承父类中的静态属性,但可以对父类中的静态变量进行操作。(这是为什么呢?在创建一个子类的时候,我们把创建的时候的堆内存内存划分为两个区域,其中有一个super区,在这个区域中,存放的是父类的成员属性。另一个就是this区域,在这个区域存放的是子类自己的成员属性。 在方法区中,同样包括了两个部分,一个部分是super的方法去,super的方法区,只能指向父类的成员属性和方法。另一个是this的方法区,this的权限就相对大一些,可以访问子类自己的属性和方法,同时还可以访问父类的public的属性和方法。 当子类在访问一个属性的时候,他首先会从this所指向的堆内存或者方法区寻找,如果找到了则执行,如果找不到,则要从super区中去寻找。这样理解覆盖就非常明了了,既是在子类中覆盖了父类的成员属性,然后输出,那么首先输出的就是子类的成员属性,不过父类中的成员属性同样存在)。           方法覆盖的原意是子类不需要使用父类继承过来的方法,而要去自己去定义方法,在声明时使用相同的方法名及参数表,但执行不同的功能。在方法覆盖中,由于同名方法隶属于不同的类,所以要解决调用时如何区分它们的问题,只需在方法名前面使用不同的类名或不同类的对象名。        Java中,使用constructor是生成实例对象的唯一方法。对于有继承时的构造函数来说,子类不继承父类的构造函数。如果在子类的构造函数的声明中没有明确调用构造函数父类的构造方法,则在构造子类对象时将自动调用子类构造方法(无参);如果子类中的构造方法的声明中调用父类构造方法,则调用语句必须是子类构造方法的第一句super(参数/没有参数)。

2 Java中的Object类

Object类是所有类的父类,构造方法为Object()。其中较为主要的方法有:

public final Class getClass()
//获取当前类所属的类信息,返回Class对象
public String toString()
//返回当前对象本身的有关信息,按字符串对象返回
public boolean equals(Object obj)
//比较两个对象是否是同一对象,是则返回true
protected Object clone()
//生成当前对象的一个副本,并返回这个独享
public int hashCode()
//返回该对象的hashcode
protect void finalize() throw Throwable
//定义回收当前对象时所要完成的资源释放工作

我们可以对这些方法进行重写覆盖。

3 Java中的终结类与终结方法

终结类有final修饰,表示此类不能再派生出新的类。原因从两方面考虑:安全问题与面向对象程序设计本身问题。终结方法有final修饰,表示子类重写与父类同名的final方法,如果写,编译器会直接报错。终结方法能够提高程序运行效率。在Java的运行环境中运行方式,他将首先在当前类中查找该方法,接下来在超类中查找,并一直沿类层次往上找,直到找到该方法为止(就像栈一样,方法后压入的先找)。

4 抽象类与抽象方法

抽象类是一个被认为不完全的类,有abstract修饰。抽象方法中仅有方法头,即,没有函数体,且必须用abstract修饰。若类A是抽象类,则A有没有抽象方法均可;反之,类A非抽象类,则必无抽象方法。若类A中有抽象方法,则A必为抽象类;若类A没有抽象方法,则A可以为抽象类。抽象方法的具体实现是由子类在他们各自的类声明中完成的。也就是说,各子类在继承了父类的抽象方法之后,再分别重写他们,形成若干个名字相同返回值相同,返回值相同,参数列表相同,但具体功能有一定差别的方法。

5 类的组合

组合类的构造函数好写。组合是整体与部分的关系,继承是旧事物生成新事物的关系。

6 包

语言包:java.lang提供了Java语言最基础的类。例如:Object、Boolean、Byte、Character、Short、Integer、Long、Float、Double、String(常量字符串)、StringBuffer(变量字符串类)、Math、System、Runtime、Class、ClassLoader。

实用包:java.util提供了实现各种不同实用功能的类。日期类(Date、Calendar、GregorianCalendar),集合类(Collection、Set、List、Enumeration、LinkedList、Vector、Stack、Hashtable、TreeSet),StringTockenizer

文本包:java.text提供了各种文本和日期格式。Format、DataFormat、SimpleDataFormat等

接口:

接口(interface)使抽象的层次更加深入了一层。可以将其想象为一个纯的抽象类,接口也包含了数据成员,但他们都默认为static和final,必须要初始化。接口只是一种形式,并不提供任何细节,他是面向对象程序设计的一个重要概念。接口的引进是为了实现多继承,同时免除C++中多继承那样的复杂性(不相干的类之间也有共同的属性和方法)。在一个具体的类中实现接口是比继承时更加好的选择(可能是因为子类的构造函数更加好些,直接调用接口的默认构造函数,几乎不用初始化,纯属猜测)。实现接口的类必须实现接口中的所有抽象方法,并且需要将这些方法声明成public。Java中可以实现多个接口,从某种程度上来说,也是实现了多重继承。接口与一般类一样,均可以通过扩展(extends)的技术来派生出新的接口。子接口不仅有父接口的成员,还能够添加新的成员。

塑型(类型转换type_casting):

对象类型转换:对象只能被转换为任何一个父类;对象所属类的一个接口(虽然不能用接口生成对象,但可以声明接口的引用变量,接口的引用变量可以指向任何实现了此接口的类对象);回到它自己的类(一个对象被塑型为父类或者接口后,还可以再被塑型,回到他自己所在的类)。隐式转换:当一个类要被塑型为父类或接口时,系统会进行自动塑型;对于引用变量,可以通过强制转换,将其还原为本来的类型。要注意:对于基本数据,塑型是将值从一种形式转换为另外一种形式的过程;对于对象,塑型并不是转换,而仅仅是将对象暂时当成一类对象来对待,而并没有去改变它,就像是带了一个面具一样。        塑型中实例方法的查找总是从对象创建时所属的类开始,沿类层向父类查找。塑型中类方法的查找是在编译时进行的,所以总是在引用变量声明时所属的类中查找。

多态:

由于所有的对象都可以被塑型为相同的对象Object,所以他们可以相应名字相同的方法,但是方法的功能不一样,这就叫多态。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值