黑马程序员---面向对象:继承、抽象、接口和多态

本文详细介绍了Java、.Net、Android编程技术中的核心概念,包括继承、抽象、接口和多态。重点讨论了如何利用这些技术提高代码复用性、创建类之间的关系以及实现功能的扩展。文章强调了正确使用继承的原则,解释了单继承和多层继承的概念,以及如何通过构造函数和抽象类进行对象初始化。同时,文章还对比了抽象类与接口的区别,阐述了接口如何降低耦合性并避免单继承的局限性。最后,通过实例展示了多态的应用场景,说明了预定义程序如何在运行时访问子类的功能。

------- Java、.NetAndroid培训期待与您交流!------- 

一、继承(关键字:extends)

特点:
      1,提高了代码的复用性。
      2,让类与类之间产生关系,是多态性的前提。

注意:切记只有当类与类之间存在关系时,采用继承,不要为了简化代码而随便使用
Java中的继承。
      1java只支持单继承,不支持多继承。因为继承了多个父类如果有相同方法时,子类对象不确定运行哪一个,带来安全隐患。
      2Java还支持多层继承。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,接口的出现降低了耦合性。(软件设计多用高聚合,低耦合)
            别忘了说的时候,需要举例。如:usbpci、主板、插座。

抽象类和接口异同:
相同:
      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接口,多态的应用必须在子&父类或子类&接口中,多态至始至终都是子类对象的引用在做着变化。

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性稳定性。此外,文档还列举了大量相关的科研方向技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值