java面向对象三大特性:封装、继承和多态--Java笔记

本文详细介绍了Java的面向对象三大特性:封装、继承和多态。封装强调隐藏细节,通过get/set方法操作私有属性;继承允许子类继承父类属性和方法,一个类只能继承一个父类;多态则基于封装和继承,包括方法多态和对象多态,涉及向上转型、向下转型、动态绑定机制等概念。
摘要由CSDN通过智能技术生成

目录

一.封装

1.隐藏细节,保障数据安全

2.将属性私有化不能直接修改属性

3.提供get和set方法来获取和赋值 

二.继承

1.子类继承了父类所有的属性和方法,私有属性和方法要通过在父类创建公共的get方法来访问

2.子类必须调用父类的构造器来使父类完成初始化

3.创建子类对象时,不管使用哪个构造器默认都会调用父类的无参构造器(构造器里面默认有一个super())父类没有无参构造器则需要指定一个构造器来使父类完成初始化

4.java中object是祖宗类,其他所有类都是object的子类

5.一个类只能继承一个父类,子类与父类之间要存在某种关联,不能一个人继承一个日本人(因为日本人不是人)

三.多态

多态有方法的多态和对象的多态,重载和重写就体现出了多态

多态是建立在封装和继承基础之上的,且两个对象要存在继承关系

=左边为编译类型,=右边为运行类型,一个对象的编译类型和运行类型是可以不一致的,编译类型在定义时就确定了,而运行类型是可以改变的

​​

​​

1.向上转型

①.编译类型为父类,运行类型为子类

②.调用父类属性或方法时要遵循访问权限,不能调用子类的属性和特有的方法

2.向下转型

①.向下转型之前必须向上转型

②.可以调用子类所有的属性和方法

 3.对象的多态和instanceOf

​​ 

 instanceOf:用于判断对象的运行类型是否为某类型或某类型的子类型 

4.动态绑定机制

①.调用方法时,引用名会和运行类型(子类)进行绑定,首先找子类

②.属性没有动态绑定机制

5.多态数组

数组的定义类型为父类,保存的元素为子类

6.多态参数

定义方法时的形参为父类,传入的实参为子类


一.封装

1.隐藏细节,保障数据安全

2.将属性私有化不能直接修改属性

3.提供get和set方法来获取和赋值 

创建一个A类,创建四个属性,name和count设为公共的,password和money设为private的

创建两个构造器一个无参的,一个有参的,有参的里面调用set方法防止通过构造器来访问或修改属性值

创建一个scanner对象用来接收输入的值

分别给四个属性创建get和set方法,私有属性的get方法加上密码判断,所以的set方法加上一定的规定(毕竟不能太离谱)

 

创建一个info方法来获取全部信息(当然要输密码)

 一.创建一个A对象实例,用set方法来进行赋值,通过get方法来获取并打印,再通过info方法来获取信息,最后关闭scanner

可以看出name和count时直接输出的,剩下的都要输一遍密码

 二.通过构造器来进行赋值 ,然后调用info方法

输出:                                                                                                   故意输错一次

  

二.继承

1.子类继承了父类所有的属性和方法,私有属性和方法要通过在父类创建公共的get方法来访问

2.子类必须调用父类的构造器来使父类完成初始化

3.创建子类对象时,不管使用哪个构造器默认都会调用父类的无参构造器(构造器里面默认有一个super())父类没有无参构造器则需要指定一个构造器来使父类完成初始化

4.java中object是祖宗类,其他所有类都是object的子类

5.一个类只能继承一个父类,子类与父类之间要存在某种关联,不能一个人继承一个日本人(因为日本人不是人)

在A类创建四个不同访问修饰符的属性,创建一个get方法来访问私有的n4,创建一个有参构造器

B类继承A类,指定父类的有参构造器,然后用get方法来获取私有属性并打印。

输出:

由于父类没有无参构造器报错

三.多态

多态有方法的多态和对象的多态,重载和重写就体现出了多态

多态是建立在封装和继承基础之上的,且两个对象要存在继承关系

=左边为编译类型,=右边为运行类型,一个对象的编译类型和运行类型是可以不一致的,编译类型在定义时就确定了,而运行类型是可以改变的

 创建一个steam类和一个tx类为两个父类,创建dota类和csgo类继承steam类,创建lol类和dnf类继承tx类,所有类创建一个相同名字的属性和一个play方法,四个子类创建一个tese方法

 

1.向上转型

①.编译类型为父类,运行类型为子类

②.调用父类属性或方法时要遵循访问权限,不能调用子类的属性和特有的方法

可以看出编译类型和运行类型是可以不一致的,编译类型全都为父类,运行类型全都为子类。

不能调用子类的属性,输出的结果可以看出id属性打印的全是父类的

输出 

可以看出不能调用子类特有的方法

2.向下转型

①.向下转型之前必须向上转型

②.可以调用子类所有的属性和方法

可以看出在进行向下转型后是可以调用子类的id和tese方法的

输出 

可以看出如果不进行向上转型是可以编译成功的,但是运行会报错,所以说向下转型之前必须进行向上转型

  输出:

 3.对象的多态和instanceOf

创建一个PLATFORM类和一个GAME类为父类,分别创建两个字类继承他们,都创建一个有参构造器,父类各创建一个属性并在有参构造器里面给属性赋值,子类的有参构造器里调用父类的有参构造器

 

再创建一个person类,创建一个属性、一个有参构造器 和一个play方法

在main方法中创建对象传入相应的参数并调用

输出: 

 instanceOf:用于判断对象的运行类型是否为某类型或某类型的子类型 

创建一个编译类型和运行类型均为game的对象,game是lol类型的父类,是game类型,是object类型的子类,所以输出  false、 true、 true

输出: 

 当编译类型为子类,运行类型为父类会报Type mismatch(类型不匹配)的错误

 

4.动态绑定机制

在进行向上转型后

①.调用方法时,引用名会和运行类型(子类)进行绑定,首先找子类

②.属性没有动态绑定机制

创建一个父类两个子类,都有一个属性id、一个get方法,给父类和一个子类创建一个i方法

在i方法中输出get方法和属性id

(4、5、6用的类图)

创建两个不同的子类对象,输出i方法。

可见game1调用了父类的i方法但是i方法中get方法是自己(lol类)的,这就是动态绑定机制,属性没有动态绑定机制,所以属性id是game的id,

game2有get方法和id所以输出的都是自己的

输出  

5.多态数组

数组的定义类型为父类,保存的元素为子类

这里还用上面的类,可见一样调用i方法,输出的结果是一样的

输出 

6.多态参数

定义方法时的形参为父类,传入的实参为子类

这里还用上面的类,再创建一个person类,person类里创建一个属性name和一个有参构造器,

创建一个play方法,形参为GAME类(父类),方法里输出get方法

创建一个person对象,调用play方法传入实参LOL类和CSGO类(子类)

输出可见确实调用了对应的get方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值