首页 > 代码库 > Java 4

Java 4

1、继承的问题

子类是父类的一个扩展,子类可以利用父类的属性与行为,这种情况子类会破坏父类的封装

为了保持父类良好的封装性,设计父类有以下规则:

技术分享

技术分享

 

如果要把某类设计为最终类则需要添加final修饰符,或将此类的构造器声明为private

 

2、利用组合实现复用

组合就是把旧类的对象当做新类的属性嵌入,并用private修饰

public class Animals{	public Animals()	{		System.out.println("Animals");	}    public void breathe()    {	    System.out.println("ha-hu");    }}public class Wolf  {	private Animals a;	public Wolf(Animals a)	{		this.a=a;	}	public void run()	{		System.out.println("run");	}	public static void main(String[]args)	{		Animals b=new Animals();		Wolf a=new Wolf(b);		a.run();	}}

 

3、初始化块

前面定义的初始化块先执行,后面的后执行

syntax:

[修饰符]{    //...}

只能使用sattic修饰,称作静态初始化块

当创建一个对象是先调用初始化块

 

静态初始化块对整个类进行初始化

系统会首先执行静态初始化块,并会一直回溯到基类再一步一步执行静态初始化,再执行其他

 

4、基本数据类型的包装类

技术分享

为什么要用包装类?

解决8个基本类型变量不能变成Object类型变量的问题,为8个基本类型变量定义了应用类型的包装类。

 

技术分享

JDK1.5后提供了自动装箱与自动拆箱,就可以直接来了,不用这么复杂了

 

基本类型变量与字符串之间的转换关系

技术分享

 

5、toString

toString 是Object 类定义的一个方法,用以描述对象的状态信息

返回值:对象类的实现类名+@+hashCode

可以依据实际情况重写toString

 

6、==与equals

==比较是一种基本类型的比较符,当要对引用类型进行比较时,比较的是是否指向同一个对象,不是值相等

要实现值相等的比较,就要重写equals

Object提供的equals与==是一样的,没有用的,一定要重写

重写后有规定:

1)自反性;

2)传递性;

3)对称性;

4)一致性。

 

Example:

public boolean equals(Object obj){	if(this==obj)		return true;	if(obj!=null&&obj.getClass()==SomeClass.class)    {		SomeClass sc=(SomeClass)obj;		if(compare)			return true;	}     return false;}

 

7、类成员

类中只能包含属性、方法、构造器、初始化块、内部类、枚举类

static不修饰构造器

类成员不能访问实例成员

 

8、单例类Singleton

一个类只能创建一个实例

把构造器用private修饰

需要一个public方法作为这个类的访问点,同时要将其定义为static

该类还需缓存已创建的对象

class Singleton{	//使用一个变量来缓存曾经创建的实例	private static Singleton instance;	//隐藏构造器	private Singleton(){}	//提供一个静态方法,用于返回Singleton实例	//可加入自定义的控制,保证只产生一个Singleton    public static Singleton getInstance()	{		if(instance==null)		{			instance=new Singleton();		}	    return instance;	}}

9、final

final修饰的变量赋值后不可改变

final修饰的成员变量必须在类中赋初值

类属性:在静态初始化块中、在声明该属性时指定初始值

实例属性:在非静态初始化块、声明属性、构造器中指定初始值

系统不会对final修饰成员进行隐式初始化

final修饰的引用变量只是保证它所指向的地址不改变,而该引用的内容是可以改变的

 

final修饰的方法不可被重写,但可以重载

final修饰的类不可继承

 

10、不可变类

创建该类的实例后,实例的属性不可改变

8个包装类、java.lang.String都是不可变类

hashcode返回的是对象地址

final修饰的引用类型变量不符合不可变,那么我们在设计类的时候必须将此变量保护起来。

 

11、缓存实例的不可变类

如果程序需要经常使用某些实例,则应把其缓存

Example:

利用数组作为缓存池

public class CacheImmutale{ private final String name; private static CacheImmutale[]a=new CacheImmutale[10]; private static int pos=0; public CacheImmutale(String name) {	this.name=name; } public String getName() {	return name; }  //利用valueOf创建对象,而不用构造器 public static CacheImmutale valueOf(String name) {	for(int i=0;i<10;i++)	{		if(a[i]!=null&&a[i].getName().equals(name))			return a[i];	}     if(pos==10)	 {		 a[0]=new CacheImmutale(name);		 pos=1;		 return a[0];	 }	 else	 {		a[pos++]=new CacheImmutale(name);        return a[pos-1];			 } }  //重写equals public boolean equals(Object obj) {	if(obj instanceof CacheImmutale)	{		CacheImmutale aa=(CacheImmutale)obj;		if(name.equals(aa.getName()))		{			return true;		}	     return false;	} }  //重写hashCode public int hashCode() {	return name.hashCode(); }}

 

12、抽象类

抽象方法与抽象类的规则:

技术分享

 

利用抽象类就是利用一种模板模式

抽象父类中提供多个子类的通用方法,子类再进行具体的实现补充。

 

13、接口

接口中所有的方法都是抽象方法

接口规定类中应具体提供的方法,但不管具体实现

syntax:

[修饰符] interface  Name extends 父接口1, 父接口2...{} 

 

技术分享

 

接口中可以包含属性(只能是常量),方法(只能是抽象实例),内部类(包括内部接口)和枚举类的定义

只能是public 、static、final(系统默认)

方法、内部类、枚举类 自动用public static 修饰

 

技术分享

 

使用接口: 

技术分享

类必须实现接口内的所有方法,只能用public

技术分享

模拟多继承

 

interface and abstract class

技术分享

 

Java 4