Java基础知识(一)

来源:互联网 发布:linux打开二进制文件 编辑:程序博客网 时间:2024/06/05 02:01

一、接口


类描述了一个实体,包括实体的状态,也包括实体可能发出的动作。

接口定义了一个实体可能发出的动作。但是只是定义了这些动作的原型,没有实现,也没有任何状态信息。

所以接口有点象一个规范、一个协议,是一个抽象的概念;而类则是实现了这个协议,满足了这个规范的具体实体,是一个具体的概念。

从程序角度,简单理解,接口就是函数声明,类就是函数实现。需要注意的是同一个声明可能有很多种实现。

接口的作用:

      1)通过接口可以实现不相关类的相同行为,而不需要了解对象所对应的类。

      2)通过接口可以指明多个类需要实现的方法。

      3)通过接口可以了解对象的交互界面,而不需了解对象所对应的类。

总的来讲,接口的意义是:规范、扩展和回调。

二、抽象类


        在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

abstract void fun();

        抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。


        下面要注意一个问题:在《JAVA编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么。

abstract class ClassName {    abstract void fun();}

        从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

  包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

      1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

      2)抽象类不能用来创建对象;

      3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

在其他方面,抽象类和普通的类并没有区别。


三、内部类


        为什么要使用内部类?在《Think in java》中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响

        在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整

public interface Father {}public interface Mother {}public class Son implements Father, Mother {}public class Daughter implements Father{    class Mother_ implements Mother{            }}

        其实对于这个实例我们确实是看不出来使用内部类存在何种优点,但是如果Father、Mother不是接口,而是抽象类或者具体类呢?这个时候我们就只能使用内部类才能实现多重继承了。

        其实使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,但是如果我们不需要解决多重继承问题,那么我们自然可以使用其他的编码方式,但是使用内部类还能够为我们带来如下特性(摘自《Think in java》):

     1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。

      2、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。

      3、创建内部类对象的时刻并不依赖于外围类对象的创建。

      4、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。

      5、内部类提供了更好的封装,除了该外围类,其他类都不能访问。

想了解更多信息,请看java提高篇(八)----详解内部类。


四、父类的静态方法能否被子类重写?


不能

        子类继承父类后,用相同的静态方法和非静态方法,这时非静态方法覆盖父类中的方法(即方法重写),父类的该静态方法被隐藏(如果对象是父类则调用该隐藏方法),另外子类可以继承父类的静态与非静态方法。


五、Java数据类型


        变量就是申请内存来存储值,也就是说,当创建变量的时候,需要在内存中申请空间,内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来存储该类型数据,因此通过定义不同类型的变量,可以在内存中存储整数、小数或者字符,Java 的两大数据类型:基本数据类型和引用数据类型。

基本数据类型:

Java 语言提供了八种基本类型,六种数字类型(4 个整数型,2 个浮点型),一种字符类型,还有一种布尔型。

byte:

byte 数据类型是 8 位、有符号的,以二进制补码表示的整数;

最小值是 -128(-2^7)

最大值是 127(2^7-1)

默认值是 0

byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;

例子:byte a = 100,byte b = -50。

short:

short 数据类型是 16 位、有符号的以二进制补码表示的整数

最小值是 -32768(-2^15)

最大值是 32767(2^15 - 1)

Short 数据类型也可以像 byte 那样节省空间。一个 short 变量是 int 型变量所占空间的二分之一;

默认值是 0

例子:short s = 1000,short r = -20000。

int:

int 数据类型是 32 位、有符号的以二进制补码表示的整数;

最小值是 -2,147,483,648(-2^31)

最大值是 2,147,483,647(2^31 - 1)

一般地整型变量默认为 int 类型;

默认值是 0 ;

例子:int a = 100000, int b = -200000。

long:

long 数据类型是 64 位、有符号的以二进制补码表示的整数;

最小值是 -9,223,372,036,854,775,808(-2^63)

最大值是 9,223,372,036,854,775,807(2^63 -1)

这种类型主要使用在需要比较大整数的系统上;

默认值是 0L

例子: long a = 100000L,Long b = -200000L。

"L" 理论上不分大小写,但是若写成 "l" 容易与数字 "1" 混淆,不容易分辩。所以最好大写。

float:

float 数据类型是单精度、32 位、符合 IEEE 754 标准的浮点数;

float 在储存大型浮点数组的时候可节省内存空间;

默认值是 0.0f

浮点数不能用来表示精确的值,如货币;

例子:float f1 = 234.5f。

double:

double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;

浮点数的默认类型为 double 类型;

double 类型同样不能表示精确的值,如货币;

默认值是 0.0d

例子:double d1 = 123.4。

boolean:

boolean 数据类型表示一位的信息;

只有两个取值:true 和 false;

这种类型只作为一种标志来记录 true/false 情况;

默认值是 false

例子:boolean one = true。

char:

char 类型是一个单一的 16 位 Unicode 字符;

最小值是 \u0000(即为 0);

最大值是 \uffff(即为 65,535);

char 数据类型可以储存任何字符;

例子:char letter = 'A';。

引用类型:

在 Java 中,引用类型的变量非常类似于 C/C++ 的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。

对象、数组都是引用数据类型。

所有引用类型的默认值都是 null。

一个引用变量可以用来引用与任何与之兼容的类型。

例子:Site site = new Site("Runoob")。


六、Java虚拟机的特性


        Java 语言的的一个非常重要的特点就是与平台的无关性,而使用 Java 虚拟机是实现这一特点的关键,一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码,而引入 Java 语言虚拟机后,Java 语言在不同平台上运行时不需要重新编译,Java 语言使用模式 Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需要生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

原创粉丝点击