Java继承的概念

来源:互联网 发布:电子秤数据倒显 编辑:程序博客网 时间:2024/05/21 19:27
//继承
//sub类是base类的子类,当sub类和base类位于同一个包中,sub类继承base类中public,protected
//和默认访问级别的成员变量和成员方法,当sub类和base类位于不同的包中,sub类继承base类中public和
//protected访问级别的成员变量和成员方法,
//public protected 默认  private
//protected 对子类和同包可见,默认 对同包可见
//java所有类都直接或间接的继承了object类,
//方法重载:方法名相同,方法的参数类型,个数,顺序至少有一项不相同,方法的返回类型可以不相同,方法的修饰符可以不相同
//方法覆盖:子类方法的名称,参数,返回类型必须与父类方法的名称,参数,返回类型一样,
//        子类不能缩小父类方法的访问权限,不然将与java语言的多态机制发生冲突
//        子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类,不然也会与多态的机制违背
//        父类的静态方法不能被子类覆盖为非静态方法,
//        子类的静态方法和父类的静态方法,方法的参数名,返回值一致,不能缩小父类方法的访问权限,不能抛出更多的异常
//        子类隐藏父类的静态方法和子类覆盖父类的实例方法的区别在于,java虚拟机把静态方法和所属的类绑定,把实例方法和所属的实例绑定,
//        例如:Base sub1 = new Sub() sub1.staticMethod(),此时调用的是父类Base的staticMethod()方法
//           而Sub sub2 = new Sub() sub2.staticMethod(),此时调用的就是子类Sub的staticMethod()方法,所以说java虚拟机会把静态方法和所属的类绑定
//        父类的非静态方法不能被子类覆盖为静态方法
//        父类的私有方法不能被子类覆盖
//        父类的抽象方法可以被子类通过两种途径覆盖,一是子类实现父类的抽象方法,而是子类重新声明父类的抽象方法
//        父类的非抽象方法可以被覆盖为抽象方法
//        super只能在构造方法或实例方法内使用,而在静态方法和静态代码块内不能使用super关键字
public class TEST2 {public static void main(String[] args) {Base who = new Sub(); // java虚拟机安装它声明的类型来处理,认为who是Base类型的引用变量,不存在subVar成员变量和subMethod方法System.out.println(who.var); // 结果输出父类的属性System.out.println(who.staticVar); // 结果输出父类的静态属性who.method(); // 结果输出子类的方法who.staticMethod(); //结果输出父类的静态方法System.out.println(((Sub)who).var);// 要访问Sub类的成员,必须通过强制类型转换Base who1 = new Base();System.out.println(((Sub)who1).var);// 对于一个引用类型的变量,java虚拟机按照它实际引用的对象类处理,这里编译通过,但是运行抛出ClassCastException运行时异常//运行时,子类的对象可以转换为父类类型,而父类类型无法转换为子类类型,Sub s = (Sub)new Base();通俗讲,父类的子类一定有,子类有的父类未必有,所以将父类的对象当做子类的类型来看,当调用s.subVar时就会报错//运行时,通过引用类型变量来访问所引用对象的方法和属性时,java采用以下规则,实例方法与引用变量实际引用的对象的方法绑定,属于动态绑定//静态方法与引用变量所申明的类型的方法绑定,属性静态绑定,成员变量(包括静态变量与实例变量)与引用变量所申明的类型的成员变量绑定,这种绑定属于静态绑定,//进程打破了封装,所以尽量封装父类的实现细节,也就是把实现细节的属性和方法定义为private类型,如果某些细节必须被子类访问,可以把包含这种实现细节定义为protected类型,//当子类调用父类的protected类型的方法,可以看做父类仅向子类但不对外开放的接口,子类也可以修改父类的protected方法,还有就是把不允许子类覆盖的方法定义为final类型//父类的构造方法不允许调用可被子类覆盖的方法,总之父类尽量将一些不能外入的内容定义为private或final//组合关系和继承关系,前者不会破坏封装,但是比后者要创建更多的对象,创建组合关系,在创建整体类的实例时,必须创建其所有局部类的实例//对于继承关系,创建子类的实例时,无需创建父类的实例,//在继承关系中,子类能够自动继承父类的属性和方法,和继承相比,组合关系的缺点是整体类不会自动获得局部类的接口。}}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");} //静态方法}class Sub extends Base{String var = "SubVar";static String staticVar = "StaticSubVar";void method(){System.out.println("Sub method");}static void staticMethod(){System.out.println("Static Sub method");}String subVar = "Var only belonging to SUb"; // 子类自己的属性void subMethod(){System.out.println("Method only belonging to Sub");} //子类自己的方法}

0 0
原创粉丝点击