主要内容:
1.类的封装
2.封装性与访问修饰符
3.防止类的扩展和方法覆盖
4.抽象类
5.对象转化与多态
1.类的封装1.1封装性
封装性是面向对象的一个重要特征。在Java语言中,对象就是一组变量和方法的封装体。
通过对象的封装,用户不必了解对象是如何实现的,只须通过对象提供的接口与对象进行交互就可以。
封装性实现了模块化和信息隐藏,有利于程序的可移植性和对象的管理。
1.2实现对象的封装的两种形式
(1)通过包实现封装性。在定义类时使用package语句指定类属于哪个包。包是Java语言最大的封装单位,它定义了程序对类的访问权限。
(2)通过类和类的成员的访问权限实现封装性。
2.1访问修饰符
类(也包括接口和枚举等)的访问权限通过访问修饰符实现,它定义哪些类可以使用该类。
类的两种访问修饰符
给类修饰符的访问权限
实现封装时可以用setXxx和getXxx,如下例:
2.2类继承的实现
实现类的继承,使用extends关键字,格式如下:
[public] class SubClass extends SuperClass{
// 类体定义
}
PS: 省略extends,定义的类继承Object类;Java仅支持单继承。
2.3方法覆盖
在子类中可以定义与父类中的名字、参数列表、返回值类型都相同的方法,这时子类的方法就叫做覆盖(overriding)或重写了父类的方法。
PS: 子类不能覆盖父类的private方法;父类中static方法可以被继承,但不能被覆盖。
2.4super关键字
在子类中可以使用super关键字,它用来引用当前对象的父类对象。
适用于以下三种情况:
1)在子类中调用父类中被覆盖的方法,格式为:
super.methodName([paramlist])
2)在子类中调用父类的构造方法,格式为:
super([paramlist])
3)在子类中访问父类中被隐藏的成员变量,格式为:
super.variableName
2.5调用父类的构造方法
子类不能继承父类的构造方法。要创建子类对象,需要使用默认构造方法或为子类定义构造方法。
Java语言规定,在创建子类对象时,必须先创建该类的父类对象。因此,在编写子类的构造方法时,必须保证它能够调用父类的构造方法。
在子类的构造方法中调用父类的构造方法有两种方式:
1)使用super来调用父类的构造方法
super([paramlist]);
2)调用父类的默认构造方法,编译器在子类的构造方法的第一句自动加上
super();
在任何情况下,创建一个类的实例时,将会沿着继承链调用所有父类的构造方法,这叫做构造方法链。
3.防止类的扩展和方法覆盖3.1final修饰类
类使用final修饰,则该类就为最终类(final class),最终类不能被继承。
3.2final修饰方法
方法使用final修饰,则该方法不能被子类覆盖。
3.3final修饰变量
用final修饰的变量包括类的成员变量、方法的局部变量和方法的参数。一个变量如果用final修饰,则该变量为常值变量,一旦赋值便不能改变。
4.抽象类比如要设计一个一般的类,比如几何形状(Shape)类,在该类中定义求周长和面积的方法。由于Shape不是一个具体的形状,这些方法就不能实现,因此要定义为抽象方法(abstract method)。
抽象类(abstract class)是包含抽象方法的类,使用abstract修饰;
抽象方法(abstract method)是只有声明,没有实现的方法,使用abstract修饰;
抽象类不能被实例化,定义抽象类的目的就是让其被继承的,抽象类中可以有非抽象的方法。
5.对象转化与多态5.1对象转化
子类定义的类型称为子类型,而父类(或接口)定义的类型称为父类型。
子类对象和父类对象在一定条件下可以相互转换,这种转换一般称为对象转换或造型(casting)。
转换对象分为:
1)自动转换 upcasting (向上转换)
子类对象可以自动转换为父类对象。可以将子类型的引用赋值给父类型的引用。
2)强制转换 使用()运算符(向下转换)
将父类对象强制转换为子类对象。用“()”运算符。将父类型的引用赋值给子类型的引用。
PS:不是任何情况下都可以进行强制类型转换(eg:如果试图将一个父类实例转换成子类类型,
则这个对象必须实际上子类实例才行(编译时类型是父类类型,而运行时类型是子类类型))
5.2多态与动态绑定
Java引用变量有两个类型:编译时类型和运行时类型;
编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
多态的核心:父类引用指向子类对象同时子类重写了父类方法。
多态(polymorphism)就是多种形式,它是指Java程序中一个类或多个类中可以定义多个同名方法,这多个同名方法完成的 *** 作不同,这就是多态。
多态的类型:
1)静态多态:也叫编译时多态,它通过方法重载实现。
2)动态多态:也叫运行时多态,它通过方法覆盖实现。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)