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

来源:互联网 发布:游戏交易网站源码 编辑:程序博客网 时间:2024/05/14 08:25
------- android培训、java培训、期待与您交流! ----------

一、继承
   1、提高了代码的复用性。
   2、让类与类之间有了关系。有了这个关系,才有了多态的特性。
         java只支持单继承,不支持多继承。多继承容易带来安全隐患。但是java保留了这种机制,并用另外一种体    现      形式完成表示,叫做多实现。
         java支持多层继承。

   3、如何使用一个继承体系中的功能呢?
      想要使用体系,先查阅体系中父类的描述,因为父类中定义的是该体系中的共性功能。
      通过了解共性功能就可以知道该体系的基本功能。
      那么这个体系已经可以基本使用了。
      在具体调用时要创建最子类的对象,因为1、有可能父类不能创建对象。2、创建子类对象可以使用更多的功             能,包括基本的也包括特有的。
      简单说,查阅父类功能,创建子类对象使用功能。

      注意:不要为了获取其他类的功能,简化代码而继承。
      必须是类与类之间有所属关系才可以继承。所属关系为"is ..a";
    

     继承示例
      子父类出现后,成员的特点。

      类中成员:
     1)变量
         如果子类中出现非私有的同名变量时。
         子类要访问本类中的变量,用this
         子类要访问无泪中的同名变量,用super

         super的使用和this的使用几乎一致。
         this代表的是本类对象的引用。
         super代表的是父类对象的引用。

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

        这种情况是函数的另一个特性:重写(覆盖)。

        当子类继承父类,沿袭了父类的功能到子类中。
        但是子类虽具备该功能,但是功能的内容却和父类不一致。
        这时,没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能内容。

        覆盖:
         子类覆盖父类,必须保证子类权限大于等于父类权限,才可覆盖,否则编译失败。
         静态只能覆盖静态。

       重载:只看同名函数的参数列表。
       重写:子父类方法要一模一样。

      4、构造函数。
          在对子类对象进行初始化时,父类的构造函数也会运行
          那是因为子类的构造函数默认第一行有一条隐式的语句super();
          super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认的第一行都是super()。

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

         子类所有的构造函数,默认都会访问父类中控参数的构造函数,因为子类美一个构造函数的第一行都有一句             隐式super();
         当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形式来指定要访问父类中的构造     函        数。


         子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
         子类中至少有一个构造函数会访问父类中的构造函数。
    

    
      5、final:最终,作为一个修饰符。
        1)可以修饰类、函数、变量。
        2)被final修饰的关键字不可以被继承。为了避免被继承,被子类复写功能
        3)被final修饰的方法不可以被重写。
        4)被final修饰的变量是一个常量,只能赋值一次。既可以修饰成员变量,又可以修饰局部变量。
             当描述事物时,一些数据的出现值是固定的,那么为了增强阅读星,都给这些值起个名字。方便与阅读。
          而这个值不需要改变,所以加上final修饰。
             作为常量,常量的书写规范是所有字母都大写,如果由多个单词组成,但此间用_链接。
        5)内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
     
     6、抽象类
       当多个类中出现了相同功能,但是功能主体不同。这时也可以进行抽取。
       这时可以向上进行抽取,只抽取功能定义,而不抽取功能主体。

       抽象:就是看不懂的东西。
       抽象类的特点:
       1)抽象方法一定定义在抽象类中。
       2)抽象方法和抽象类都必须被abstract关键字修饰。
       3)抽象类不可以用new创建对象,因为调用抽象方法没有意义。
       4)抽象类中的方法要被使用必须由子类重写起所有的抽象方法后建立子类对象调用。
             如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
 
       抽象类和一般的类没有太大不同。
         该如何描述事物,就如何描述事物,只不过该事物出现了一些看不懂的东西。
         这些不缺定的部分,也是该事物的功能,需要明确出现,但是无法定义主题。
         通过抽象方法来表示。

         抽象类比一般类多了个抽象方法。就是在类中可以定义抽象方法。
         抽象类不能实例化。
         抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。

    

     7、接口:初期理解,可以认为是一个特殊的抽象类
          当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。

         class 用于定义类
         interface用于定义接口。

         定义接口时,格式特点:
        1)接口中常见定义:常量,抽象方法;
        2)接口中的成员都有固定修饰符。
             常量:public static final
             方法:public abstract
             接口中的成员都是public

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

        接口可以被类多实现。也是对多继承不支持的转换形式,java支持多实现。
       接口的特点:
       1)接口是对外暴露的规则 。
       2)接口是程序的功能扩展。
       3)接口可以用来多实现。
       4)类与接口之间是实现关系,而类可以继承一个类的同时实现多个接口。
       5)接口与接口之间可以有继承关系。
    

    

