【小白转码】06
作者:互联网
第六章
一、封装 encapsulation
1.遵循的原则
随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”,而“高内聚,低耦合”的体现之一:
-
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
-
低耦合:仅对外暴露少量的方法用于使用
通俗的讲,封装就是把该隐藏的隐藏起来,该暴露的暴露出来。
2.权限修饰符
权限修饰符共有4种,分别为public,protected、缺省、private;权限修饰符可以使得数据在一定范围内可见或者隐藏。
修饰符 | 本类 | 本包 | 其他包子类 | 任意位置 |
---|---|---|---|---|
private | √ | × | × | × |
缺省 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
权限修饰符可以修饰:
外部类:public和缺省
成员变量、成员方法、构造器、成员内部类:public,protected,缺省,private
3.类的封装
-
类的封装的意义:
-
隐藏类的实现细节
-
- 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。
- 便于修改,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9,String从char[]转为byte[]内部实现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。
-
如何进行类的封装?
-
成员变量(field)私有化
-
提供标准的get/set方法
-
二、基础 inherit
1.Java中的继承
Java中有父类、子类的概念,类似生活中的父子关系,父类中的一些属性和方法可以被子类继承下来使用,不再需要重复定义。
2.继承的特点
2.1 子类会继承父类所有的成员变量和方法
2.2 子类无法直接使用父类的私有成员
2.3 Java只支持单继承
2.4 Java支持多层继承
2.5 一个类可以同时拥有多个子类
3.方法的重写 override
当子类继承了父类的某个方法之后,发现这个方法并不能满足子类的实际需求,那么可以通过方法重写,覆盖父类的方法。
3.1 方法重写:
子类中定义与父类中相同的方法,一般方法体不同,用于改造并覆盖父类的方法。
3.2 方法重写的具体要求:
-
必须保证父子类之间重写方法的名称相同。
-
必须保证父子类之间重写方法的参数列表也完全相同。
-
子类方法的返回值类型必须【小于等于】父类方法的返回值类型(小于其实就是是它的子类,例如:Cat< Animal)。
注意:如果返回值类型是基本数据类型和void,那么必须是相同
-
子类方法的权限必须【大于等于】父类方法的权限修饰符。
注意:public > protected > 缺省 > private
父类私有方法不能重写
跨包的父类缺省的方法也不能重写
另外:
静态方法不能被重写,方法重写指的是实例方法重写,静态方法属于类的方法不能被重写,而是隐藏。
final修饰的方法不能被重写
父类private方法不能重写
三、多态polymorphism
1.多态的形式
Java规定父类类型的变量可以接收子类类型的对象,这一点从逻辑上也是说得通的。
父类类型 变量名 = 子类对象;
父类类型:指子类继承的父类类型,或者实现的父接口类型。
所以说继承是多态的前提
//多态的引用形式
Animal a = new Cat();//Cat对象也属于其父类Animal类型。猫也是一个动物。
2.多态的表现
多态引用形式的具体表现:编译时类型与运行时类型不一致,编译时看左边的“父类”,运行时看右边的“子类”。
也就是我们常说的:编译看左边,运行看右边。
3.多态的好处
运行时,看“子类”,如果子类重写了方法,一定是执行子类重写的方法;变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。
-
提高程序的扩展性(参考引入案例分析)
-
降低类与类之间的耦合度(参考引入案例分析)
4.向上转型与向下转型
首先,一个对象在new的时候创建是哪个类型的对象,它从头至尾都不会变。即这个对象的运行时类型,本质的类型用于不会变。但是,把这个对象赋值给不同类型的变量时,这些变量的编译时类型却不同。
这个和基本数据类型的转换是不同的。基本数据类型是把数据值copy了一份,相当于有两种数据类型的值。而对象的赋值不会产生两个对象。
1、为什么要类型转换呢?
因为多态,就一定会有把子类对象赋值给父类变量的时候,这个时候,在编译期间,就会出现类型转换的现象。
但是,使用父类变量接收了子类对象之后,我们就不能调用子类拥有,而父类没有的方法了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子类特有的方法,必须做类型转换,使得编译通过。
-
向上转型:当左边的变量的类型(父类) > 右边对象/变量的类型(子类),我们就称为向上转型
-
此时,编译时按照左边变量的类型处理,就只能调用父类中有的变量和方法,不能调用子类特有的变量和方法了
-
但是,运行时,仍然是对象本身的类型,所以执行的方法是子类重写的方法体。
-
此时,一定是安全的,而且也是自动完成的
-
-
向下转型:当左边的变量的类型(子类)<右边对象/变量的编译时类型(父类),我们就称为向下转型
-
此时,编译时按照左边变量的类型处理,就可以调用子类特有的变量和方法了
-
但是,运行时,仍然是对象本身的类型
-
不是所有通过编译的向下转型都是正确的,可能会发生ClassCastException,为了安全,可以通过isInstanceof关键字进行判断
-
5.如何向上转型与向下转型
向上转型:自动完成
向下转型:(子类类型)父类变量
6.instanceof关键字
instanceof
关键字用于判断一个对象的运行时类型
为了避免ClassCastException
的发生,Java提供了 instanceof
关键字,给引用变量做类型的校验,只要用instanceof
判断返回true的,那么强转为该类型就一定是安全的,不会报ClassCastException
异常。
格式:
变量/匿名对象 instanceof 数据类型
那么,哪些instanceof
判断会返回true呢?
-
变量/匿名对象的编译时类型 与
instanceof
后面数据类型是直系亲属关系才可以比较 -
变量/匿名对象的运行时类型<= instanceof后面数据类型,才为true
第六章
一、封装 encapsulation
1.遵循的原则
随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”,而“高内聚,低耦合”的体现之一:
-
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
-
低耦合:仅对外暴露少量的方法用于使用
通俗的讲,封装就是把该隐藏的隐藏起来,该暴露的暴露出来。
2.权限修饰符
权限修饰符共有4种,分别为public,protected、缺省、private;权限修饰符可以使得数据在一定范围内可见或者隐藏。
修饰符 | 本类 | 本包 | 其他包子类 | 任意位置 |
---|---|---|---|---|
private | √ | × | × | × |
缺省 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
权限修饰符可以修饰:
外部类:public和缺省
成员变量、成员方法、构造器、成员内部类:public,protected,缺省,private
3.类的封装
-
类的封装的意义:
-
隐藏类的实现细节
-
- 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。
- 便于修改,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9,String从char[]转为byte[]内部实现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。
-
如何进行类的封装?
-
成员变量(field)私有化
-
提供标准的get/set方法
-
二、基础 inherit
1.Java中的继承
Java中有父类、子类的概念,类似生活中的父子关系,父类中的一些属性和方法可以被子类继承下来使用,不再需要重复定义。
2.继承的特点
2.1 子类会继承父类所有的成员变量和方法
2.2 子类无法直接使用父类的私有成员
2.3 Java只支持单继承
2.4 Java支持多层继承
2.5 一个类可以同时拥有多个子类
3.方法的重写 override
当子类继承了父类的某个方法之后,发现这个方法并不能满足子类的实际需求,那么可以通过方法重写,覆盖父类的方法。
3.1 方法重写:
子类中定义与父类中相同的方法,一般方法体不同,用于改造并覆盖父类的方法。
3.2 方法重写的具体要求:
-
必须保证父子类之间重写方法的名称相同。
-
必须保证父子类之间重写方法的参数列表也完全相同。
-
子类方法的返回值类型必须【小于等于】父类方法的返回值类型(小于其实就是是它的子类,例如:Cat< Animal)。
注意:如果返回值类型是基本数据类型和void,那么必须是相同
-
子类方法的权限必须【大于等于】父类方法的权限修饰符。
注意:public > protected > 缺省 > private
父类私有方法不能重写
跨包的父类缺省的方法也不能重写
另外:
静态方法不能被重写,方法重写指的是实例方法重写,静态方法属于类的方法不能被重写,而是隐藏。
final修饰的方法不能被重写
父类private方法不能重写
三、多态polymorphism
1.多态的形式
Java规定父类类型的变量可以接收子类类型的对象,这一点从逻辑上也是说得通的。
父类类型 变量名 = 子类对象;
父类类型:指子类继承的父类类型,或者实现的父接口类型。
所以说继承是多态的前提
//多态的引用形式
Animal a = new Cat();//Cat对象也属于其父类Animal类型。猫也是一个动物。
2.多态的表现
多态引用形式的具体表现:编译时类型与运行时类型不一致,编译时看左边的“父类”,运行时看右边的“子类”。
也就是我们常说的:编译看左边,运行看右边。
3.多态的好处
运行时,看“子类”,如果子类重写了方法,一定是执行子类重写的方法;变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。
-
提高程序的扩展性(参考引入案例分析)
-
降低类与类之间的耦合度(参考引入案例分析)
4.向上转型与向下转型
首先,一个对象在new的时候创建是哪个类型的对象,它从头至尾都不会变。即这个对象的运行时类型,本质的类型用于不会变。但是,把这个对象赋值给不同类型的变量时,这些变量的编译时类型却不同。
这个和基本数据类型的转换是不同的。基本数据类型是把数据值copy了一份,相当于有两种数据类型的值。而对象的赋值不会产生两个对象。
1、为什么要类型转换呢?
因为多态,就一定会有把子类对象赋值给父类变量的时候,这个时候,在编译期间,就会出现类型转换的现象。
但是,使用父类变量接收了子类对象之后,我们就不能调用子类拥有,而父类没有的方法了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子类特有的方法,必须做类型转换,使得编译通过。
-
向上转型:当左边的变量的类型(父类) > 右边对象/变量的类型(子类),我们就称为向上转型
-
此时,编译时按照左边变量的类型处理,就只能调用父类中有的变量和方法,不能调用子类特有的变量和方法了
-
但是,运行时,仍然是对象本身的类型,所以执行的方法是子类重写的方法体。
-
此时,一定是安全的,而且也是自动完成的
-
-
向下转型:当左边的变量的类型(子类)<右边对象/变量的编译时类型(父类),我们就称为向下转型
-
此时,编译时按照左边变量的类型处理,就可以调用子类特有的变量和方法了
-
但是,运行时,仍然是对象本身的类型
-
不是所有通过编译的向下转型都是正确的,可能会发生ClassCastException,为了安全,可以通过isInstanceof关键字进行判断
-
5.如何向上转型与向下转型
向上转型:自动完成
向下转型:(子类类型)父类变量
6.instanceof关键字
instanceof
关键字用于判断一个对象的运行时类型
为了避免ClassCastException
的发生,Java提供了 instanceof
关键字,给引用变量做类型的校验,只要用instanceof
判断返回true的,那么强转为该类型就一定是安全的,不会报ClassCastException
异常。
格式:
变量/匿名对象 instanceof 数据类型
那么,哪些instanceof
判断会返回true呢?
-
变量/匿名对象的编译时类型 与
instanceof
后面数据类型是直系亲属关系才可以比较 -
变量/匿名对象的运行时类型<= instanceof后面数据类型,才为true
标签:重写,06,变量,转码,子类,小白,类型,父类,方法 来源: https://www.cnblogs.com/gezigkd/p/16061891.html