------- 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培训、期待与您交流! ----------