黑马程序员--多态 内部类

来源:互联网 发布:cms建站系统 java 编辑:程序博客网 时间:2024/04/29 23:04

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



一多态: 

1多态的概述:

某一类事物的多种存在的多种形态。 


  1,多态的体现 。父类的引用指向了自己的子类对象。 父类的引用也可以接收自己的子类对象。 
  2,多态的前提 必须是类与类之间有关系。要么继承,要么实现。 通常还有一个前提:存在覆盖。 
  3,多态的好处 多态的出现大大的提高程序的扩展性。 
  4,多态的弊端 提高了扩展性,但是只能使用父类的引用访问父类中的成员。 
  5,多态的应用 

<span style="font-family:SimSun;font-size:14px;">class Object1{public static void main(String[] args){//将子类对象复制给父类的引用func(new Cat());}public static void func(Animal a){a.eat();if(a instanceof Cat)//判断是不是属于Cat{Cat c=(Cat)a;c.catchMouse();}else if(a instanceof Dog)//判断是不是属于Dog{Dog d=(Dog)a;d.kanJia();}}}abstract class Animal{public abstract eat();}class Cat extends Animal{public void eat(){System.out.println("吃鱼");}public void catchMouse(){System.out.println("捉老鼠");}}class Dog extends Animal{public void eat(){System.out.println("啃骨头");}public void kanJia(){System.out.println("看家");}}</span>


2成员的特点: 

1,成员变量。 

编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。 
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。 

简单总结:编译和运行都参考等号的左边。哦了。

 

2,成员函数(非静态)。 
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。 
运行时:参考的是对象所属的类中是否有调用的函数。 
简单总结:编译看左边,运行看右边。因为成员函数存在覆盖特性。  

3,静态函数。 
编译时:参考引用型变量所属的类中的是否有调用的静态方法。 
运行时:参考引用型变量所属的类中的是否有调用的静态方法。 
其实对于静态方法,是不需要对象的。直接用类名调用即可。

4多态在程序代码中的特点

<span style="font-family:SimSun;font-size:14px;">class Object1{public static void main(String[] args){Fu f=new Zi();z.method1();//z.method3();报错z.method2();}}class Fu{void method1(){System.out.println("Fu method1");}void method2(){System.out.println("Fu method2");}}class Zi extends Fu{void method1(){System.out.println("Zi method1");}void method3(){System.out.println("Zi method3");}}</span>

练习:电脑运行基于主板

<span style="font-family:SimSun;font-size:14px;">class Object1{public static void main(String[] args){Mainboard mb=new Maiaboard();mb.usePci(new NetCard());mb.usePci(new SoundCard());}}interface Pci{public void open();public void close();}class MainBoard{public void run(){System.out.println("mainboard run");}public void usePci(Pci p){if(p!=null){p.open();p.close();}}}class NetCard implements Pci{public void open(){System.out.println("netcard open");}public void close(){System.out.println("netcard close");}}class SoundCard implements Pci{public void open(){System.out.println("soundcard open");}public void close(){System.out.println("soundcard close");}}</span>
<h2><span style="font-family:SimSun;font-size:14px;">二内部类: </span></h2><span style="font-family:SimSun;font-size:14px;">1将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。 简单的说就是类中还有一个类,就是内部类。 字节码文件名:外部类名$内部类名.class </span>

2内部类定义在成员变量上:

<pre name="code" class="java"><span style="font-family:SimSun;font-size:14px;">class Object1{public static void main(String[] args){Outer out=new Outer();out.getInter();}}class Outer{int x=0;class Inter{public void show(){System.out.println(x);}}public void getInter(){Inter it=new Inter();it.show();}}</span>

3内部类定义在局部上:

<pre name="code" class="java"><span style="font-family:SimSun;font-size:14px;">class Object1{public static void main(String[] args){Outer out=new Outer();out.run();}}abstract class AbsDemo{public abstract  void show();}class Outer{int x=8;public void run(){class Inter extends AbsDemo{public void show(){System.out.println(x);}}new Inter().show();}}</span>


内部类访问特点: 

1,内部类可以直接访问外部类中的成员,包括私有成员。 
2,而外部类要访问内部类中的成员必须要建立内部类的对象。 
一般用于类的设计。 
分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。 这时就是还有的事物定义成内部类来描述。 直接访问外部类中的内部类中的成员。 
外部类名.内部类名 = new 外部类对象.new 内部类对象; 
Outer.Innerin = new Outer().new Inner(); in.method(); 
如果内部类是静态的。 相当于一个外部类 外部类名.内部类名 = new 外部类对象.内部类; 

Outer.Inner in = new Outer.Inner(); in.method(); 
如果内部类是静态的,成员是静态的。 
外部类名.内部类名.静态函数名; 
Outer.Inner.function(); 
注:如果内部类中定义了静态成员,该内部类也必须是静态的。 为什么内部类能直接访问外部类中成员呢? 那是因为内部类持有了外部类的引用。  外部类名.this 内部类可以存放在局部位置上。(也就是定义在外部类的成员函数里面,主函数也是函数哦)
内部类在局部位置上只能访问局部中被final修饰的局部变量。
 

匿名内部类: 

匿名内部类。就是内部类的简写格式。 其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,也可以理解为,带内容的对象。 必须有前提:内部类必须继承或者实现一个外部类或者接口。(因为内部类是用父类的名字创建对象) 匿名内部类:其实就是一个匿名子类对象。 

匿名内部类格式:new 父类或者(or)接口(){子类成员} 

举例:

<span style="font-family:SimSun;font-size:14px;">class Object1{public static void main(String[] args){Outer out=new Outer();out.run();}}abstract class AbsDemo{public abstract  void show();}class Outer{int x=8;public void run(){new AbsDemo(){public void show(){System.out.println(x);}}.show();}}</span>


0 0
原创粉丝点击