黑马程序员——面向对象(二)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.       继承

优点:

           提高了代码的复用性

           让类与类之间产生了关系,有了这个关系,才有了多态的特性

java语言中:java只支持单继承,不支持多继承,因为多继承容易带来安全隐患

 

子父类出现后,类成员的特点:

1.       变量

如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this,子类要访问父类中的同名变量,用super

2.       函数

当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容,如同父类的函数被覆盖一样

覆盖:

1.       子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败

2.       静态只能覆盖静态

3.       构造函数

在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();

super():回访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super()。

■为什么子类一定要访问父类中的构造函数

因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类时如何对这些数据进行初始化的,所以子类在对象初始化时,要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定

PS:super一定定义在子类构造函数的第一行(初始化动作要先做)

■结论:

子类的所有构造函数,默认都会访问父类中空参的构造函数

因为子类每一个构造函数内的第一行都有一句隐式super()

 

当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形式来指定要访问的构造函数

2.       final关键字

final可以修饰类,方法,变量

           final修饰的类不可以被继承

           final修饰的方法不可以被覆盖

           final修饰的变量是一个常量。只能被赋值一次,作为常量:常量的书写规范所有字母都大写,如果由多个单词组成,单词间通过_连接

           内部类只能访问被final修饰的局部变量

3.       抽象类

■当多个类中出现相同功能,但是功能主体不同,这是可以进行向上抽取,这是,只抽取功能定义,而不抽取功能主体

■    抽象类的特点

    ⑴抽象方法一定在抽象类中

           ⑵抽象方法和抽象类都必须被abstract关键字修饰

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

           ⑷抽象类中的方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用,如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象方法

 

           抽象类比一般类多了个抽象函数

           抽象类不可以实例化

特殊:抽象类中可以不定义抽象方法,仅仅是不让该类建立对象

 

 

■模板方法设计模式

    在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这是就将不确定的部分暴露出去,由该类的子类完成

4.       接口

           ■格式

    interface()

■接口中的成员修饰符是固定的

    成员常量:public static final

    成员函数:public abstract

■接口的出现将“多继承”通过另一种形式体现出来,即“多实现”

当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示

■接口:是不可以创建对象的,因为有抽象方法,需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化,否则子类是一个抽象类

■类与类之间,继承

  类与接口之间实现

  接口与接口之间,继承

■特点:

    接口是对外暴露的规则

    接口是程序的功能扩展

    接口可以用来多实现

    类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口

    接口与接口之间可以有继承关系

    接口的出现降低了耦合性

5.       多态

定义:某一类事物的多种存在形态

■多态的表现

    父类的引用指向了自己的子类对象

    父类的引用也可以接受自己的子类对象

 

■多态的前提

    必须是类与类之间有关系。要么继承,要么实现

    通常好友一个前提,就是存在覆盖

■多态的好处

    多态的出现大大提高了程序的扩展性

■多态的弊端

    提高了扩展性,但是只能使用父类的引用访问父类中的成员

■多态的应用

    ◆在多态中非静态成员函数的特点:

        在编译时期:参阅引用型变量所属的类中是否有调用的方法,若果有,编译通过,如果没有,编译失败

        在运行时期:参阅对象所属的类中是否有调用的方法

        简单总结:成员函数在多态调用时,编译看左边,运行看右边

    ◆在多态中,成员变量的特点:
        无论编译和运行,都参考左边(引用型变量所属的类)

    ◆在多态中,静态成员函数的特点:

        无论编译和运行,都参考左边

代码

Animal a = new Cat();//类型提升,向上转型

    a.eat()

         //如果想要调用猫的特有方法时,如何操作

         //强制将父类的引用,转成子类类型.向下转型

         Catc = (Cat) a;

         c.catchMouse();

         c  instanceof Animal

    //instanceof关键字

         //能转换的是父类应用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换,多态在自始自终都是子类对象在做着变化

6.       object类

object是所有对象的直接或者间接父类。该类中定义的是所有对象都具备的功能

★equals()

★toString()

7.       内部类

■将一个类定义在另外一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)

■访问特点:

    内部类可以直接访问外部类中的成员,包括私有成员

        之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式Outer.this.成员

    而外部类要访问内部类中的成员必须建立内部类的对象

■访问格式:

    当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,可以直接建立内部类对象

    格式:Outer.Inner o = new Outer().new Inner();

         当内部类在成员位置上,就可以被成员修饰符所修饰,比如,private:将内部类在外部类中进行封装

           static:内部类就具备static的特性

                    当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限

 

在外部其他类中,如何直接访问static内部类的非静态成员呢-----new Outer.Inner().function();

在外部其他类中,如何直接访问static内部类的静态成员呢----- Outer.Inner.function();

PS:当内部类中定义了静态成员,该内部类必须是static

  当外部类中的静态方法访问内部类时,内部类也必须是静态的

 

■当描述事物时,事物内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容

■内部类定义在局部时

    不可以被成员修饰符修饰

    可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量

代码:

class Outer{

           private int x=5;

           private class Inner{

                    void function(){

                             System.out.println(“inner”+Outer.this.x);

                    }

           }

           void method(){

           }

}

public class Test{

           public static void main(String[]args){

                    Outer o =new Outer();

                    o.method();

           }

}

 

8.       匿名内部类

▼匿名内部类其实就是内部类的简写格式

▼定义匿名内部类的前提:

           内部类必须是继承一个类或者实现接口

▼匿名内部类的格式:new父类或者接口(){定义子类的内容}

▼其实匿名内部类就是一个匿名子类对象

▼匿名内部类中定义的方法最好不要超过3个

 

代码

    new Object(){

           public void function(){

             

           }

    }.function();

9.       包(package)

▼对类文件进行分类管理

▼给类提供多层命名空间

▼写在程序文件的第一行

▼类名的全称是 包名.类名

▼包也是一种封装形式

 

javac –d . HelloWorld.java

 

总结:

    包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰

    不同包中的子类还可以直接访问父类中被protected权限修饰的成员

为了简化类名的书写,使用一个关键字,import

通配符*

import导入的是包中的类


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值