二、多态
      多态:某一类事物具备的多种表现形式。     
     1、多态的体现。
        父类的引用指向了自己的子类对象。
        父类的引用也可以接受自己的子类对象。
     2、多态的前提。
        必须是类与类之间有关系,要么继承要么实现。
        存在覆盖。
     3、多态的好处。
        多态的出现大大的提高了程序的扩展性。
     4、多态的弊端。
        提高了扩展性,但是只能使用父类的引用访问父类中的成员。  
     5、多态的应用。
     6、多态代码特点。
        在多态中非静态成员函数的特点:
        在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译失败。
        在运行时期:参阅对象所属的类中是否有调用的方法。
        编译看左边,运行看右边。

        在多态中成员变量的特点:
        无论编译和运行,都参考左边(引用型变量所属的类)。
     
    
    
      多态示例:
      
/*
  南方人,北方人的饮食文化
  吃饭的功能必须有,但是吃的具体内容不同

  基本调用,进行多态调用
  就是子类自己用
*/
class Person

public void eat(){}
}
class SouthPerson extends Person
{
public void eat(){
 System.out.println("南方人吃米");
}
}
class NorthPerson extends Person
{
public void eat(){
 System.out.println("北方人吃面");
}
}

class DuoTaiTest1 
{
public static void main(String[] args) 
{
//对南方人,北方人,基本调用
SouthPerson sp = new SouthPerson();
sp.eat();

NorthPerson np = new NorthPerson();
np.eat();

//多态调用 
Person p = new SouthPerson();
p.eat();

p = new NorthPerson();
p.eat();
}
    

    
    
    

三、Object类:
      Object 类是所有对象的直接或者间接父类。该类中定义的是所有对象都具备的功能。
      Object 类中已经提供了对对象是否相同的比较方法。
      如果自定义类中也有比较相同的功能,没有必要重新定义。
      只要沿袭父类中的功能,建立自己特有比较内容即可
     
      1、内部类:将一个类定义在另一个类的里面,对里面那个类就称为内部类。
         访问特点:内部类可以直接访问外部类中的成员,包括私有成员。
         之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式外部类名.this
         而外部类要访问内部类中的成员必须建立内部类的对象。

         访问格式:
           当内部类定义在外部类的成员位置上时,而且非私有,在外部其他类中可以直接简历内部类对象
         外部类名.内部类名 变量名 = 外部类对象.内部类对象。
           当内部类在成员位置上,就可以被成员修饰符所修饰,比如private,将内部类在外部类中封装。
         被static修饰 内部类就具备了static的特性。只能访问外部类中的static成员,出现了访问局限。
         在外部类中,访问static内部类的非静态方法方式:
              new Outer.Inner1().method2();
         访问静态内部类中的静态成员:
              Outer.Inner1.method2();
         注意:当内部类中定义了静态成员,该内部类必须是静态的。
                    当外部类中的静态方法访问内部类时,内部类也必须是静态的。


         当描述事物时,事物的内部还有事物,该事物用内部类描述。
         因为内部事物在使用外部事物的内容。
    
    
     2、内部类定义在局部时
      1)不可以被成员修饰符修饰
      2)可以直接访问外部类成员,因为还持有外部类中的引用。
           但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。

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


0 0
原创粉丝点击