类的高级特征

来源:互联网 发布:数据库int 2的几次方 编辑:程序博客网 时间:2024/06/01 10:21

    static关键字用来声明成员属于类,而不是属于类的对象。static (类)变量:类变量可以被类的所有对象共享,以便与不共享的成员变量区分开来;static (类)方法:静态方法可以通过类名直接调用该方法,而不用通过对象调用。静态方法不能被覆盖成非静态。同样,非静态方法也不能被覆盖成静态方法。    
    单态设计模式,也就是说一个类只产生一个对象。那么怎么才能做到这一点呢?我们知道构造器是用来构造对象的。首先要对构造器入手。既然只产生一个对象,那么我们就干脆先一刀砍断,把构造器的访问权限定义成私有,不能在类的外面再构造该类的对象。也就是说只能在类的里面调用该类的构造器来产生对象。那么在该类里应该定义一个静态的属性,并初始化该类的一个对象。(原因是静态的东西只执行一次,也就是说该属性初始化一次。那么每次得到的应该是同一个实例)
public class A {
    int count = 1;
    private static A instance = null;
 
    private A() {  
    }
 
    public static A getClassA() {
      if (null==instance) {
      instance = new A();
    }
      return instance;
    } 
}
    Java编程语言如果使用关键字final修饰类,这个类便不能被继承。比如,类Java.lang.String就是一个 final类。这样做是出于安全原因,因为它保证,如果方法有字符串的引用,它肯定就是类String的字符串,而不是某个其它类的字符串。 
    方法也可以被标记为final。被标记为final的方法不能被覆盖。这是由于安全原因。如果方法具有不能被改变的实现,而且对于对象的一致状态是关键的,那么就要使方法成为final。被声明为final的方法有时被用于优化。编译器能产生直接对方法调用的代码,而不是通常的涉及运行时查找的虚拟方法调用。
    如果变量被标记为final,其结果是使它成为常数。想改变final变量的值会导致一个编译错误。下面是一个正确定义final变量的例子:public final int PI = 3.14。
    内部类,有时叫做嵌套类。内部类允许一个类定义被放到另一个类定义里。内部类是一个有用的特征,因为它们允许将逻辑上同属性的类组合到一起,并在另一个类中控制一个类的可视性。内部类可以访问外部类的属性和方法。你可以把内部类看作"方法"一样,在使用的时候调用执行。你也可以把内部类看作"属性"一样,在构造内部类对象的时候,也会在堆里为内部类的属性分配存储空间。所以内部类也有类似像修饰属性,方法那样的修饰符,比如:public,private,static 等等。当一个类没有用
static  关键字修饰的时候,这个内部类就叫做成员类,类似属性,方法,作为类的成员。
    内部类有如下属性:
内部类只在定义他们的代码段内可见;
内部类可以被定义在方法中。如果方法中的变量被标记为final,那么就可以被内部类中的方法访问;
内部类可以使用所嵌套类的类和实例变量以及所嵌套的块中的本地变量;
内部类可以被定义为abstract;
只有内部类可以被声明为private或protected,以便防护它们不受来自外部类的访问;
一个内部类可以作为一个接口,由另一个内部类实现;
被声明为static的内部类自动地成为顶层类。这些内部类失去了在本地范围和其它内部类中使用数据或变量的能力;
内部类不能声明任何static成员,只有顶层类可以声明static成员。因此一个需求static成员的内部类必须使用来自顶层类的成员。 

内部类的特点总结
(1)  在方法间定义的非静态内部类: 
       ● 外围类和内部类可互相访问自己的私有成员。
       ● 内部类中不能定义静态成员变量。

(2) 在方法间定义的静态内部类:
       ● 只能访问外部类的静态成员。
 
(3) 在方法中定义的局部内部类:
       ● 该内部类没有任何的访问控制权限
       ● 外围类看不见方法中的局部内部类的,但是局部内部类可以访问外围类的任何成员。
       ● 方法体中可以访问局部内部类,但是访问语句必须在定义局部内部类之后。
       ● 局部内部类只能访问方法体中的常量,即用final修饰的成员。

(4) 在方法中定义的匿名内部类:
       ● 没有构造器,取而代之的是将构造器参数传递给超类构造器。


    static变量在某种程度上与其它语言中的全局变量相似。Java编程语言没有这样的全局语言,但static变量是可以从类的任何对象访问的单个变量。当类被装载时,静态块代码只执行一次。类中不同的静态块按它们在类中出现的顺序被执行。
    如果存在继承关系,就先父类后子类;如果在类内有静态变量和静态块,就先静态后非静态,最后才是构造函数;继承关系中,必须要父类初始化完成后,才初始化子类。
    Java语言允许你在一个类中声明一些方法,然而又不实现它。这种方法叫抽象方法。包含一个或多个抽象方法的类叫做抽象类。你可以在抽象类的子类中实现抽象方法。抽象类只能被其它类继承,不能用来创建实例。
    接口是用关键字interface来定义的,接口是客户端代码与提供服务的类之间的"规约"。接口是抽象类的变体。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的使用,弥补了Java技术单继承规则的不足。一个类可以实现多个接口。接口的实现与子类相似,当类实现某个接口时,它必须定义这个接口的所有方法。
    抽象类用于部分实现一个类,再由用户按需求对其进行不同的扩展和完善;接口只是定义一个行为的规范或规定。抽象类在组件的所有实现间提供通用的已实现功能;接口创建在大范围全异对象间使用的功能。抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。抽象类主要用于设计大的功能单元;而接口用于设计小而简练的功能块。
    例如:Window窗体可以用抽象类来设计,可以把公有操作和属性放到一个抽象类里,让窗体和对话框继承自这个抽象类,再根据自己的需求进行扩展和完善。打印操作可以作为一个接口提供给每个需要此功能的窗体,因为窗体的内容不同,就要根据他们自己的要求去实现自己的打印功能。打印时只通过接口来调用,而不用在乎是那个窗体要打印。
    
 
    


















     

原创粉丝点击