asfman
android developer
posts - 90,  comments - 213,  trackbacks - 0
Java修饰符的使用原则

Abstract修饰符表示所修饰的类没有完全实现,还不能实例化。如果在类的方法声明中使用abstract修饰符,表明该方法是一个抽象方法,它需要在子类实现。如果一个类包含抽象函数,则这个类也是抽象类,必须使用abstract修饰符,并且不能实例化。
     在下面的情况下,类必须是抽象类:
     1.类中包含一个明确声明的抽象方法;
     2.类的任何一个父类包含一个没有实现的抽象方法;
     3.类的直接父接口声明或者继承了一个抽象方法,并且该类没有声明或者实现该抽象方法。
     如下例所示:
     abstract class a1
     {
         public int v1;
         abstract void test();
     }
     abstract class a2 extends a1
     {
         public int v2;
     }
     class Sample extends v2
     {
         void test() { }
     }
     因为包含一个抽象方法test,类v1必须被声明为抽象类。它的子类v2继承了抽象方法test,但没有实现它,所以它 也必须声明为抽象类。然而,v2的子类Sample因为实现了test,所以它不必声明为抽象的。


注意: 如果试图创建一个抽象类的实例就会产生编译错误;
        如果一个类是非抽象类却包含一个抽象方法,就会产生编译错误;
       构造函数和静态函数以及Final修饰的函数不能使用abstract修饰符;接口缺省为abstract

 

Static修饰符
     通常,在创建类的实例时,每个实例都会创建自己实例变量。但是在变量的声明中可以使用Static修饰符,它表明该成员变量属于类本身,独立于类产生的任何对象。这种成员变量称为静态变量(静态属性)。方法的声明中也可以使用static修饰符,表明该方法从属于类本身。
     在静态成员函数中只能直接调用其它的静态成员函数或引用静态属性,否则会造成编译错误。静态成员函数中也不能使用this或者super,因为它们是和类的对象相关联的。
     静态属性和静态方法不需要创建实例就可以使用。
     典型的例子是java.lang包中的System类中的方法和变量。我们常用
     System.out.println(“message”);
     输出信息,并没有创建System的实例,是因为println方法声明为System类的静态方法,它不需创建实例就可以使用。
     下面的例子会帮助你更深刻的理解Static修饰符。注意各个代码块的加载次序。
     Class Sample
     {
         static int s1=3;
         static int s2;
         static void display()
         {
             System.out.println("s1="+s1);
             System.out.println("s2="+s2);
         }
         static
         {
             System.out.println("static block");
             S2=s1+1;
         }
         public static void main(Stringargs[])
         {
             Sample.display();
         }
     }
     一旦这个类被调用,所有的静态变量都被初始化,s1被赋为3,然后运行static块,这将打印出一段消息,并且把s2赋为s1+1,即4。然后解释器调用main成员函数,它调用了成员函数display,该函数输出s1和s2的信息。运行结果如下:
     C:\>java Sample
     static block
     s1=3
     s2=4
     通过上面的例子还可以看出,一个静态成员函数可以通过它所属的类名来调用。

final修饰符
    如果一个类是完全实现的,并且不再需要继承子类,则它可以声明为Final类。如果final类的名字出现在另一个类声明的extends字句的后面就会产生编译错误。这表明final类不能又任何的子类。类不能同时被声明为abstract和final,因为abstract类中的abstract方法永远没有机会被实现。
    在缺省情况下,所有的成员函数和实例变量都可以被覆盖。如果你希望你的变量或成员函数不再被子类覆盖,可以把它们声明为final。
     例如:
     final int MAX_VALUE = 100;
     表示,MAX_VALUE的值为100,并且不能再更改。final变量用大写标识符是一个一般的约定。

posted on 2008-06-10 16:12 汪杰 阅读(2106) 评论(1)  编辑 收藏 引用 所属分类: Java

FeedBack:
# re: Java修饰符的使用原则
2008-06-10 16:13 | 汪杰
第二次:修饰符

