您的位置:首页 > 编程语言 > Java开发

Java笔记(三)类的重用

2016-06-10 14:05 246 查看
Java语言的重用机制,重用的形式可以是类的组合或继承。基于类和对象的重用比传统程序的重用更容易。

1.类的继承

(1)继承的概念(子类,超类)

Java要求声明的每个类都有父类,当没有显示指定父类时,父类隐含为java.lang包中的Object类。

Java只支持单继承。(虽然只支持单继承,但可以通过实现接口来实现多继承功能)

(2)继承的语法

关键字:extends

(3)隐藏和覆盖

隐藏和覆盖是指子类对从父类继承来的属性变量及方法可以重新加一定义。

a.属性的隐藏

子类对父类继承来的属性变量重新加以定义,则从父类继承来的属性将被隐藏。

子类中声明了与父类同名的属性变量,即出现了子类变量对同名父类变量的隐藏,这里所谓隐藏是指子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己声明,当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行他自己声明的方法时,所操作的就是它自己声明的变量,而把继承自父类的变量“隐藏”起来了。

访问被隐藏的父类域:(1.调用从父类继承的方法;2.使用super.域名)

子类并不能继承父类中的静态属性,但可以对父类中的静态属性进行操作。

b.方法覆盖

声明方法时,使用相同的方法名及参数表,但执行不同的功能,这种情况称为方法覆盖(Method Overriding)

用super可以调用父类的方法。

子类在重写父类已有的方法时,应保持与父类完全相同的方法名,返回值和参数列表,即相同的签名。

(4)有参数时的构造方法

构造方法不能从父类继承。

在Java中,使用构造方法是生成实例对象的唯一方法。

在继承时构造方法遵循以下原则:(1.子类不能从父类继承构造方法;2.好的程序设计方法是在子类的构造方法中调用某一个父类的构造方法;3.super关键字也可以用于构造方法中,可以调用父类的构造方法;4.如果在子类的构造方法的声明中没有明确调用父类的构造方法,则系统在执行子类的构造方法时会自动调用父类的默认构造方法;5.如果在子类失的构造方法的声明中调用父类的构造方法,则调用语句必须出现在子类构造方法的第一行。)

2.Object类

Java的类库是系统提供的已实现的标准类的集合,是Java编程的API。

Object类是Java程序中所有类的直接或间接父类,也是类库中所有类的父类,处于类层的最高点,Object类包含了所有Java类的公共属性。

主要方法:(public final Class getClass(); public String toString(); public boolean equals(Object obj); protected Object clone(); public int hashCode(); proteced void finalize() throws Throwable;)

equals()方法的使用:

(1)相等与同一

相等:两个对象属性值相同。

同一:两个引用指向同一个对象。

用“==”判断的是两个对象是否同一。

(2)Object类中的equals()方法

Object类中的equals()方法的定义:

public boolean equals(Object x){ return this==x; }

Object类中的equals()方法判断的是两个对象是否同一,而不是是否相等,如需判断两对象是否相等,则需对equals()方法进行重写。

(3)equals方法的重写

@Override

public boolean equals(Object x){

if(this.getClass()!=x.getClass()){

return false;

}

//验证属性名是否相等

return true/false;

}

在String类中已对equals方法进行了重写,使其比较两个字符串的值是否相等。

3.终结类与终结方法

(1)终结类

关键字:final

如果一个类被final修饰符所修饰和限定,说明这个类不可能有子类,即final类不能有派生类。

被声明为final的类通常是一些有固定作用,用来完成某种标准功能的类,不能背修改:在Java系统中,java.lang.String,java.lang.Math,java.net.InetAddress,

final类的作用:(1.安全方面;2.设计方面。)

(2)终结方法

final修饰符所修饰的方法是功能和内部语句不能被更改的最终方法,即是不能被当前类的子类重写的方法。

优点:(安全性高,效率高)

将方法声明为final的另一个原因是提高类的运行效率,通常当Java运行环境(如Java解释器)运行方法时,他将首先在当前类中查找该方法,接下来在其超类中查找,并一直沿层次向上查找,直到找到该方法为止。

4.抽象类

(1)抽象类的声明

(没有具体实例对象的类)

关键字:abstract

抽象类的作用:(1.让其他类来继承他的抽象化特征;2.在抽象类中可以包括被它所有子类共享的公共行为和公共属性;3.抽象类不能作为模版来创建对象;4.强迫用户生成更具体的实例,安全性高;)

(2)抽象方法

关键字:abstract

abstract声明类代表没有实例对象的抽象类。abstract声明方法代表没有方法体,代表一个方法的接口标准。

抽象方法注意点:(1.一个抽象类的子类如果不是抽象类,则必须重写父类的所有抽象方法;2.只有抽象类具有抽象方法;3.除了抽象方法,抽象类中还包括非抽象方法。)

