• 黑马程序员--继承


       

        继承是面向对象的核心特征之一。继承是已有类创建新类的机制。利用继承机制,可以先创建一个具有共性的一般类(父类),根据该一般类再创建具有特殊性的新类(子类),新类继承一般类的状态和行为,并根据需要增加它自己的新状态和行为。

            java语言中,java只支持单继承,但是支持多层继承。通过继承,子类拥有父类的所有成员(成员变量和成员方法),子类不仅可以定义新的成员变量和成员方法,还可以对父类中的成员变量和方法进行更改,使累的功能得到扩展你,提高了代码的复用性。


        类的继承原则:

    1)类与类之间必须存在所属关系。

    2)子类不能继承父类的构造方法。因为父类的构造方法用来创建父类对象,子类需要定义自己的构造方法,用来创建自己的对象。


    到底如何才能使用继承体系中的功能呢?先要查阅该体系中父类的描述,因为父类中定义的是该体系中的共性功能,通过了解共性功能,就可以知道该体系的基本功能。在具体调用时,要创建子类的对象,一方面是因为父类有可能不能创建对象(如,抽象了),另一方面是因为创建子类对象可以使用更多的功能。


    覆盖(重写):当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类中函数的内容,就如同父类函数被子类函数覆盖一样,就成为子类覆盖了父类方法。

    覆盖如何使用呢?

    (1)当子类继承父类时,就沿袭了父类的功能,但是子类虽具备该功能,但是功能的内容却和父类不一致,这时没必要重新定义新功能,只需保留父类的功能,重新复写该功能的方法体。

    (2)子类覆盖父类,必须保证子类的权限大于等于父类的权限,否则编译失败。

    (3)静态只能覆盖静态。


      子类通过thissuper实现对对象的引用。this是对本类对象的引用。当成员方法中没有与成员变量同名的参数时,this可以省略。但当成员方法中存在与成员变量同名的参数时,引用成员变量时其名前的this不可以省略,因为成员方法中缺省的是引用方法中的参数。super是子类对父类对象的引用,前提是父类的对象是非私有的。

    在对子类对象进行初始化时,父类的构造函数也会运行,是因为子类的构造函数默认第一行有一条隐式的语句super(),super()会访问父类中空参数的构造函数,而且子类中的所有构造函数默认第一行都是super()。那为什么子类一定要访问父类中的构造函数呢?是因为父类中的数据子类可以直接获取,所有子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。如果想要访问父类中指定的构造函数,就可以通过定义super语句的方式来访问。在这里我们需要注意的是,super语句一定要定义在子类构造函数的第一行,子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数,子类中至少有一个构造函数会访问父类中的构造函数。


    final关键字:是一个修饰符,可以用来修饰函数、变量、类。

    (1)被final修饰的类不可以被继承。

    (2)被final修饰的方法不可以被复写。

    (3)被final修饰的变量时一个常量,只能赋值一次,既可以修饰成员变量,又可以修饰局部变量。

    在描述事物时,一些数据的出现时固定的,那么这是为了增强阅读性,都给这些值起个名字,方便阅读。而这个值不需要改变,所有加上final修饰。

    (5)内部定义在类中的局部位置,只能访问该局部被final修饰的局部变量。


    抽象类:是供子类继承却不能创建实例的类。

    声明抽象类:  [权限修饰符]  abstract  类名

    {

    类体

    }

    声明抽象方法: [权限修饰符]  abstract  返回值类型  方法名(参数表);

    特点:(1)抽象方法必须定义在抽象类中。

        (2)抽象方法和抽象类都必须被abstract关键字修饰。

        (3)抽象类不可以用new创建对象,因为调用抽象方法没意义。

        (4)抽象类中的方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象。如果子类只覆盖了部分抽象方法,

    那么该类还是一个抽象类。

    如:

    //定义了一个抽象类
    abstract class Animal
    {
    	//定义抽象方法
    	abstract public void eat();
    }
    
    //定义了一个子类Cat,继承了Animal这个类
    class Cat extends Animal
    {
    	//复写抽象方法
    	public void eat()
    	{
    		System.out.println("Cat eat fish");
    	}
    }
    
    //定义了一个子类Dog,继承了Animal这个类
    class Dog extends Animal
    {
    	//复写抽象方法
    	public void eat()
    	{
    		System.out.println("Dog eat bone");
    	}
    }
    
    class AnimalDemo 
    {
    	public static void main(String[] args) 
    	{
    		//Cat c = new Cat();
    		//c.eat();
    		new Cat().eat();
    		new Dog().eat();
    
    	}
    }


    接口:是一组常量和抽象方法的集合。与抽象类相似,接口只声明抽象方法头,不给出方法体,由实现接口的类去实现所声明的抽象方法。接口是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中抽象方法全都覆盖,子类才可以实例化,否则子类是一个抽象类。

    声明接口: [public]   interface  接口名  [ extends  父类口名]

    {

    (常量)成员变量表

    (抽象)成员方法表

    }


    成员变量表中成员变量声明:[public]    [abstract]  [final]  成员变量名=常量;

    成员方法表中成员方法声明:[public] [abstract] 返回值类型 成员方法名(参数表);

    实现接口: [修饰符] class 类名 [extends 父类名] implements 接口名表

    {

    类体

    }

    一个类可以实现多个接口,各接口名之间用逗号分隔。在实现抽象方法时,需要指定public权限,否则会产生访问权限错误。


    实现接口举例:

    interface Shape1
    {
    	public static final double PI=3.14;
    	public abstract double area();
    }
    
    
     class Circle1 implements Shape1
    {
    	double radius;
    	 Circle1(double radius)
    	{
    		this.radius=radius;
    	}
    
    	 public double area()
    	{
    		return PI*radius*radius;
    	}
    }
    
    
     class ShapeDemo
    {
    	public static void main(String[] args) 
    	{
    		Circle1 c = new Circle1(4);
    		System.out.println("area="+c.area());
    	}
    }









    ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

  • 相关阅读:
    C++ 获取ms级的计时
    基于UDP的IP对IP的客户端程序
    stm32 keil生成bin文件
    xmos 加密
    DMX512程序介绍
    WS2812原理及实现
    MFC 通过按钮调用自对话框 给按钮加载位图 给对话框添加背景
    4*4矩阵键盘FPGA扫描实现
    FIFO
    Modelsim建立UVM环境
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207042.html
Copyright © 2020-2023  润新知