zoukankan      html  css  js  c++  java
  • java继承机制

    1 继承  关键字:extends   java没有多重继承

    实例

    父类:
    
    package unit4;
    
    public class Base {
        public int publicVarofBase=1;
        private int privateVarofBase=1;
        int defaultVarofBase=1;
        protected void methodOfBase() {
            System.out.println("执行父类的方法");
        }
        
        
    }
    
    
    子类:
    
    package unit4;
    
    public class Sub extends Base{
        public void methodOfSub() {
            System.out.println("执行子类的方法");
            publicVarofBase=2;
            defaultVarofBase=2;
            privateVarofBase=2;
            methodOfBase();
        }
        public static void main() {
            Sub sub =new Sub();
            sub.publicVarofBase=3;
            sub.privateVarofBase=3;
            sub.defaultVarofBase=3;
            sub.methodOfSub();
            sub.methodOfBase();
        }
    }

    继承的说明:

    子类可以继承父类的东西:

    1.当子类和父类在同一个包中时,子类继承父类的:public、protected、默认 访问级别的成员变量和成员方法。

    2、当子类和父类在不同的包时,子类继承父类:public、protected 访问级别的成员变量和成员方法。

    所有的类都直接或间接的继承了java.lang.Object类。

    super关键字

    super关键字代替匪类对象,通过super可以访问被子类覆盖了的方法或隐藏了的属性。

    在一下情况一般会用super关键字:

    1 在类的构造方法中,通过super语句调用这个类的父类的构造方法

    2 在子类中访问父类的被屏蔽的方法和属性

    注意:在子类的构造方法中通过super()条用父类的构造方法,则此调用必须出现在子类构造方法可执行语句的第一句。

    如果没有明确地调用父类的构造方法,编译器会自动加一条调用匪类的默认构造方法,所以一般建议对每一个类都给一个默认的构造方法。

    方法覆盖和属性隐藏

    package unit4;
    
    public class SuperClass {
        int a;
        public SuperClass() {
            // TODO Auto-generated constructor stub
            a=10;
        }
        public void printA() {
            // TODO Auto-generated method stub
            System.out.println("父类中的A:"+a);
            
        }
        
    
    }





    package unit4;

    
    

    public class SubClass extends SuperClass {
    int a;
    public SubClass(int a) {
    // TODO Auto-generated constructor stub
    this.a=a;
    }
    public void printA(){
    System.out.println("父类中的A:"+super.a);
    System.out.println("子类中的A:"+a);
    }

    
    

    }

    package unit4;

    public class OverrideDemo {
    public static void main(String[] args) {
    SuperClass c1=new SubClass(20);
    c1.printA();

    }

    }

    父类中的A:10
    子类中的A:20

     
    package unit4;
    
    public class Base {
        String var ="Base's Variable";
        void method(){
            System.out.println("call Base's method");
        }
    
    }




    package unit4;

    
    

    public class Sub extends Base{

    
    

    String var ="Sub's variable";
    void method(){
    System.out.println("Sub's method call");
    }
    void test(){
    String var = "local variable";
    System.out.println("var is "+ var);
    System.out.println("this .var is "+ this.var);
    System.out.println("super.var is "+super.var);
    method();
    this.method();
    super.method();
    }
    public static void main(String[] args) {
    Sub sub =new Sub();
    sub.test();
    }
    }

    var is local variable
    this .var is Sub's variable
    super.var is Base's Variable
    Sub's method call
    Sub's method call
    call Base's method

     

    java继承中注意:

    1 构造方法不能被继承

    2 private类型的成员变量和成员方法不能被继承

    3 覆盖方法时不能缩小父类方法的访问权限,但可以扩大

    4 覆盖方法时不能抛出比父类方法更多的异常

    5 不能将静态方法覆盖为非静态方法,也不能将非静态方法覆盖为静态方法

    6 由于私有方法不能继承,所以不存在覆盖问题。

    final关键字、abstract关键字

    final关键字 

    修饰的类不能被继承,派生子类

    修饰的方法不能被重写

    修饰的变量不允许修改

    abstract关键字

    abstract可以修饰类和方法,分别成为抽象类和抽象方法

    抽象类相当于一个半成品,需要子类继承并覆盖其中的抽象方法,这样子类才能创建实例

    抽象方法没有实现代码,由子类实现。

    使用规则:

    1 抽象类中可以没有抽象方法。不管类定义时有没有abstract关键字修饰,只要包含了抽象方法,就自动变为抽象类。

    2 没有抽象的构造方法,也没有抽象的静态方法

    3 抽象类和抽象方法不能被final修饰符修饰,但是抽象类可以包含final方法

    inerface关键字和接口

    java的接口中只存在公有抽象的方法和公有静态的常量。

    不管是否明确添加相应的修饰符,java编译器都会自动给加上相应的修饰符。

    接口可以继承,并且可以多重继承。

    通过implements声明自己实现了一个或多个接口

    package unit4;
    
    import com.sun.java_cup.internal.internal_error;
    
    interface Computable {
    
        int M=10;
        int f(int x);
        public abstract int g(int x,int y);
    }
    
    
    package unit4;
    
    import com.sun.java_cup.internal.internal_error;
    
    public class A implements Computable {
        
        public int f(int x){return M+2*x;}
        public int g (int x,int y){return M*(x+y);}
    
    }
    
    
    package unit4;
    
    public class B implements Computable{
        public int f(int x){return x*x*x;};
        public int g(int x,int y){return x*y*M;}
    
    }
    
    
    package unit4;
    
    import sun.net.www.content.image.gif;
    
    public class interfacedemo {
        public static void main(String[] args) {
            A a=new A();
            B b =new B();
            System.out.println(a.M);
            System.out.println(" "+a.f(20)+", "+a.g(12,2));
            System.out.println(b.M);
            System.out.println(" "+b.f(20)+" "+b.g(12,2));
        }
    
    }

    接口中所有的方法必须是抽象的,接口中的方法定义默认为public abstract类型的,接口中的成员变量的类型默认为public static final。

    接口与抽象类之间的区别:

    1 抽象类可有构造方法

    2 抽象类中可有普通的成员变量

    3 抽象类中可有非抽象的普通方法

    4 抽象类中可有静态的方法

    5 抽象类中的静态成员变量类型可以任意,接口中的只能是public static final型

    6 一个类可以实现多个接口,但是只能继承一个抽象类

  • 相关阅读:
    ajax的原理及实现方式
    在linux中添加环境变量
    ftp简单命令
    linux命令之scp
    java中创建对象的方法
    10个调试技巧
    java读取.properties配置文件的几种方法
    Java对象和XML转换
    Java Float类型 减法运算时精度丢失问题
    Java内存分配全面浅析
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/5697678.html
Copyright © 2011-2022 走看看