-------
一、继承(关键字:extends)
特点:
1,提高了代码的复用性。
2,让类与类之间产生关系,是多态性的前提。
注意:切记只有当类与类之间存在关系时,采用继承,不要为了简化代码而随便使用
Java中的继承。
1,java只支持单继承,不支持多继承。因为继承了多个父类如果有相同方法时,子类对象不确定运行哪一个,带来安全隐患。
2,Java还支持多层继承。A-->B--->C 可以形成继承体系。
想要使用体系功能,"查阅父类功能,建立子类对象调用功能"即:首先查阅体系中父类功能,了解共性功能,创建最子类对象。一是因为父类可能不能被创建对象,二是最子类的功能最多(其中包括父类功能以及最子类特有成员)。
注解:父类的由来其实是由事物中的共性内容不断向上抽取而来的。所以父类中定义的是该体系中的最基本,最共性功能。
继承出现后,代码上也有一些特点:
1,变量:
当子父类中定义了相同的名称的成员变量,子类访问本类中的变量,用this(一般可省)子类要使用父类中的同名变量时,需要使用关键字super来区分。一般不会出现这种情况,因为父类中有了,子类不需要定义。而且父类定义时,一般变量都私有化。
2,函数:
子类可以直接访问父类中非私有的成员函数。
特殊情况:当子类中定义了与父类一模一样的方法时,会发生覆盖操作,大多指的是非静态方法。最终会运行子类的方法,父类相当于被覆盖了。函数的另一个特性:覆盖(重写,复写)。
什么时候用啊?
当父类的功能要被修改时,不建议修改源码。因为是灾难。只要通过一个类继承原有类,定义一个新的升级后的功能即可。但是功能是相同的,只是实现方法改变。这是子类可以沿袭父类中的功能定义,并重写功能内容。这就是覆盖。
覆盖注意事项:
1,子类覆盖父类时,必须权限要大于等于父类权限。(区分函数重载和重写)
2,静态不能覆盖非静态。
3,构造函数:
构造函数可以给本类进行对象初始化,也可以给子类对象进行初始化。
子类对象初始化过程:
子类中的所有构造方法都会访问父类中空参数的构造函数,因为每一个构造函数的第一行,都有一句隐式的super( )语句。
为什么要有这条语句(为什么要访问父类的空参数构造函数)?
因为子类会获取到父类中的数据,必须要先明确父类对数据的初始化过程。
当父类中没有空参数构造函数时,子类构造函数必须通过super句来明确要访问的父类中指定的构造函数,但是super语句一定要定义在子类构造函数的第一行。当然子类构造函数也可以通过this语句访问本类中的构造函数,但是子类中肯定至少有一个构造函数会访问父类。
二、抽象(关键字:abstract)
其实就是在分析事物时,事物中的功能有些是不明确的内容的,这些不明确内容就是抽象的。可以通过抽象函数来描述。
抽象函数一定要定义在抽象类中,因为,抽象函数所在类,也必须被抽象标识。
写法特点:
1,抽象函数只对函数进行声明,没有函数主体。
2,抽象类和抽象函数都需要用abstract修饰。
3,抽象类不可以进行实例化,不可以被创建对象,因为调用抽象方法没意义。
4,想要使用抽象功能,必须通过子类覆盖了父类中所有的抽象方法后,才可以对子类实例化。如果只覆盖了部分抽象方法,那么子类还是一个抽象类。
也可以理解为:抽象类是一个父类,是不断向上抽取而来的,在抽取过程中,只抽取了方法声明,但没有抽取方法实现。
抽象类和一般类差不多。
区别:
抽象类可以定义抽象方法。
抽象类不可以建立对象。
注意:其实抽象类一样用于描述事物,既可以定义抽象方法,也可以定义非抽象方法。 抽象类中可以不定义抽象方法,这样做仅仅是不让该类被建立对象。abstract只能修饰类和方法,不能修饰变量。
三、接口(关键字:interface)
初期理解:接口看上去是一个特殊的抽象类,里面存的都是抽象方法。
特点:
1,通过interface来定义。
2,接口中常见成员:常量,抽象方法。而且这些成员都有固定的修饰符。
常量:public static final
方法:public abstract
3,接口中的成员都是共有(public)的。
4,一个类可以对接口进行多实现,也弥补了多继承带来的安全隐患,所以java对多继承进行了改良,用多实现方法来体现多继承的特性。
5,一个类在继承一个类的同时,同时可以实现(implements)多个接口。
6,接口与接口之间是继承(extents)关系,而且可以多继承。
应用特点:
1,接口是对外暴露的规则。
2,接口是功能的扩展(扩展:没有该接口,主体照常执行)。
3,接口的出现降低了耦合性。(软件设计多用高聚合,低耦合)
别忘了说的时候,需要举例。如:usb、pci、主板、插座。
抽象类和接口异同:
相同:
1,都可以在类内部定义抽象方法。
2,通常都在顶层。
3,都不可以实例化,都需要子类来实现。
不同点:
1,抽象类中可以定义抽象方法和非抽象方法,而接口中只能定义抽象方法。
2,接口的出现可以多实现,抽象类只能单继承。
也就是说:接口的出现避免了单继承的局限性。
3,继承和实现的关系不一致。继承:is a,实现:like a
四、多态:
1,表现:父类或者接口的引用指向了或者接收了自己的子类对象。
2,前提:类与类之间要有关系,继承,实现。通常都会有覆盖。
3,好处:预先定义的程序可以运行后期程序的内容;增强了程序的扩展性。
4,弊端:虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的非静态功能内容,不能预先使用子类中定义的特有功能。
5,多态的注意事项:
1>对于非静态成员函数:如:Fu f = new Zi( ); f.method( );
编译时期:看左边,运行时期:看右边,因为成员函数有一个覆盖操作。毕姥爷和毕老师的故事。
2>对于非私有的实例变量:静态变量,静态方法,编译和运行都看左边。
要求记住结论,有空闲时间,就想想为什么?
6,转型:
子类对象被父类引用:子类对象在向上转型。
将指向子类对象的父类引用转换成子类类型引用:向下转型。
实例:毕姥爷和毕老师的故事
class 毕姥爷{ }
class 毕老师 extends 毕姥爷{ }
毕姥爷 ly = new 毕老师( ); //毕老师向上转型为了毕姥爷,向上转型。
毕老师 ls = (毕老师) ly; //将代表毕老师对象的父类引用ly强制转换成了毕老师类型,向下转型。
7,应用:
需求:电脑运行实例。
思路:电脑的运行基于主板,而主板上有实现内存、显卡等的接口。
步骤:
1.定义一个PCI接口来实现更多的功能(如:声卡、网卡)。
2.定义主板,是一个独立的类,不受其他类的影响,独立存在,主板中存在方法usePCI(PCI pci)使用接口。
3.定义网卡,实现接口,重写接口全部抽象方法。
interface PCI
{
public abstract void open(); //抽象的开功能
public abstract void close(); //抽象的关功能
}
//主板类,最终类,不可被继承,不可被子类重写,独立个体。
final class MainBord
{
public void run()
{
System.out.println("MainBord run...");
}
public void usePCI(PCI pci)//多态:PCI pci = new NetCard//接口型引用指向自己的子类对象,即PCI的子类对象。
{
if ((pci!=null))
{
pci.open();
pci.close();
}
}
public void close()
{
System.out.println("MainBord close");
}
}
//网卡类,实现接口PCI,重写PCI中全部方法,保证其不再是抽象类
class NetCard implements PCI
{
public void open()
{
System.out.println("netcart open...");
}
public void close()
{
System.out.println("netcart close");
}
}
class DuoTai
{
public static void main(String[] args)
{
MainBord mb = new MainBord();
mb.run();
mb.usePCI(new NetCard());
mb.close();
}
}
总结:熟练掌握继承、抽象、接口和多态的特点、使用方法以及其间的关系: 子类extents父类、子类implements接口、接口extents接口,多态的应用必须在子&父类或子类&接口中,多态至始至终都是子类对象的引用在做着变化。
本文详细介绍了Java、.Net、Android编程技术中的核心概念,包括继承、抽象、接口和多态。重点讨论了如何利用这些技术提高代码复用性、创建类之间的关系以及实现功能的扩展。文章强调了正确使用继承的原则,解释了单继承和多层继承的概念,以及如何通过构造函数和抽象类进行对象初始化。同时,文章还对比了抽象类与接口的区别,阐述了接口如何降低耦合性并避免单继承的局限性。最后,通过实例展示了多态的应用场景,说明了预定义程序如何在运行时访问子类的功能。
959

被折叠的 条评论
为什么被折叠?



