---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ---------------------
继承是面向对象的核心特征之一。继承是已有类创建新类的机制。利用继承机制,可以先创建一个具有共性的一般类(父类),根据该一般类再创建具有特殊性的新类(子类),新类继承一般类的状态和行为,并根据需要增加它自己的新状态和行为。
在java语言中,java只支持单继承,但是支持多层继承。通过继承,子类拥有父类的所有成员(成员变量和成员方法),子类不仅可以定义新的成员变量和成员方法,还可以对父类中的成员变量和方法进行更改,使累的功能得到扩展你,提高了代码的复用性。
类的继承原则:
(1)类与类之间必须存在所属关系。
(2)子类不能继承父类的构造方法。因为父类的构造方法用来创建父类对象,子类需要定义自己的构造方法,用来创建自己的对象。
到底如何才能使用继承体系中的功能呢?先要查阅该体系中父类的描述,因为父类中定义的是该体系中的共性功能,通过了解共性功能,就可以知道该体系的基本功能。在具体调用时,要创建子类的对象,一方面是因为父类有可能不能创建对象(如,抽象了),另一方面是因为创建子类对象可以使用更多的功能。
覆盖(重写):当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类中函数的内容,就如同父类函数被子类函数覆盖一样,就成为子类覆盖了父类方法。
覆盖如何使用呢?
(1)当子类继承父类时,就沿袭了父类的功能,但是子类虽具备该功能,但是功能的内容却和父类不一致,这时没必要重新定义新功能,只需保留父类的功能,重新复写该功能的方法体。
(2)子类覆盖父类,必须保证子类的权限大于等于父类的权限,否则编译失败。
(3)静态只能覆盖静态。
子类通过this和super实现对对象的引用。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>、期待与您交流! ----------------------
来源:https://www.cnblogs.com/java20130722/p/3207042.html