java基础知识

1、继承:在java中使用extends关键字用来标示一个类继承了另一个类,例如:

public class Sub extends Base(){.....}

Sub类继承了Base类如下的信息(按情况而不同):

(1)当Sub类和Base类位于同一个包中:Sub类继承了Base类中的public,protected和默认访问级别的成员变量与成员方法。

(2)当Sub类和Base类位于不同的包中时:Sub类继承了Base类中的public,protected访问级别的成员变量与成员方法。

2.方法重载:

重载方法必须满足一下条件:

(1)方法名相同;

(2)方法的参数类型,个数,顺序至少有一项不同;

(3)方法的返回类型可以不相同

(4)方法的修饰符可以不相同 说明方法的签名是按:名称+参数依次类型确定的

3.方法覆盖:如果子类中定义的一个方法,其名称、返回值既参数签名正好与父类中某个方法的名称,返回值类型既参数签名相匹配,那么说明,子类的方法覆盖了父类的方法。

覆盖方法必须满足多种约束:

(1)子类方法的名称、参数签名和返回值类型必须与父类方法的名称、参数签名和返回类型一样

(2)子类方法不呢过缩小父类方法的访问权限。

(3)子类方法不能抛出比父类方法更多的异常。子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类。

(4)方法覆盖只能存在在子类和父类,在同一个类中,只能是重载,不能是覆盖

(5)父类的静态方法不能被子类覆盖为非静态方法。

(6)子类可以定义与父类的静态方法相同名的静态方法,一遍在子类中隐藏父类的静态方法。

(7)父类的非静态方法不能被子类覆盖为静态方法

(8)父类的私有方法不能被子类覆盖:子类方法覆盖父类方法的前提是,子类必须能继承父类的特定方法

(9)父类的抽象方法可以被子类通过两种途径覆盖:一是,子类实现父类的抽象方法;二是,子类重新声明父类的抽象方法。

public abstract class Base{
    abstract void method1();
    abstract void method2();
}
public abstract class Sub extends Base{
    public void method1(){....}//实现method1()方法,并扩大访问权限
    public abstract void method2(); //仅扩大访问权限
}

(10)父类的非抽象方法可以被覆盖成抽象方法。

 4、多态:当系统A访问系统B的服务时,系统B可以通过多种实现方法来提供方法,而这一切对于系统A是透明的。

(1)对于一个引用类型的变量,java编译器按照它声明的类型来处理。

(2)对已一个引用类型的变量,运行时java虚拟机按照它实际引用的对象来处理。

(3)在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,java虚拟机采用以下的绑定规则:

a.实例方法与引用变量实际所引用的对象的方法绑定,这种绑定属入动态绑定,因为是在运行时由java虚拟机动态决定的;

b.静态方法与引用变量所声明的类型的方法绑定,这种绑定属入静态绑定,是在编译时被做了绑定;

c.成员变量(静态变量与实例变量)与引用变量所声明的类型的成员变量绑定,是在编译时被做了绑定,属于静态绑定。

class Base{
    String var="Basevar";
    static String staticVar="StaticBasevar";
    void method()
    {
        System.out.println("Base method");
    }
    static void staticmethod()
    {
        System.out.println("static base method");
    }
}

public class Sub extends Base{
    String var="subVar";
    static String staticVar="Static sub var";
    void method()
    {
        System.out.println("sub method");
    }
    static void staticmethod()
    {
        System.out.println("static sub method");
    }
    String subVar="Var only for sub";
    void subMethod()
    {
        System.out.println("method only for sub");
    }
    public static void main(String[] args)
    {
        Base who=new  Sub();
        System.out.println("who.var="+who.var);
        System.out.println("who.Staticvar="+who.staticVar);
        who.method();
        who.staticmethod();
    }
}

运行结果:

who.var=Basevar
who.Static=varStaticBasevar
sub method
static base method

动态绑定的思想:在运行时环境中,当通过B类的实例去调用一系列的实例方法(包括一个方法调用的另一个方法),将先优先和B类本身包含的实例方法动态绑定,如果类B没有定义这个实例方法,才会与从父类A中继承来的实例方法动态绑定。

class A{
    void method()
    {
        System.out.println("Base");
    }
    void test()
    {
        method();
    }
}
public class B extends A{
    void method(){System.out.println("Sub");}
    public static void main(String[] args)
    {
        new A().test();
        new B().test();
    }
}

结果:

Base

Sub

5.java中的修饰符:

修饰顶层类的修饰符包括abstract、public 、final而static,protected和private不能修饰顶层类。成员方法和成员变量可以有多种修饰符,而局部变量只能用final修饰。

6.使用abstract修饰符需要注意:

(1)抽象类可以没有抽象方法,但是包含了抽象方法的类必须被定义为抽象类,如果子类没有全部实现抽象父类中的抽象方法,那么子类也必须被定义为抽象类。

(2)没有抽象构造方法,也没有抽象静态方法。

(3)抽象类中可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法。

final不能用来修饰构造方法。

final变量具有如下特征:

(1)final修饰符可以修饰静态变量、实例变量和局部变量,分别表示静态常量,实例常量,局部常量。

(2)final变量都必须显示的被初始化。

静态方法必须被实现,换句话说,一个静态方法不能被定义成abstract的。

 

posted @ 2012-12-20 21:50  黎明露珠  阅读(184)  评论(0编辑  收藏  举报