黑马程序员-JAVA面向对象之继承


----------- 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学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值