目标黑马,我的自学之路:第四章 面向对象(下)

一、面向对象三大特征之继承

       1、继承的优点:(1)提高了代码的复用性(2)让类与类之间产生了关系,才有了多态的特性。

       Java语言中只支持单继承,不支持多继承,因为多继承容易带来安全隐患,如果子类继承多个父类,而多个父类中有相同名称的函数但功能内容不同时,子类不能确定运行哪个函数,与此同时,java通过多实现的方式实现多继承的功能,java也支持多层继承。如果我们要使用一个继承体系中的功能,那么我们要查阅体系父类的功能,因为父类定义的是该体系共性功能,就可以知道该体系的基本功能,那么这个体系就可以基本使用了,在具体使用时要创建子类对象,因为父类可能不能创建对象,再者创建子类对象我们可以使用更多的功能,既可以使用共性功能,也可以使用子类的特有功能。

        在继承中,对于变量,如果子父类中出现了非私有的同名成员变量时,子类要访问本类的变量用this,访问父类的用super,this代表的是本类对象的引用,super代表的是父类对象的引用。对于成员方法,当子父类中出现了一模一样的函数时,子类对象调用该函数,会运行子类函数的内容,如同父类的函数被覆盖了一样,这种情况就是函数的重写(覆盖),它和重载的区别在于,重载只是函数名相同,比较的是参数列表,而重写则要求函数一模一样,覆盖要注意的是子类覆盖父类必须保证子类权限大于等于父类权限,同时静态只能覆盖静态。对于构造函数,在子类对象进行初始化时,父类的构造函数也会运行,因为子类的所有构造函数第一行都有一条隐性的super语句,会访问父类空参数的构造函数。子类的实例化过程是子类的所有构造函数默认都会访问父类空参数的构造函数,当父类没有空参数的构造函数时,必须手动通过super语句指定访问的父类构造函数,子类也可以通过this语句来访问本类中的构造函数,但至少有一个构造函数会访问父类的构造函数。

       2、final关键字:意为最终,是一种修饰符,它可以修饰类、变量、函数,被final修饰的类不可以被继承,被final修饰的变量是一个常量,自能赋值一次,既可以修饰成员变量,也可以修饰局部变量,被final修饰的方法不可以被重写,内部类定义在类中的局部位置时,只能访问类中被final修饰的局部变量。

       3、抽象类:当多个类中定义了相同功能,但功能的主体不同,这时就可以进行抽取,但只抽取功能定义,不抽取功能内容,这样就产生了抽象方法,而抽象方法必须放在抽象类中,抽象类的特点就是抽象方法必须定义在抽象类中,抽象方法和抽象类都必须被abstract关键字修饰,抽象类不可以用new的形式创建对象,因为抽象方法没意义,抽象类中的方法必须要由子类复写其所有的抽象方法后建立子类对象才能调用,如果子类只覆盖部分抽象方法,那么子类也是一个抽象类。

       抽象类和一般类没有太大的不同,只不过抽象类中有一些抽象的东西,这也是该类的功能,但无法定义主体,抽象类只是比一般类多了抽象方法,因此抽象类也不可实例化。但抽象类也可以不定义抽象方法,这样可以达到不让该类创建对象的目的。

       4、接口:接口可以认为是一种特殊的抽象类,当抽象类中的方法都是抽象的,那么该类可以通过接口来实现,接口中定义的变量都是常量,修饰符为public static final,方法的修饰符为public abstract,和抽象类一样,接口也是不可以闯将对象的,接口的特点是接口是对外暴露的规则,接口是程序的功能扩展,降低了偶合性,类与接口是实现关系,而且类可以在继承一个类的同时实现多个接口,接口与接口之间是继承关系。

       抽象类与接口的比较:抽象类和接口都不能创建对象,抽象类是用class定义,只是加上了abstract修饰符,接口是interface定义,抽象类中的成员修饰符不固定,且不能省略,接口中的成员修饰符是固定的且可以省略,抽象类中可以不定义抽象方法,接口中全是抽象方法,抽象类被继承,接口被实现。

二、,面向对象三大特征之多态

        1、多态可以理解为事物存在的多种形态,重载和覆盖是函数的多态性体现,多态在类中的体现是父类的引用可以指向自己的子类对象,父类的引用也可以接受自己的子类对象,由此可以,要想实现多态,类与类之间必须有关系,要么继承,要么实现,通常还有一个前提既存在覆盖,多态的好处是提高了扩展性,弊端是只能使用父类的引用访问父类中的成员。

         多态注意事项:对于变量,无论编译或者运行都参阅引用型 变量所属的类,对于成员函数,如果是非静态的,则在编译时参阅引用型变量所属类中是否有调用的方法,如果有编译成功,如果没有,编译失败,在运行时期参阅对象所有的类中的是否有调用的方法,如果是静态的,则都参阅引用型变量所属的类。

        2、内部类:将一个类定义在另一个类里面,那么这个类就叫内部类(内置类、嵌套类),

        内部类访问规则 :(1)内部类可以直接访问外部类中的成员,包括私有,因为内部类中持有外部类的引用,格式为外部类名.this。外部类访问内部类需要建立内部类对象

                                     (2)当内部类定义在外部类成员位置而且非私有时,可在外部类以外的其他类中直接建立内部类对象,格式为:外部类名.内部类名  变量名=外部类对象.内部类对象,因为内部类在成员位置上,因此可以被private、static修饰符所修饰,如果内部类被static修饰,那么只能访问外部类中被static修饰的成员,如果内部类中定义了静态成员,那么该内部类也必须是静态的,如果外部类中的静态方法访问了内部类,那么内部类也必须是静态的。

                                   (3)当内部类定义在局部位置时,内部类可以直接访问外部类成员,因为还持有外部类的引用,但只能访问局部中被final修饰的局部变量。

        匿名内部类是内部类 的简写格式,定义内部类的前提是内部类必须实现一个接口或者继承一个类,格式为new 父类或者接口名(){},其实匿名内部类就是一个匿名子类对象,可以理解为带内容的对象,匿名内部类中定义的方法最好不要超过3个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值