----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
在前面就讲过了面向对象的三大特征:封装、继承、多态,封装在上文中已经讲过了,现在说一说继承吧
继承
定义:多个类中存在相同的属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无需再定义这些属性和行为了,只要继承这个类就可以了,这里面的多个类称为子类,单独的这个类称为父类或者超类,子类可以直接访问父类中的非私有的属性和行为,通过extends关键字让类与类之间产生继承关系
继承的优点:提高代码复用性,正因为有了子父类的继承也就有了多态的特性
注意:必须类与类有所关系才能继承,父类其实就是由多个类不断向上抽取共性内容而来的.
Java中只允许单继承,不能多继承如果想多继承那就可以用多实现,原因就是多继承容易带来安全隐患,多继承会使子类继承错乱
JAVA虽然不是多继承,但支持多层继承,也就是一个继承体系
class A{}//父类
class B extends A{}//子类B继承父类A
class C extends B{}//子类C继承父类B也就是A类的孙类
那如何使用继承体系功能呢?
想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。
通过了解共性功能,就可以知道该体系的基本功能。那么这个体系已经可以基本使用了
查阅父类功能,创建子类对象使用功能
class A//父类
{
void show()
{
System.out.println("a");
}
}
class B//父类
{
void show()
{
System.out.println("b");
}
}
class C extends A,B//子类同时继承父类A,B这是不行了,所以程序会失败
{}
C c = new C();
c.show();
父类与子类的关系(代码显示):
class Person//父类
{
String name;
int age;
}
class Student extends Person //学生子类继承父类
{
void study()
{
System.out.println("good study");
}
}
class Worker extends Person //工人子类继承父类
{
void work()
{
System.out.println("good work");
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Student s = new Student(); //创建子类对象来调用父类属性和方法
s.name = "zhagnsan";
}
}
super关键字
super关键字的用法和this相同,
它俩的区别在于:
this代表着本类的应用,super代表着父类的应用
当子父类出现相同的变量或者相同的方法时可以用Super来区分而子类要调用父类构造函数时可以使用Super语句
函数的覆盖(override)
覆盖也叫做重写,主要是在子父类出现一模一样的方法,
但值得注意的是父类私有方法不可以被覆盖,子类覆盖方法中继续使用被覆盖的方法可以通过super函数名获取,静态只能覆盖静态
子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败.
this和super不能在同一个构造函数中,因为都要第一时间初始化,都要位于第一行
当子类自定义父类的某方法时,可以重写父类中的方法
子类实例化的过程
子类中所有的构造函数默认都会访问父类中空参数的构造函数,因为每一个构造函数的第一行都有一条默认的语句super();
当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。
this:代表是本类类型的对象引用,super代表的是父类中的内存空间引用
class Fu
{
private int num = 4;
public void setNum(int num)
{
this.num =num;
}
public int getNum()
{
return this.num;
}
}
class Zi extends Fu //继承
{
int num = 5;
void show()
{
System.out.println(num);
}
}
class ExtendsDemo2
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show();
System.out.println(z.num+"...."+z.num);
}
}
图解:
当一个类的功能内容需要修改时,可以通过覆盖来实现
子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();
super语句一定定义在子类构造函数的第一行。
如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。
如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。
重载与重写
重载需要看同名函数的参数列表,重写:子父类方法要一模一样
final关键字
final : 作为一个修饰符可以修饰类,函数,变量。
被final修饰的类不可以被继承。为了避免被继承,被子类复写功能,被final修饰的方法不可以被覆盖
被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,有可以修饰局部变量,内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。
注意:用final修饰的常量名称定义时,有规范,所有字母都大写,如果由多个单词组成,单词间用 _ 连接
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------