抽象方法优点:(1.这种方法可以隐藏具体的细节信息;2.强迫子类完成指定的行为,规定子类需要用到的“标准”行为。)

5.泛型

(1)泛型的概念

泛型是Java5的新特性,其本质是参数化类型,即所操作的数据类型被指定为一个参数。

·泛型类:在类名后面加“<>”。

·泛型方法:在方法名前面加“<>”。

·泛型接口:第五章。

关键符号:“<>”

优点:(简单,安全)

(2)通配符泛型和有限制的泛型

不能将General<\Integer>类型的变量当作参数传递给Genaral<\Object>,因此,在使用泛型时,应注意和继承类的区别。

在Java中,”?”代表任意一种类型,它被称为通配符。

所以将General<\Object>改成General<\?>就解决了问题。

通配符泛型中的”?”代表任意一种泛型,而有时候需要将泛型中参数代表的类型做限制,此时就可以使用有限制的泛型了。

有限制的泛型是指,在参数”Type”后面使用”extends”关键字并加上类名或接口名,表明参数所代表的类型必须是该类的子类或者实现了该接口。

注意:对于实现了某接口的有限制泛型,也是使用关键字extends,而不是implements关键字。

6.类的组合

(Java的类中可以有其他类的对象作为成员)

(1)组合的语法

(2)组合与继承的比较

(3)组合与继承的结合

7.包的应用

Java提供包来管理类名空间

在操作系统中,用目录来组织文件,设置权限,Java利用他来组织相关的类,并控制访问权限。

同一个包中的默认情况下可以互相访问,所以为了方便编程和管理,通常把需要一起工作的类放一个包里。

(1)Java基础类库概述

(java foundational class ,JFC)也称为application programming interface(API)分别放在不同的包中。

Java提供的包主要有:java.lang、java.io、java.math、java.util、java.applet、java.awt、java.beans、java.net、java.rmi、java.security、java.sql、

a.语言包(java.lang)

·数据类型包裹类

1.除了Charater类以外,其他的每一个包裹类都有一个从字符串生成包裹类对象的构造方法,只要字符串中包含的是合法的基本数据类型。

2.有时,已知字符串,可使用valueOf()将其转化成包裹类对象转化成包裹类对象。

3.每一个包裹类都提供相应的方法将包裹类对象转换回基本数据类型的数据:anIntegerObject.intValue()//返回int类型数据。

4.从Java5开始,可以使用自动拆箱,装箱功能。

5.Integet、Float、Double、Long、Byte、Short类提供了特殊的方法,能够将字符串类型的对象直接换成对应的int、float、double、long、byte、short.:Integer.parseInt(“234”)//返回int类型的数据。)

·常量字符串类String:

(Java将字符串作为类来实现,而不强制使用字符串数组)

字符串有两类:(String:(对象的值和长度都不变化,常量字符串);StringBuffer:(对象的值和长度都可以变化,变量字符串))

