zoukankan      html  css  js  c++  java
  • 详解java继承

    继承体现的关系: 继承体现is-a关系,例如:B是一个A,则可用继承表示二者关系。

    继承的作用:将所有子类共有的属性和方法定义在父类中,子类通过继承获得这些属性和方法,实现代码复用。

    java中继承的关键字:extends

    语法:

    [public|abstract|final] class B extends A{

    非内部类的修饰符只有三种,或者不加修饰符。

    1、java中继承的特点:

    1.1、单一继承:一个子类只能继承一个父类;一个父类可以有多个子类。

    class A {}
    
    class B extends A{}
    
    class C extends A{}
    
    class D extends A,B{} //报错,因为只能继承一个父类
    

    1.2、Object是所有类的根,假如一个类没有写extends,则默认继承Object。

    1.3、继承可以传递:子类可以获得所有父类(直接或间接)的属性和方法。

    当属性和方法存在同名问题时,具体使用的是谁的方法和属性,要具体分析,详情参考java的多态特性:详解java多态;

    2、继承中的构造函数问题(本章重点):

    2.1在子类的构造函数中,调用父类的构造函数

    分为三种情况:

    2.1.1 在子类构造函数的第一行,用super(参数列表)调用父类的某个构造函数,或者用this(参数列表)调用自己的某个构造函数。

    public class Test extends TestB{
    	public static void main(String[] args){
    		B b = new B();//实例化一个B类对象
    	}
    }
    
    class A {
    	public A(){
    		System.out.println("A的无参构造");
    	}
    	public A(int a){
    		System.out.println("A的含参构造" + a);
    	}
    }
    
    
    class B extends A{
    	public B(){
    		this(10);
    		System.out.println("B的无参构造");
    	}
    	
    	public B(int a){
    		super(20);
    		System.out.println("B的含参构造" + a);
    	}
    }
    
    输出结果为:
    A的含参构造20
    B的含参构造10
    B的无参构造

    2.1.2 super()的隐式调用:假如构造函数中第一行没有写super()或者this(),此时编译器会添加一个隐式的super(),递归调用父类的无参构造函数,直到Object。

    public class Test extends TestB{
    	public static void main(String[] args){
    		B b = new B();
    	}
    }
    
    class A {
    	public A(){
    		System.out.println("A的无参构造");
    	}
    	public A(int a){
    		System.out.println("A的含参构造" + a);
    	}
    }
    
    class B extends A{
    	public B(){
    		System.out.println("B的无参构造");
    	}
    	
    	public B(int a){
    		System.out.println("B的含参构造" + a);
    	}
    }
    
    输出结果为:
    A的无参构造
    B的无参构造

    2.1.3如果父类没有无参构造函数,那么它也不能有   含参构造函数。(注意这句话的两个条件:1.它是个父类  2.它没有无参构造函数)

    public class Test extends TestB{
    	public static void main(String[] args){
    		B b = new B();
    	}
    }
    
    class A {
    }
    
    class B extends A{
    	public B(){
    		System.out.println("B的无参构造");
    	}
    	
    	public B(int a){
    		System.out.println("B的含参构造" + a);
    	}
    }
    输出结果为:
    B的无参构造
    

    特别注意:如果A类加上一个含参构造函数,子类继承时会报错

    class A {
    	public A(int a){
    		System.out.println("A的含参构造" + a);
    	}
    }
    
    class B extends A{
    	public B(){ //报错:A()没有定义
    		System.out.println("B的无参构造");
    	}
    	
    	public B(int a){ //报错:A()没有定义
    		System.out.println("B的含参构造" + a);
    	}
    }
    3、abstract抽象类

    语法:

    [public] abstract class C{  
    	[public|protected] abstract void say();  //默认是protected
    }

    用法:

    abstract class C{ //抽象类C
    	public abstract void say(); //public 修饰的抽象方法
    	protected abstract A show(); //protected修饰的抽象方法
    public void laugh(){      //非抽象方法
    System.out.println("哈哈哈");
    }
    }
    
    class D extends C{ //继承抽象类,必须实现抽象类中所有的抽象方法
    
    	@Override
    	public void say() { //抽象类中,该方法为public,则子类中只能为public
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public A show() {  //由于抽象类中,该方法为protected,所以子类中可以为public或者protected
    		// TODO Auto-generated method stub
    		return null;
    	}
    }

    注意:abstract不能与private、static同用。

    4、final 最终类
    final修饰的类不能再被继承。
  • 相关阅读:
    使用 Spring 2.5 注释驱动的 IoC 功能
    分页、排序SQL 通用存储过程(转)
    MySQL中group_concat函数
    文本内容分页
    jQuery Pagination Ajax分页插件中文详解(转)
    Cesium组件:Cesiumdraw,基于Vue开发的Cesium基础标绘插件
    tileset格式详解Part2
    css实现div的隐藏
    eltable不透明度&边框
    1rem,1em,1vh,1px含义
  • 原文地址:https://www.cnblogs.com/mengfff/p/6764787.html
Copyright © 2011-2022 走看看