每天JAVA简单教学:类定义,成员类,抽象类及接口类

最近忙得快疯掉了,而且着凉了病得好辛苦。。。不过今天还是能抓紧时间上来为大家写些什么,简单一点,希望大家不要介意。

今天来补充说明抽象类和接口。

对于class定义,格式如下:
[public|protected|private] [abstract|final] class 类名
{
//类的内容
....
}

前面是modifier。

需要特别说明的是,对于一个JAVA文件,要求里面一定只能有一个和该文件同名的public类。但是倒不是说一个JAVA文件只能有一个类:

//file name: ClassDeinfeDemo.java
package classdefine;
/**
* This class is required in this file
*/
public class ClassDeinfeDemo
{
}

public class AnotherPublicClass
{
}

class ProtectedClass
{
}

像上面的写法也是可以的,只是一般情况下我们不提倡。因为一般这样写的原因只有一个,就是这个类只会在同一个java文件里面被调用,而不会在其它地方被调用。而且这种写法只能定义default类型的普通类,抽象类,或者final类

另外类中有类也是可以的:

package classdefine;
public class MemberClassDemo
{
/**
* I'm a member of this class
*/
private class MemberClass
{
}

public class PublicMemberClass
{
}
}

private类型的类只能通过这种方式来定义。

需要注意的是,成员类的外部调用是很有趣的:

package classdefine;
public class MemberClassCall
{
public static void main(String[] args)
{
new MemberClassDemo.PublicMemberClass();
}
}

只要把成员类的所有类也加进来,然后用.来调用成员类就好了。这种调用方式和static方法的调用是一样的。

然后就是抽象类的定义:

package classdeinfe;
public abstract AbstractClass
{
public abstract void abstractMethod();
public void entityMethod()
{
....
}
}

和一般的类不一样,abstract类里面可以定义抽象方法。抽象方法不需要实现,这点和一会介绍的接口类似。
但是和接口不一样的地方,就是抽象类里面也可以定义具体的方法体。抽象类的一般用法就是定义一类类的普遍行为,然后预言其中实现各部相同但是却共有的方法,例如:


package classdeinfe;
public abstract Vehicle
{
public abstract float speed();
public void run()
{
....
}

public void stop()
{
....
}

public boolean isMoving()
{
....
}
}

上例列出了一个交通工具抽象类,各类都会有run,stop,isMoving和speed方法。而且stop,run和isMoving方法行为默认都是一样的,而speed则留待子类去实现。当我们每个子类都预期会实现父类某个特定方法的时候,建议把这个父类方法定义为一个抽象方法。这样可以强迫子类针对该方法去定义各自的行为。

假如我们在类定义的时候,使用了final关键字,则该类不允许再被继承:

package classdefine;
public final class FinalClass
{
}


最后我们说一下接口。接口的定义和类类似:

package classdeinfe;
public interface MyInterface
{
public static final String CONSTANT_DEMO = "test";
public void publicMethod();
void defaultMethod() throws Exception;
}

接口类专门用于定义一系列的方法,及相应的一些配套常量。现在我们就多了一种指针——接口指针。首先看看以下例子:

package classdeinfe
public class MyInterfaceImpl implements MyInterface{
public void publiMethod()
{
....
}
/**
* 尽管我们的接口定义的方法访问控制类型为默认,但是实现类里面
* 这个方法一定要是共有的
*/
public void defaultMethod() throws Exception
{
....
}
}

首先,实现接口的类用implements关键字表达,而且接口的实现和继承不一样,一个类可以实现多个接口,各接口用,分开就可以。但是要注意不要有两个接口的方法名一致而返回类型不一致。对于所有的接口方法的实现,都必须是标识为共有访问权。

可能大家会问接口方法标为公有和默认有什么区别呢?很简单,就是当你是调用接口指针变量去访问方法时,会有不同:

package classdeinfe.sub;

import classdeinfe.MyInterface;
import classdeinfe.MyInterfaceImpl;

public class InterfaceCallDemo1
{
public static void main(String[] args)
{
MyInterface intf = new MyInterfaceImpl();
intf.publicMethod(); //可以调用
intf.defaultMethod(); //无法调用,因为是default方法
/*
* 可以调用,因为对于MyInterfaceImpl类来说,其defaultMethod是
* 公有方法
*/
((MyInterfaceImpl)intf).defaultMethod();
}
}

上面是一个很有趣的例子。它同时为我们展现了接口指针的用法,也告诉我们在指针里面定义默认方法和公有方法的区别。

那么,可能大家想知道,接口类有什么用途呢?如果大家要做架構分离,还有单元测试,就会知道接口定义是非常方便的一种设计模式。

因为接口指针可以帮助我们把实现类和调用类分离,当然我们上面的例子不足以说明这个好处。这种做法的实现方式以前我们一般会采用大工厂方式,就是在一个类里面,定义出所有接口及其调用实现类的匹配关系,然后提供一个getInstance方法,给出特定接口类,获取对应的接口实现,但是这个实现会对调用getInstance的类透明,它只拿到一个可以被调用接口方法的实现而已,而不是直接去调用这个实现实体。

试想一下,我们对数据库的操作,全部用接口模式实现的话,那么即使我更换了数据库,最坏的情况也就是把所有数据库操作的实现类代码重写就可以了,而不需要连调用数据库操作层的代码也要修改。这就是接口提供的便利。因为它为我们的代码分离提供了可能。

现在接口这种设计模式,随着Spring及IoC概念的普及,已经得到大家的普遍认可。而且,我们还發現,这种模式还能够让单元测试更加简单。因为不同层次的逻辑分离,使得单元测试的独立性更加容易实现。

要注意的是,对于实现接口的类来说,其实现接口也算是父类哦。。。。。。

下次我们来说一下1.5的新特性:枚举类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值