常用构造方法:(new String(); new String(char[] value); new String(String value); new String(char[] value,int offset,int count);//由字符串数组的一部分(序号由offset开始的count个字符),生成的字符串。 new String(StringBuffer buffer);)

常用字符串方法:(int length(); char charAt(int index);//返回序号index处的字符 int indexOf(String s);//从接受者字符串中进行查找,如果包含子字符串s,则返回匹配的第一个字符的位置序号,否则返回-1 String substring(int begin,int end); String concat(String s); String replace(char oldChar,char newChae); int compareTo(String s); boolean equals(String s); String trim();//返回将字符串两端空字符都去掉的字符串 String toLowerCase(); String toUpperCase();)

·变量字符串类StringBuffer

(StringBuffer类的对象是可以修改的字符串,与String类的对象相比,其执行效率要低一些)

StringBuffer类的构造方法:

new StringBuffer(); //生成容量为16的空字符串对象

new StringBuffer(int size);

new StringBuffer(String aString);

StringBuffer类中的方法:

int length();

int capacity(); //返回字符串对象的容量

void ensureCapacity(int size); //设置字符串对象的容量

void setLength(int len); //设置字符串对象的长度如果length的值小于当前字符串的长度,则尾部被截掉

char charAt(int index);

char setCharAt(int index,char c);

void getChar(int start,int end,char[] charArray,int newStart);

StringBuffer reverse(); //返回将接受者字符串逆转后的字符串

StringBuffer insert(int index,Object ob); //将ob插入到index位置

StringBuffer append(Object ob); //将ob连接到接受者字符串的末尾

·数学类(Math)

数学类中所有的变量和方法都是静态的(static),且数学类是终结类(final),所以不能从数学类中派生其他的新类。

用Java5中静态引入机制,使用语句“import static java.lang.Math.*”,可以不加“Math”。

·系统和运行时类(System、Runtime)

System和Runtime类提供访问系统和运行时环境资源。

System类提供访问系统资源和标准输入输出流方法。

访问系统资源的方法:(arraycopy()、exit()、currentTimeMillis())

标准输入输出的方法:(System.in、System.out)

Runtime类可直接访问运行是资源:(1.totalMemory();返回系统内存总量。2.freeMemory();返回内存的剩余空间。)

·类操作类(Class、ClassLoader)

Class类为Object类的子类,也是最一般的类,包含了所有类共享的公共行为,Object类的getClass()方法返回Class对象。

Class中的方法:(getName()、getSuperclass())

ClassLoader提供把类装入运行时环境的方法。

b.实用包

实用包java.util提供了实现各种不同实用功能的类,包括日期类,集合类等。

·日期类(Date、Calendar、GregorianCalendar)

Date:

构造方法:(new Date()->获得系统当前日期和时间值、new Date(long date))

方法:(getTime();after(Date d);before(Date d);)

Calendar是一个抽象的基础类,支持将Date对象转换成一系列单个的日期整形数据集,如YEAR,MATH,DAY,HOUR等常量,Calendar类派生的GregorianCalendar类实现标准的Gregorian日历,显示日历需用getTime()方法返回Date对象。

Calendar类中的方法isLeapYear(int year)返回year是否为闰年。

get(int field)方法用于取得特定Calendar对象的信息。

set(int field,int value)给日期域设定特定的值,也可以改变日期。

·集合类

·StringTokenizer类

java.util.StringTokenizer类允许以某种分割标准将字符串分割成单独的子字符串。

构造方法:(new StringTokenizer(String aString); new StringTokenizer(String aString,String delimiters); new StringTokenizer(String aString,String delimiters,boolean returnDelimiters);)

方法:

countTokens(); //将其发送给StringTokenizer类的实例对象,将返回单词的个数

nextToken(); //反复使用nextToken()方法可以将单词逐个取出

hasMoreTokens(); //返回是否还有单词

c.文本包

Java文本包中的java.text中的Format、DateFormat、SimpleDateFormat等提供各种文本或日期格式。

(2)自定义包

a.包的声明

包是一组类的集合,通常包名全部用小写字母,且名称必须“独一无二”。

包的声明用package语句:package mypackage;

注:程序中应为Java源文件的第一条语句,它的前面只能有注释或空行,且一个文件中最多只有一条package语句。

如果源文件中没有package语句,则文件中声明的所有类属于一个默认的无名包。

b.编译和生成包

c.包的使用

引用包:关键字:import

如果引用的多个包中包含名字相同的类,则必须指明它所在的包。

(3)JAR文件

a.JAR文件格式

JAR(java archive file)文件是Java的一种文档格式。JAR文件格式与zip文件唯一的区别就是在JAR文件的内容中,包含了一个META-INF/MANIFEST.MF文件和部署描述符,用来指示工具如何处理特定的JAR文件。

b.JAR文件的功能

与zip文件不同的是,JAR文件除了用于压缩和发布文件,还有:(安全性,减少下载时间,传输平台扩展,包密封,包版本控制,可移植性)

c.META-INF目录

大多数JAR文件包含一个META-INF目录,它用于存储包和拓展的配置数据,如安全性和版本信息,Java平台识别并解释META-INF目录中的下述文件和目录,以便配置应用程序。

·MANIFEST.MF 这个manifest文件定义了与拓展和包相关的数据。

·INDEX.LIST 这个文件由jar工具的新选项-i生成,它包含在应用程序或者拓展中定义的包的位置信息,它是JarIndex实现的一部分,并由类装载器用于加速类装载过程。

·xxx.SF 这是JAR文件的签名文件。占位符xxx标识了签名者。

·xxx.DSA 与签名文件相关联的签名程序块文件,它储存了用于签名JAR文件的公共签名。

d.jar工具

jar是随JDK安装的,在JDK安装目录下的bin目录中,Windows下文件名为jar.exe,Linux下文件名为jar。

为了用JAR文件执行基本的任务,要使用Java Development Kit提供的Java Archive Tool(jar工具),用jar命令调用jar工具。

jar命令的格式如下: jar {ctxu} [vfm0M] [jar-文件] [manifest-文件] [-c目录] 文件名…

jar工具在默认情况下压缩文件。未压缩的JAR文件一般可以比压缩的JAR文件更快的装载,因为压缩过的JAR文件在装载过程中要解压缩文件,但是未压缩的文件在网络上下载时间更长。

d.可执行的JAR文件包

一个可执行的JAR文件是一个自包含的Java应用程序,它存储在特别配置的JAR文件中,可以JVM直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的JAR中的应用程序,必须将他加入到类路径中,并用名字调用应用程序的主类。可执行JAR文件有助于方便发布和执行Java应用程序。

创建一个可执行JAR很容易,首先将所有应用程序代码放到一个目录中。然后在某个位置(不是在应用程序的目录中)创建一个名为manifest的文件,并在其中加入以下一行:Main-Class:[主类的全名]。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: