ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【小白转码】06

2022-03-27 09:00:39  阅读:171  来源: 互联网

标签:重写 06 变量 转码 子类 小白 类型 父类 方法


第六章

一、封装 encapsulation

1.遵循的原则

随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”,而“高内聚,低耦合”的体现之一:

  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;

  • 低耦合:仅对外暴露少量的方法用于使用

通俗的讲,封装就是把该隐藏的隐藏起来,该暴露的暴露出来。

 

2.权限修饰符

权限修饰符共有4种,分别为public,protected、缺省、private;权限修饰符可以使得数据在一定范围内可见或者隐藏。

修饰符本类本包其他包子类任意位置
private × × ×
缺省 × ×
protected ×
public

权限修饰符可以修饰:

外部类:public和缺省

成员变量、成员方法、构造器、成员内部类:public,protected,缺省,private

 

3.类的封装

  1. 类的封装的意义:

    • 隐藏类的实现细节

   - 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。
   - 便于修改,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9,String从char[]转为byte[]内部实现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。
  1. 如何进行类的封装?

    • 成员变量(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 方法重写的具体要求:

  1. 必须保证父子类之间重写方法的名称相同。

  2. 必须保证父子类之间重写方法的参数列表也完全相同。

  3. 子类方法的返回值类型必须【小于等于】父类方法的返回值类型(小于其实就是是它的子类,例如:Cat< Animal)。

    注意:如果返回值类型是基本数据类型和void,那么必须是相同

  4. 子类方法的权限必须【大于等于】父类方法的权限修饰符。

    注意:public > protected > 缺省 > private

    父类私有方法不能重写

    跨包的父类缺省的方法也不能重写

另外:

静态方法不能被重写,方法重写指的是实例方法重写,静态方法属于类的方法不能被重写,而是隐藏。

final修饰的方法不能被重写

父类private方法不能重写

三、多态polymorphism

1.多态的形式

Java规定父类类型的变量可以接收子类类型的对象,这一点从逻辑上也是说得通的。

父类类型 变量名 = 子类对象;

父类类型:指子类继承的父类类型,或者实现的父接口类型。

所以说继承是多态的前提

//多态的引用形式
Animal a = new Cat();//Cat对象也属于其父类Animal类型。猫也是一个动物。

 

2.多态的表现

多态引用形式的具体表现:编译时类型与运行时类型不一致,编译时看左边的“父类”,运行时看右边的“子类”。

也就是我们常说的:编译看左边,运行看右边。

3.多态的好处

运行时,看“子类”,如果子类重写了方法,一定是执行子类重写的方法;变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。

  1. 提高程序的扩展性(参考引入案例分析)

  2. 降低类与类之间的耦合度(参考引入案例分析)

 

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.类的封装

  1. 类的封装的意义:

    • 隐藏类的实现细节

   - 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。
   - 便于修改,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9,String从char[]转为byte[]内部实现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。
  1. 如何进行类的封装?

    • 成员变量(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 方法重写的具体要求:

  1. 必须保证父子类之间重写方法的名称相同。

  2. 必须保证父子类之间重写方法的参数列表也完全相同。

  3. 子类方法的返回值类型必须【小于等于】父类方法的返回值类型(小于其实就是是它的子类,例如:Cat< Animal)。

    注意:如果返回值类型是基本数据类型和void,那么必须是相同

  4. 子类方法的权限必须【大于等于】父类方法的权限修饰符。

    注意:public > protected > 缺省 > private

    父类私有方法不能重写

    跨包的父类缺省的方法也不能重写

另外:

静态方法不能被重写,方法重写指的是实例方法重写,静态方法属于类的方法不能被重写,而是隐藏。

final修饰的方法不能被重写

父类private方法不能重写

三、多态polymorphism

1.多态的形式

Java规定父类类型的变量可以接收子类类型的对象,这一点从逻辑上也是说得通的。

父类类型 变量名 = 子类对象;

父类类型:指子类继承的父类类型,或者实现的父接口类型。

所以说继承是多态的前提

//多态的引用形式
Animal a = new Cat();//Cat对象也属于其父类Animal类型。猫也是一个动物。

 

2.多态的表现

多态引用形式的具体表现:编译时类型与运行时类型不一致,编译时看左边的“父类”,运行时看右边的“子类”。

也就是我们常说的:编译看左边,运行看右边。

3.多态的好处

运行时,看“子类”,如果子类重写了方法,一定是执行子类重写的方法;变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。

  1. 提高程序的扩展性(参考引入案例分析)

  2. 降低类与类之间的耦合度(参考引入案例分析)

 

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有