肖sir__Java三大特性封装、多态,继承14
1.1 封装
===========================================
===========================================
什么是封装?
例如:一台计算机内部极其复杂,有主板、CPU、硬盘和内存, 而一般用户不需要了解它的内部细节,不需要知道主板的型号、CPU 主频、硬盘和内存的大小,于是计算机制造商将用机箱把计算机封装起来,对外提供了一些接口,如鼠标、键盘和显示器等,这样当用户使用计算机就非常方便。
Java中封装的概念:
封装是Java编程语言的三大特征之一。
Java中的封装是将类中某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。封装是一种信息隐藏技术。
封装的特点:
1,只能通过规定的方法访问数据。
2,隐藏类的实例细节,方便修改和实现。
1.2 封装
实现封装的具体步骤如下:
1,修改属性的可见性来限制对属性的访问,一般设为 private。
2,为每个属性创建一对赋值(setter)方法和取值(getter)方法,
一般设为 public,用于属性的读写。
3,在赋值和取值方法中,加入属性控制语句(对属性值的合法性进行判断)。
实例:封装一个员工类,员工有姓名,年龄,性别等属性,员工的性别只能是男或女员工的年龄必须在18-35岁之间,员工的姓名不能为空。
提示:通过封装,实现对属性的数据访问限制,满足了年龄的条件。在属性的赋值方法中可以对属性进行限制操作,从而给类中的属性赋予合理的值, 并通过取值方法获取类中属性的值。
2.1 继承
Java中的继承:
继承是Java编程语言的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性,从而减少代码冗余,提高程序运行效率。
Java中的继承就是在已经存在类的基础上进行扩展,从而产生新的类。已经存在的类
称为父类、基类或超类,而新产生的类称为子类或派生类。在子类中,不仅包含父类的属性和方法,还可以增加新的属性和方法。
Java中的继承通过 extends关键字来实现,extends 很好的体现了子类和父类的关系,即子类是对父类的扩展,子类是一种特殊的父类
2.3 继承
Java中子类继承父类的语法格式如下:
修饰符 class class_name extends extend_class {
// 类的主体
}
其中,class_name 表示子类(派生类)的名称;extend_class 表示父类(基类)的
名称;extends 关键字直接跟在子类名之后,其后面是该类要继承的父类名称。
例如:
public class Student extends Person{}
Java中子类继承父类,实例:
1,一个学生,一个老师,学生有移动端存储设备(U盘32G和移动硬盘128G),老师讲完课后需要把讲课内容资料文件拷贝给学生,学生会根据资料文件的大小来选择使用U盘还是移动硬盘来拷贝资料文件(文件资料超过1024M用移动硬盘,否则用U盘) 课件中文件内容的大小在100M-2000M之间编写一个主类,使用循环来模拟老师上课30天。那么请问30天后学生的U盘和移动硬盘中分别拷贝了多少份资料,U盘和移动硬盘的存储空间还各剩下多少M
2,使用Java继承特性编写程序来实现
左侧结构图中的关
2.5 继承
继承的特性:
1,子类拥有父类非 private 的属性、方法。
2,子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3,子类可以用自己的方式实现父类的方法。
4,Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父
类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C
类是 B 类的父类,B 类是 A 类的父类,
5,提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,
代码独立性越差)
final关键字:使用了final修饰的类不能继承,即最终类;如果修饰方法,则方法不能
被子类重写。
构造方法:子类不能继承父类的构造方法,但是子类能调用(隐式或显式)父类的构
造方法。如果在父类中存在有参的构造方法而并没有重载无参的构造方法,那么在子
类中必须含有有参的构造方法,因为如果在子类中不含有构造方法,默认会调用父类
中无参的构造方法,而在父类中并没有无参的构造方法,因此会出错。
super关键字,在子类中可以通过super关键字来指定调用父类的方法。
super.父类属性名:调用父类中的属性
super.父类方法名:调用父类中的方法
super():调用父类的无参构造方法
super(参数):调用父类的有参构造方法
继承的优缺点
继承的优点:
1,实现代码共享,减少创建类的工作量,使子类可以拥有父类的方法和属性。
2,提高代码维护性和可重用性。
3,提高代码的可扩展性,更好的实现父类的方法。
继承的缺点:
1,继承是侵入性的。只要继承,就必须拥有父类的属性和方法。
2,降低代码灵活性。子类拥有父类的属性和方法后多了些约束。
3,增强代码耦合性(开发项目的原则为高内聚低耦合)。当父类的常量、变量和方
法被修改时,需要考虑子类的修改,有可能会导致大段的代码需要重构
对象类型转换:向上转型和向下转型
将一个类型强制转换成另一个类型的过程被称为类型转换。对象类型转换,是指存在
继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转
换时,程序会抛出转换异常。
1,向上转型
父类引用指向子类对象为向上转型,语法格式如下:
fatherClass obj = new sonClass();
2,向下转型
与向上转型相反,子类对象指向父类引用为向下转型,语法格式如下:
sonClass obj = (sonClass) fatherClass;
说明:fatherClass是父类或接口名称,obj是创建的对象,sonClass 是子类名称。
什么是方法重写(Override)?
在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,
只是方法体中的实现不同,这种方式被称为方法重写(override),又称为方法覆盖。
方法重写需要遵循的规则:
1,参数列表必须完全与被重写的方法参数列表相同。
2,返回值类型必须与被重写方法的返回类型相同或者小于或者等于父类方法的返回
值类型。
3,访问权限不能比被重写方法的访问权限更低(public>protected>default>priva
te)。
4,重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常。例如,父类的一个方法声明了一个检査异常 IOException,在重写这个方法时就不能抛出 Exception,只能拋出 IOException 的子类异常,可以抛出非检査异常。
方法重写注意的点:
1,重写的方法可以使用 @Override 注解来标识。
2,父类的成员方法只能被它的子类重写。
3,声明为 final 的方法不能被重写。
4,声明为 static 的方法不能被重写,但是能够再次声明。
5,构造方法不能被重写。
6,子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为 private
和 final 的方法。
7,子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected
的非 final 方法。
8,如果不能继承一个方法,则不能重写这个方法。
方法重写和方法重载的区别:
1,方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同
而类型和次序不同,则称为方法的重载(Overloading)。
2,方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,
返回值也一样的方法,就称为重写(Overriding)。
3,方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
==================================================================
多态:
3.1 多态
多态是Java编程语言的三大特征之一,它是指父类中的方法被子类继承后,可以表现
出不同的行为,这使得同一个方法在父类及其各个子类中具有不同的含义。
多态的实现方式:
1,继承-方法重写
2,接口-方法实现
Java实现多态有3个必要条件:继承、重写和向上转型
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法
抽象类:
Java语言提供了两种类,分别为具体类和抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,
那么这样的类称为抽象类。
抽象类的语法格式如下:
<abstract>class<class_name> {
<abstract><type><method_name>(parameter-iist);
}
说明:abstract表示该类或该方法是抽象的,class_name表示抽象类的名称
method_name表示抽象方法名称,parameter-list表示方法参数列表。
抽象类的定义和使用规则:
1,抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。
2,抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
3,抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现。
4,构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
5,抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
6,抽象类和抽象方法不能用final关键字修饰
抽象类,实例练习:
1,不同几何图形的面积计算公式是不同的,但是它们具有的特性是相同的,都具有长和宽这两个属性,也都具有面积计算的方法。请定义一个抽象类,在该抽象类中含有两个属性(width 和 height)和一个抽象方法 area( ),然后分别定义一个三角形类和长方形类继承该抽象类实现area方法来。