[类的修饰字] class 类名称 [extends 父类名称][implements 接口名称列表]
{
变量定义及初始化;
方法定义及方法体;
}
类的修饰字: [public] [abstract | final]
缺省方式为 friendly
继承性是面向对象程序设计语言的另一基本特征,通过继承可以实现代码的复用。继承而得到的类为子类,被继承的类为父类,父类包括所有直接或间接被继承的类。Java中不支持多重继承。通过在类的声明中加入extends子句来创建一个类的子类:
class SubClass extends SuperClass
{
……
}
如果缺省extends子句,则该类为java.lang.Object的子类。
子类可以继承父类中访问权限设定为public、 protected、 default的成员变量和方法,但是不能继承访问权限为private的成员变量和方法。
在一个类的内部声明的类,称为内嵌类。
内嵌类只能在包含它的类中使用,同时它可以看作是该包含类的一段特殊代码,可以直接使用该包含类的变量和方法。内嵌类编译后也会形成一个单独的class,但它附属于其包含类。
public class Stack {
private Vector items;
...//code for Stack's methods and constructors not shown...
public Enumeration enumerator() {
return new StackEnum();
}
class StackEnum implements Enumeration {
int currentItem = items.size() - 1;
public boolean hasMoreElements() {
return (currentItem >= 0);
}
public Object nextElement() {
if (!hasMoreElements()) throw new NoSuchElementException();
else return items.elementAt(currentItem--);
}
}
}
每个类都拥有自己的名字空间,即指类及其方法和变量可以在一定的范围内知道彼此的存在,可以相互使用。对类而言:
abstract类:不能直接产生属于这个类的对象;
final类:不能被其他任何类所继承(安全的考虑);
public类:不但可以被同一程序包(package)中的其它类使用,别的程序包中的类也可以使用;
friendly类(缺省,包访问类):只能被本程序包中的其它类使用,不能被别的程序包中的类使用。
当一个类可以被访问时,对类内的成员变量和成员方法而言,其应用范围可以通过施以一定的访问权限来限定。
同一个类中 同一个包中 不同包中的子类 不同包中的非子类(任意类)
private ★
default ★ ★
protected ★ ★ ★
public ★ ★ ★ ★
public: 任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。
protected:同一类,同一包可以使用。不同包的类要使用,必须是该类的子类。
private:不允许任何其他类存取和调用。
friendly(default,前边没有修饰字的情况):在同一程序包中出现的类才可以直接使用它的数据和方法.
当子类中的变量名与父类的相同,父类的变量被遮盖。
final在类之前
表示该类是最终类,不能再被继承。
final在方法之前
表示该方法是最终方法,该方法不能被任何派生的子类覆盖。
final在变量之前
表示变量的值在初始化之后就不能再改变;相当于定义了一个常量。
static 在变量或方法之前,表明它们是属于类的,称为类方法(静态方法)或类变量(静态变量)。若无static修饰,则是实例方法和实例变量。
类变量在各实例间共享
类变量的生存期不依赖于对象,相当于C语言中全局变量的作用。其它类可以不用通过创建该类的实例,直接通过类名访问它们。
同一个类的实例方法可以访问该类的类变量和类方法;
而类方法只能访问该类的类变量和类方法,不能直接访问实例的变量和方法。
同一个类的实例方法可以访问该类的类变量和类方法;
而类方法只能访问该类的类变量和类方法,不能直接访问实例的变量和方法。
不正确的引用
class StaticError
{
String mystring=“hello”;
public static void main(String args[])
{
System.out.println(mystring);
}
}
编译时错误信息: nonstatic variable mystring cannot be referenced from a static context “System.out.println(mystring);”。
为什么不正确:只有对象的方法可以访问对象的变量。
解决的办法
1. 将变量改成类变量
class NoStaticError
{
static String mystring=“hello”;
public static void main(String args[])
{
System.out.println(mystring);
}
}
2. 先创建一个类的实例
class NoStaticError
{
String mystring=“hello”;
public static void main(String args[])
{
NoStaticError noError;
noError = new NoStaticError();
System.out.println(noError.mystring);
}
}
抽象类:用abstract关键字来修饰一个类时,该类叫做抽象类;
抽象类必须被继承。
抽象类不能被直接实例化。它只能作为其它类的超类,这一点与最终类(final类)正好相反。
抽象方法:用abstract来修饰一个方法时,该方法叫做抽象方法。
抽象方法必须被重写
抽象方法只有声明,不能有实现。
定义了抽象方法的类必须是抽象类。
abstract returnType abstractMethod ( [paramlist] );