2.1 访问控制
封装将数据和处理数据的代码连接起来。同时,封装也提供了另外一个重要属性:访问控制。通过封装你可以控制程序的某个部分可以访问类的成员,防止对象的滥用,从而保护对象中数据的完整性。对于所有的面向对象的语言,比如C++,访问控制都是一个很重要的方面。由于Java语言使用了包的概念,使它的访问控制相对来说更复杂一些。我们把控制访问控制权限的修饰符主要分为两类,类和它的方法及变量,下面我们分别简单介绍。

-类的访问控制

->; Default:当类不使用任何访问控制修饰符时,即采用的默认的访问控制权限。它允许同一个包内的类访问,而对于它所在包以外的类则不能访问。

->; Public:允许任何包中的任何类访问,对Java里面的所有类开放。

-方法和变量的访问控制

->; Public:所有类均可以访问。

->; Private:只能被它所在的类中的成员访问,使该定义的成员对外在的类不可见。

->; Protected:可以被同一个包的类访问,另外其所有子类也可以访问。

->; Default:当成员不使用任何访问控制修饰符时,即采用默认的访问控制权限。它和Protected类似,唯一的区别在于子类访问权限,它仅允许同一个包的子类访问,而其他包中的子类则不可以访问。

2.2 其他修饰符
除了访问控制修饰符,Java还有其他繁多的修饰符来声明类、方法和变量,下面分别针对所修饰的对象来简单介绍一下主要的修饰符。

-类修饰符

->; final:用来指定该类不能被其他类扩展,从而阻止继承。

->; abstract:表示该类是不允许被实例化的类,也就是说该类需要被扩展继承。被这样声明的类也称为抽象类。

显而易见,final和abstract不能同时使用。

-方法修饰符

->; abstract:被声明的方法称为抽象方法,不含任何代码,需要其继承的子类的相应方法覆盖重载。这里需要注意的是被声明有abstract方法的类必须被声明为abstract。

->; final:声明的方法不允许被覆盖重载。

->; static:声明的方法被成为类方法,不依赖于任何的对象,不需要实例化对象即可直接使用类名来调用该方法。注意的是在该方法体内不可访问实例变量。

->; 变量修饰符

->; static:被声明为static的变量实际可以看作就是全局变量,同样不需要实例化对象即可直接使用类名来引用之。

->; final:被声明的变量的内容不可以被修改,实际可以被看作是一个常量,类似于C或者C++中的const。

2.3 缺省构造函数
我们都知道当对象被实例化的时候,构造函数总是被调用。如果我们在定义类的时候不指定一个构造函数,Java会自行创建一个不带参数的缺省构造函数。而如果我们定义有了一个构造函数,则Java不会再创建缺省构造函数。

更值得注意的是,如果子类的超类不含有不带参数的构造函数,那么子类在使用缺省构造函数就会出错,Java不会为子类创建不带参数的缺省构造函数。因此,我们在使用缺省构造函数的时候要比较小心。我们可以看如下的例子:


class Fruit {

public Fruit ( String color ) {

System.out.print ( “color = ” + color ) ;

}

}

class Apple extends Fruit {

public static void main ( String [ ] args ) {

Apple m = new Apple () ;

}

}
运行结果出错:

Fruit.java:6: No constructor matching Fruit ( ) found in class Fruit .

Class Apple extends Fruit {

1 error

2.4 合法的返回类型
由于在方法调用的时候,方法返回的类型有可能与实际声明的类型不同,因此我们需要关心什么样的返回类型才是合法的。实际上,系统采用了隐式的类型转换来处理类型的返回。以下几种情况的是合法的:

->; 如果声明的是浮点类型,那么可返回整型类型。

->; 如果声明的是整型类型,那么只要返回的整型类型范围小于或等于声明的类型,返回合法。

->; 如果声明的是对象类型,那么只要返回的是该对象类型,或者是其子类的对象类型,合法。  回复  更多评论
  
只有注册用户登录后才能发表评论。

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(15)

随笔分类(1)

随笔档案(90)

文章分类(727)

文章档案(712)

相册

收藏夹

http://blog.csdn.net/prodigynonsense

友情链接

最新随笔

搜索

  •  

积分与排名

  • 积分 - 467490
  • 排名 - 6

最新随笔

最新评论

阅读排行榜

评论排行榜