黑马程序员——Java基础:面向对象一些概念的区分(三)

来源:互联网 发布:淘宝点击发布没反应 编辑:程序博客网 时间:2024/05/22 14:00

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
20.继承:类与类之间的所属关系
1)提高了代码的复用性
2)让类与类之间产生了关系,有了这个关系,才有了多态的特性
3)java只支持单继承,不支持多继承,多继承可以用多实现。
多继承容易带来安全隐患(当多了父类中定义了相同的功能,
功能内容不同是,就不能确定是执行哪一个。)
4)java支持多层继承,也就是一个继承体系
想使用体系,先查阅体系父类的描述,因为父类中定义的是
体系的共性功能,通过了解共性功能,就知道该体系的基本功能。
具体调用时,要创建最子类的对象:其一有可能父类不能创建
对象(如抽象类和接口不能)其二创建子类对象既可以使用特有功能,
也可以使用基本功能。
21.子父类出现后,类成员变量的特点
1)如果子类中出现非私有的同名成员变量时,子类对象访问父类中的成员变量
用super(super代表父类的引用),子类对象访问本类中的变量用this(this代表
本类的引用) .super和this的使用基本一致。
2)如果没有父类对象,只有子类对象,this和super都可以指向子类对象

class Fu{    int num =4;}class Zi{    void show ()    {        System.out.println(num);    }}class ExtendsDemo{    public static void main(String [ ] args)    {        Zi z = new Zi();        z.show();    }}

22.子父类中有同名成员方法
1)如果子类出现和父类一模一样的函数时,当子类对象调用该函数时,
会执行子类函数的内容,如同父类的函数被覆盖一样,该特性称为
重写(覆盖)
2)当子类继承了父类,沿袭了父类的功能到子类中。子类具备该
功能,但功能的内容却和父类不一致,这时没有必要定义新功能,
而是使用覆盖,保留父类的功能定义,重写功能内容。
使用“super.父类的函数”这句话就搞定。例如:程序升级时,千万
别改原码可以利用复写功能,提高程序的扩展性
3)注意:a.子类与父类方法要一模一样,包括返回值类型、参数列表
b.子类覆盖父类,必须保证子类权限大于等于父类权限,
才可以 覆盖;
c.静态只能覆盖静态,不常用

class Fu{    void speak()    {        System.out.println("shuo Vb");    }}class Zi extends Fu{    void speak()     //有利于功能扩展    {        System.out.println("shuo Java");    }}class JiCheng{    public static void main(String [ ] args)    {        Zi z = new Zi();        z.speak();    }}

23.重载和重写
重载:只看同名函数的参数列表
重写:子类与父类方法要一模一样,包括返回值类型、参数列表

24.子父类中的构造函数
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为,
子类构造函数默认第一行有一条隐式的语句super();super()会访问父类
中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super()
为什么子类一定要 访问父类中的构造函数?
因为父类中的数据子类可以直接获取,子类对象在建立时,需要
先查看父类对数据是如何初始化的,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,还可以通过手动定义super语句的
方式来指定。
注意:super()语句一定是用在子类中,而且在构造函数的第一行;
super.用在子类中的一般函数中

class Fu{    Fu()    {        System.out.println("fu run" );    }    Fu(int x)    {        System.out.println("fu >>>"+x );    }}class Zi extends Fu{    Zi()    {        super(5);        System.out.println("zi run" );    }    Zi(int x)     {        System.out.println("zi......"+x );    }}class JiCheng{    public static void main(String [ ] args)    {        Zi z0=new Zi();        Zi z = new Zi(8);    }}

25.子类的实例化过程:
子类的所有构造函数,默认都会访问父类中空参数的构造函数,
因为子类每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super单独访问
父类的构造函数;子类第一行也可以指定this语句来访问本类的构造函数。
子类中至少会有一个构造函数会访问父类中的构造函数。
父类也会有super语句,他继承的是所有类的父类Object

26.final修饰符
1)可以修饰类,变量,函数
2)被final修饰的类不能被继承,为了避免被继承,被子类复写功能
3)被final修饰的方法不可以被复写
4)被final修饰的变量是一个常量,只能赋值一次,既可以修饰成员变量
也可以修饰局部变量。
当在描述事物是,一些数据的出现值是固定的,那么这时为了增强
阅读性,都给这些值起个名字,就加一个final。作为常量,所有的字母
都大写,如果由多个单词组成,单词间通过下划线连接。共享数据加
static,加public其他类和包都可以访问,是全局常量。
5)内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部
变量。

 class Demo {     void show2()     {         final int MY_ZHI = 4;  //y终身为4     } }

27.抽象函数
当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取,
只抽取功能定义,不抽取主题。该函数必须用abstract标示,只能放在抽象
类中。
特点:
1)抽象方法一定在抽象类中
2)抽象方法和抽象类都必须加abstract关键字
3)抽象类不可以用new创建对象,因为调用抽象方法没意义
4)抽象类中的方法要被使用,必须由子类复写所有的抽象方法后,
建立子类对象调用;如果子类只覆盖了部分抽象方法,那么该子类还是一个
抽象函数。
5)抽象类和一般类没有太大的不同
该如何描述事物,聚如何描述,只不过,该事物出现了一些看不懂的东西,
这些不确定的部分,也需要明确出现,无法定义的主体用抽象函数表示,
然后通过子类来定义。
抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。

28.需求:获取一段程序运行的时间
原理:获取程序开始和结束的时间,并相碱
获取时间:System.currentTimeMillis();

abstract class GetTime{    public final void getTime()    {        long start = System.currentTimeMillis();        long end = System.currentTimeMillis();        System.out.println("毫秒:"+end-start);    }    public abstract void runcode();}class subTime extend GetTime{    public void runcode()    {        for(int x=0; x<1000;x++)        {            System.out.print(x);        }    }}class TemplateDemo{    public static void main(String [] args)    {        GetTime gt = new GetTime();        gt.getTime();     }}

当代码完成优化后,就可以解决这类问题,这种方式称为模板方法
模板设计方法:在定义功能是,功能的一部分是确定的,但是有一部分是不确定的,
而确定的部分在使用不确定的部分,那么就将不确定的部分暴露出去,由
该类的子类去执行。提高了扩展性,提高了复用性。

29.接口:初期理解,可以认为是一个特殊的抽象类,当抽象类中的方法
都是抽象的,那么该类可以通过接口的形式来表示。
class用于定义类,interface用于定义接口
接口定义特点一:1)接口定义常见定义:常量、抽象方法
2)接口中常量的固定修饰符
public static final
抽象方法的固定修饰符
public abstract
记住:接口中的成员都是public的,接口是不可以创建对象的,因为有
抽象方法,需要被子类实现。子类对接口中的方法全部实现后,子类
才能创建对象。否则,子类是一个抽象类,抽象类中方法的权限可以修改。

interface Inter{    public static final int NUM = 3;    public abstract void show();}class Test implements Inter{    public void show() {}}class InterfaceDemo{    Test t = new Test();    System.out.println(t.NUM);    System.out.println(Test.NUM);    System.out.println(Inter.NUM);}

接口特点二:被类多实现:
1) java不支持多继承(父类中方法有重复,子类调用会出现问题),
支持多实现(因为接口没有方法主体,子类可以任意定义)
2)一个类继承了一类,可以实现多个接口

接口特点三:接口与接口是继承关系,而且可以多继承,但不能在
多继承的接口中存在不同返回值的同名函数。
总之:接口可以提供规则、功能扩展、降低耦合性。
继承是所属关系,接口是like关系;基本功能定义在类中,扩展功能
定义在接口中

0 0
原创粉丝点击