java学习:类和方法的说明符、访问权限、抽象类、接口

在学习了包后,开始了解类的说明符,访问权限和接口。


类的说明符有public和default,default是缺省类,也就是在类前面未加任何的说明符时,系统缺省为default类。类还有final和abstract两个修饰符。

如果想要一个类A被其他包的类访问,则需要将类A声明为public,否则其他包的类无法访问类A。如果将一个类声明为缺省类,即类的前面不加任何说明符时,那么它只能被同一个包的类访问。

当在一个类的前面加上final修饰符时,表明这个类是最终的类,不能够由这个类派生出其他的子类,也就是说它不能被继承。


方法的说明符有public、protected、default、private,其中default是缺省的说明符,即不加说明符的时候系统缺省为default。方法还有static、final、abstract、native、synchronized。

下面是各个说明符的访问权限:

public:所有类都可见,包括不同的包的类

protected:本包的类以及所有的子类都可见,即使子类不在同一个包

default:本包可见

private:本类可见,即只有自己本身所在的类才能访问,对子类也不可见。


方法还有五种修饰符。

static 修饰的方法表明该方法是静态的,属于这个类,在内存中只有一份拷贝,可以直接使用类名来调用。在这前面的文章中已经提到过。

final是为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖,类中的所有的private和static方法自然就是final的。为了效率上的考虑,有时也将方法声明为final,让编译器对此方法的调度进行优化。但要注意的是,编译器会自动对final方法进行判断,从而决定是否进行优化,也就是说,并不是所有的final方法都会被编译器优化。通常在方法的体积很小,我们确实不希望它被覆盖时,才将其声明为final。

abstract修饰的方法表明该方法为抽象方法,只有声明,没有实现,也就是说,没有方法体的方法就是抽象方法,如protected abstract void test();需要注意的是,当我们将一个方法声明为抽象方法时,那它所在的类就自然是抽象类,需要在类名前加上abstract修饰符,如public abstract class Test。对于一个抽象类,它不能被实例化。当一个类继承了抽象类后,它需要实现所继承的抽象类的抽象方法,如果有部分抽象方法未实现,则这个子类也是一个抽象类,需要在类名前加上abstract修饰符。

native修饰的方法表明该方法是本地方法,native方法是用户在java中可以使用,但是不能编写的方法。JNI(JavaNative Interface),它允许Java虚拟机(JVM)内部运行的Java代码能够与用其它编程语言(如C、C++、汇编语言)编写的应用程序和库进行互操作。JNI最大的好处是它没有对底层Java虚拟机的实现施加任何限制,因此,Java虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对JNI的支持。程序员只需编写一种版本的本地(Native)应用程序和库,就能够与所有支持JNI的Java虚拟机协同工作。JNI可以理解为Java和本地应用程序之间的中介。由于我的电脑上并没有装一些环境,所以这块并没有去写代码实现。现在只是知道可以这么用,但未实践。

synchronized等以后学到多线程的时候再去了解,现在先暂时搁在一边。


了解了抽象类,自然就需要了解接口。

接口中所有的方法都是public abstract,它定义了一类行为的集合,这些行为的实现由它的实现类来完成。定义接口的时候使用interface来定义,如interface A{}。实现类实现时使用implements,如class B implements A{}。 由于接口中的方法都是public abstract,所以实现类在实现这些方法的时候,这些方法的权限就不能低于public abstract,所以在实现方法的时候一定要加上public,否则编译会报错。

在接口中声明方法时,不能使用native、static、final、synchronized、private、protected等修饰符。public接口也必须定义在与接口同名的文件中。在接口中也可以有数据成员,这些成员默认都是public static final的。

在java中,一个类可以实现多个接口,并且一个类在继承另外一个类的同时,可以实现多个接口。

下面以一段代码来说明接口的使用,代码仅仅为了说明接口的使用,所以并不规范。(实验室要关门了,明天早上补代码)

把代码给补上:

interface Sittable

{

double PI = 3.14;

void sit();
}
interface Lie
{
void sleep();

}

interface test extends Sittable
{
}

class Chair implements Sittable
{

public int sit()

{

return PI * PI;

}

}
class Sofa extends Chair implements Lie
{
public void sit(){}
public void sleep(){}
}

以上代码简单的说明 了接口的使用,接口的继承、实现等。在类Sofa中,继承自Chair类,Chair类已经实现了Sittable接口,但是在Sofa中也可以实现Sittable接口,即下面这样写编译也通过:class Sofa extends Chair implements Lie, Sittable{.....} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值