黑马程序员-java学习之面向对象下

来源:互联网 发布:百度只收录顶级域名 编辑:程序博客网 时间:2024/06/06 05:45

---------------------- android培训、java培训、期待与您交流! ----------------------

一、继承概述:为了使程序能够方便的使用以前建造的类的方法和属性,通过简单的代码来建造功能强大的类,会节省许多编程时间,这样做也可以减少代码出错的机会,通过继承就可以实现。

 

二、继承有以下特点:1.Java语言中,只支持单继承,不支持多继承,因为多继承容易带来安全隐患,2.Java支持多层继承,也就是一个继承体系。4.子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法,可以在子类的构造方法使用super语句调用父类的构造方法。5.子类在默认情况下会调用父类无参数的构造方法。

 

 

三、覆盖总结:覆盖方法必须满足以下条件:
 i. 子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致。
ii. 子类方法不能缩小父类方法的访问权限。
iii. 子类方法不能抛出比父类方法更多的异常。
iv. 方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。
v. 父类的静态方法不能被子类覆盖为非静态的方法。
vi. 子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。
vii. 父类的非静态方法不能被子类覆盖为静态方法。
viii. 父类的私有方法不能被子类覆盖。
ix. 父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。
x. 父类的非抽象方法可以被覆盖为抽象方法。

四、子类的实例化过程:1.分配成员变量的存储空间并进行默认的初始化。2.绑定构造方法参数3.如果有this()调用,则调用相应的重载构造方法。被调用的重载构造方法的执行流程结束后,回到当前构造方法。4.显式或隐式追溯调用父类的构造方法5.进行实例变量的显式初始化操作,也就是执行在定义成员变量时就对其进行赋值的语句。6.执行当前构造方法的方法体中的程序代码。

 

五、Final关键词

1,可以修饰类,函数,变量。

2,被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。

3,被final修饰的方法不可以被复写。

4,被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,有可以修饰局部变量。当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读。而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。则单词间通过_连接。

5,内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。

 

六、抽象类

1,抽象类定义规则:抽象方法一定定义在抽象类中,抽象方法和抽象类都必须被abstract关键字修饰,抽象类不可以用new创建对象,因为调用抽象方法没意义;抽象类中的抽象方法要被使用,必须由子类覆写所有的抽象方法,建立子类对象调用,如果子类只覆写了部分 抽象方法,那么该子类还是一个抽象类。

抽象类和一般类没有太大的不同,只是要注意该怎样描述事物就如何描述事物,只不过该事物中出现了一些看不懂的东西,这些不确定的功能,也是该事物的功能,需要明确出现,但是无法定义主体。抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。

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

示例程序如下:

 

/*

需求:获取一段程序运行的时间。

原理:获取程序开始和结束的时间并相减即可。

*/

 

abstract classGetTime

{

       public final void getTime()

       {

              long start =System.currentTimeMillis();

 

              runcode();//用子类去完成此方法要完成的功能

 

              long end =System.currentTimeMillis();

 

              System.out.println("毫秒:"+(end-start));

       }

       public abstract void runcode();

 

}

 

 

class SubTimeextends GetTime

{

 

       public void runcode()

       {

             

              for(int x=0; x<4000; x++)

              {

                     System.out.print(x);

              }

       }

}

 

 

class  TemplateDemo

{

       public static void main(String[] args)

       {

              //GetTime gt = new GetTime();

              SubTime gt = new SubTime();

              gt.getTime();

       }

}

 

 

七、接口

本质上是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现,接口中的成员都是public的,接口是不可以创建对象的,因为有抽象方法,需要被子类实现(implements),子类对接口中的抽象方法全都覆盖后,子类才可以实例化,否则子类是一个抽象类。接口可以被类多实现,也是对多继承不支持的转换形式。注意:类与类之间继承,类与接口之间实现,接口与接口之间继承,基本功能定义在类中,扩展功能定义在接口中。

接口的特点:1.实现一个接口都是要实现该接口的所有方法(抽象类除外)2.接口中的方法都是抽象的3.多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。

 

 

八、对象的多态性

可以理解为事物存在的多种体现形态。

多态的体现(父类的引用也可以接收自己的子类对象)、多态的前提(必须类与类之间有关系,要么继承,要么实现,另外还要存在覆盖)、多态的弊端(只能使用父类的引用访问父类中的成员)、多态的好处(大大提高了程序的扩展性)、多态的应用。

向下转型:强制将父类的引用,转成子类类型,如动物和猫的例子:Cat c=(Cat)a;

成员函数在运行时:编译看左边,运行看右边。

在多态中,成员变量无论编译还是运行,都参考左边(引用型变量所属的类),对于静态函数,无论编译还是运行,都要参考左边

 

九、内部类

可以直接访问外部类的成员,包括私有,之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:内部类名.this;外部类要访问内部类,不需建立内部类对象。

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

              外部类名.内部类名  变量名=外部类对象.内部类对象

              Outer.Inner  in=new Outer().new Inner();

当内部类在成员位置上,就可以被成员修饰符所修饰,如private(将内部类在外部类中进行封装)static(只能访问外部类中的static成员,出现了访问局限)

在外部其他类中,访问static内部类的非静态成员:new  Outer.Inner().function();

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

注意:当内部类中定义了静态成员,内部类必须是静态的;当外部类中的静态方法访问内部类时,内部类也必须是static的。内部类定义在局部时,不可以被成员修饰符修饰,可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。

匿名内部类:就是内部类的简写格式

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

其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,或者理解为有内容的对象。

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

---------------------- android培训、java培训、期待与您交流! ----------------------

原创粉丝点击