黑马程序员_面向对象—>多态

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

 

多态

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

2.多态的体现

       父类的引用指向了自己的子类对象。父类的引用也可以接收自己的子类对象。

3.多态的前提

       必须是类与类之间有关系。要么继承,要么实现。通常还有一个前提:存在覆盖。

4.多态的好处

       多态的出现大大的提高程序的扩展性和后期维护性。

5.多态的特点:

       成员函数:编译时,要查看所属的类中是否有所调用的成员。运行时,要查看对象所属的类中是否有所调用的成员。简单的说就是成员函数在多态调用时,编译看左边,运行看右边。

       成员变量:只看引用变量所属类。无论编译和运行,都参考左边。

       静态成员:无论编译和运行,都参考左边。

6.多态的弊端:

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

示例:需求电脑运行实例:电脑运行基于主板。

classDuoTaiDemo1

{

       public static void main(String[] args)

       {

              MainBoard mb = new MainBoard();

              mb.run();

              mb.usePCI(null);

              mb.usePCI(new NetCard());

              mb.usePCI(new SoundCard());

             

       }

}

interfacePCI//定义主板接口

{

       public void open();

       public void close();

}

classMainBoard

{

       public void run()

       {

              System.out.println("mainboardrun ");

       }

       public void usePCI(PCI  p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。

       {

              if(p!=null)

              {

                     p.open();

                     p.close();

              }

       }

}

classNetCard implements PCI//实现网卡

{

       public void open()

       {

              System.out.println("netcardopen");

       }

       public void close()

       {

              System.out.println("netcardclose");

       }

}

classSoundCard implements PCI//实现声卡

{

       public void open()

       {

              System.out.println("SoundCardopen");

       }

       public void close()

       {

              System.out.println("SoundCardclose");

       }

}

 

7.多态转型

(1)子类对象被父类引用:子类对象在向上转型。

(2)将指向子类对象的父类应用转换成子类类型引用:向下转型。千万不要出现这样的操作,就是将父类对象转成子类类型。我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。多态自始至终都是子类对象在做着变化。

(3) 毕姥爷和毕老师的故事。

class毕姥爷{}

class毕老师 extends 毕姥爷{}

毕姥爷 ly = new 毕老师();//毕老师向上转型为了毕姥爷。向上转型

毕老师 ls = (毕老师)ly; //将代表毕老师对象的父类引用ly强制转换成了毕老师类型。向下转型。

Object

1.Object:是所有对象的直接后者间接父类,传说中的上帝。该类中定义的肯定是所有对象都具备的功能。

2.常见方法:

       boolean equals(Object obj):用于比较两个对象是否相同。

       String toString(): 获取对象的字符串表现形式类名@哈希值 

       getClass().getName()+"@"+Integer.toHexString(hashCode());

       Class getClass():获取正在运行的对象所属的字节码文件的对象。也就是说如果Demo d = new Demo();d.getClass();获取的就是d执行的对象所属的字节码文件Demo.class对象。

      

      

内部类

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

简单的说当描述事物时,事物的内部还有事物,该事物用内部类来描述。因为内部事务在使用外部事物的内容。

2.特点:内部类可以直接访外部类中的成员,包括私有成员(之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式外部类名.this)。而外部类要访问内部类中的成员必须要建立内部类的对象。

访问格式:

3.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。

可以直接建立内部类对象。

格式:外部类名.内部类名  变量名 = 外部类对象.内部类对象;

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

4.当内部类在成员位置上,就可以被成员修饰符所修饰。

private:将内部类在外部类中进行封装。

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

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

5.在外部其他类中,如何直接访问static内部类的非静态成员呢?

              new Outer.Inner().function();

6.在外部其他类中,如何直接访问static内部类的静态成员呢?

              Outer.Inner.function();

注意:当内部类中定义了静态成员,该内部类必须是static的。

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

7.内部类定义在局部时,

1)不可以被成员修饰符修饰

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

示例

class  InnerClassDemo

{

       public static void main(String[] args)

       {

              Outer out = new Outer();

              out.method();

       }

}

class Outer

{

       int x = 3;

       void method()

       {

              final int y = 4;

              class Inner

              {

                     void function()

                     {

                            System.out.println(x);//打印3

                            System.out.println(y);//打印4

                     }

              }

              new Inner().function();

       }

}

 

匿名内部类

1.就是内部类的简化写法。

2.前提:内部类可以继承或实现一个外部接口。

3.格式为:new 外部类名接口名(){覆盖类或者接口中的代码(也可以自定义内容)}

4.其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。    可以理解为带内容的对象。

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

示例

class zz

{

       public static void main(String[] args)

       {

              new Outer().function();

       }

}

abstract class AbsDemo//定义一个抽象类,包含两个抽象方法

{

       abstract void show();

       abstract void abc();

}

class Outer

{

       public void function()

       {

              AbsDemo d = new AbsDemo()

              {

                     int num = 9;

                     void show()

                     {

                            System.out.println("num==="+num);

                     }

                     void abc()

                     {

                            System.out.println("匿名内部类");

                     }

              };//复写抽象方法

              d.show();//打印9

              d.abc();//打印匿名内部类

       }

}

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值