Java三大特性
封装
封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
继承
**概念:**继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
不同类型的对象,相互之间经常有一定数量的共同点。例如,小明同学、小红同学、小李同学,都共享学生的特性(班级、学号等)。同时,每一个对象还定义了额外的特性使得他们与众不同。例如小明的数学比较好,小红的性格惹人喜爱;小李的力气比较大。继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承可以提高代码复用性。继承是多态的前提。
关于继承如下 3 点请记住:
- 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
分类:
根据继承的特性可以分为纯继承与扩展。
纯继承关系是纯粹的“is-a”(是一种)关系,因为一个类的接口已经确定了它应该是什么。继承可以确保所有的导出类具有基类的接口,且绝对不会少。基类可以接收发送给导出类的任何消息,因为二者有着完全相同的接口。
扩展关系“is-like-a”(像一个)关系,导出类就像是一个基类——它有着相同基类的基本接口,但是它还具有由额外方法实现的其他特性。导出类中接口扩展部分不能被基类访问,因此,一旦向上转型,就不能调用那些新方法。
A extends B , B a =new A(); B向上转型为A 的对象
A a1 =(A) a; 向下转型(要先向上转型),此时,a1可以调用扩展方法
特性:
Java 语言的继承是单继承,不允许一个类继承多个父类。
继承最重要的方面是用来表现新类和基类之间的关系。这种关系可以用“新类是现有类的一种类型”。
-
继承可以把新类向上转换成基类,这是向上转型的一种表现。
-
由导出类转型成基类,在继承图上是向上移动的。
-
向上转型是从一个较专用类型向较通用类型转换。
-
导出类是基类的一个超集。它可能比基类含有更多的方法,但它必须至少具备基类中所有的方法。
优缺点:
在面向对象语言中,继承是必不可少的、非常优秀的语言机制,它有如下优点:
- 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
- 提高代码的重用性;
- 子类可以形似父类,但又异于父类;
- 提高代码的可扩展性,实现父类的方法就可以“为所欲为”了。
- 提高产品或项目的开放性。
自然界的所有事物都是优点和缺点并存的,继承的缺点如下:
- 继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;
- 降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;
- 增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大段的代码需要重构。
多态
多态,顾名思义,表示一个对象具有多种的状态。具体表现为父类的引用指向子类的实例。
**定义格式:**父类类型 变量名=new 子类类型();
理解:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态的前提:
1)要有继承关系或实现关系(接口);
2)要有方法重写;
3)要有父类或者父接口引用指向子类`Fu f= new Zi();
注意:形参实参形式的(形参父类实参子类)。
成员特点:
1、成员变量(编译运行全看父类)
编译的时候,参考父类中有没有这个变量,如果有,编译成功,没有编译失败
运行的时候,运行的是父类中的变量值
2、成员方法(编译看父类,运行看子类)
编译的时候, 参考父类中有没有这个方法,如果有,编译成功,没有编译失败
运行的时候, 运行的是子类的重写方法
特例:调用静态成员方法时,运行看父类。原因:静态属于类,不属于对象。不new对象,也可调用父类的静态方法,直接用类名调用。
多态的特点:
- 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
- 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
- 多态不能调用“只在子类存在但在父类不存在”的方法;
- 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。
多态的类型:
如果在编译时能够确定执行多态方法称为编译时多态,否则称为运行时多态。
编译时多态
方法重载都是编译时多态—对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性.。
运行时多态
如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态性
Person p = new Man();
p.toString();
Java支持运行时多态,意为p.toString()实际执行p所引用实例的toString(),究竟执行Person类还是Man类的方法,运行时再确定。如果Man类声明了toString()方法,则执行之;否则执行Person类的toString()方法。
多态的好处:
- 可替换性(substitutability)。多态对已存在代码具有可替换性。
- 可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
- 接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
- 灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
instanceof关键字
作用:用来判断某个对象是否属于某种数据类型。
-
注意: 返回类型为布尔类型
使用案例:
Fu f1=new Zi();
Fu f2=new Son();
if(f1 instanceof Zi){
System.out.println("f1是Zi的类型");
}
else{
System.out.println("f1是Son的类型");
}