第七章 : 面向对象编程(中级)
1.Idea
1.idea介绍
2.idea下载安装
3.idea的使用
1.初创一个项目
这里的srv就是源码,我们写的java项目的源代码都在这里
2.字体,界面,字符编码设置
这里可以修改字体(软件的字体),默认是12
Editor中的font可以调节代码的字体
调节粗体
此处可以改颜色主题
字符编码
上面是全局编码
下面是项目编码
3.使用快捷键开发项目
this window就是在当前工作区下面工作
new window 就是开一个新的工作区进行工作
这边为引用传递,所以在下面的类中改变的arr,在main方法中也会被改变
4.idea快捷键
Keymap可以查看快捷键,比如搜索delete,可以查看删除的快捷键为ctrl+y
我们也可以将其修改成ctrl+d
先将其移除
再添加
改成ctrl+d(我没有改)
也可以再keymap中查看复制的快捷键,输入duplicate,看见复制快捷键为ctrl+d
勾选之后软件就会自动import
Idea软件默认的快速格式化代码的快捷键为ctrl+Alt+L
Idea软件默认的运行快捷键为shift + F10(这里我改成了Alt+R)
第八条
第十一条
5.idea模版
这边可以自己添加模板
模板做好之后定义一下使用范围
常用模板
2.包
1.包的基本介绍
2.包原理
3.包快速入门
分别在xiaoming和xiaoqiang包下创建Dog类
上面的xiaoqiang的包将其写全,就可以不用引入import
4.包命名
5.常用的包
6.包的使用细节
3.访问修饰符
同类就是本类
这里的Test调用的是A中的main方法(public),main方法是A的同类
上面的test类是通过调用A中的public方法,本质上是A类对象访问本类的属性,而下面不是在调用A的方法而是直接跨类访问了
注意事项(1)
注意事项(2)
以下两种会报错
在本类中调用m1,m2,m3,m4都没有问题
在同一个包,不同类中m4的调用会出错
在不同包中,只能访问m1
4.封装
1.封装介绍
2.封装快速入门
这里给age赋值会出错,因为是private
3.封装和构造器
如果我们使用构造器,我们发现封装的效果就没了,我们写的set方法被构造器破解了
此时我们可以将set方法写在构造器中,这样仍然可以验证数据
果然控制住了
4.封装课堂练习
以下设置可以去掉说明
下面这个balance属性本生的默认值就是0,所以可以不用设置
再创建一个TestAccount类进行测试
5.继承
1.为什么需要继承
2.继承原理图
3.继承快速入门
4.继承使用细节
1.继承使用细节1
一个父类base
一个子类sub
如果想要访问private,则需要父类提供一个public方法
然后在子类中调用它
我们在main方法中测试一下
如果我们想要使用private方法,则可以在父类中定义一个public方法去调用它
然后在子类中调用
此时我们再运行main,发现此时test400被运行了
2.继承使用细节2
原因:子类中有默认的super(); 会调用父类的无参构造器
验证第一句话
验证第二句话
此时我们在父类base设置了一个有参构造器,则我们默认的无参构造器就没有了
此时我们的子类sub中就会报错
此时我们必须加一个super(“smith”,10);
Super(“tom”,30);来指定一下
此时在main中调用
3.继承使用细节3
现在我们父类base中有三个构造器
如果我们子类sub中什么也不写
则结果一样
如果我们调用父类中带一个参数的构造器
比如调用public Base(String name)这个
则我们在子类sub中要输入super(“hsp”);
此时main中的结果为
同理,如果要调用带两个参数的构造器
则在子类sub中输入super(“king”,20);即可
此时输出的结果为
看this细节那一个章节
4.继承使用细节4
第七条
第八条
5.继承本质详解
如果其中的age变成private属性
这边son是father的子类,所有可以直接使用getAge方法
6.继承课堂练习
Class B中
无参构造器因为有一个this,所以没有super();
有一个参数的构造器有一个super();会调用父类
父类Computer
子类pc
(另一个子类notepad就不写了)
注意。上面的this不是调用构造器的this
所以与super可以共存
主方法main
6.super关键字
1.super基本语法
父类A类
其实在这里不加super也可以调用父类A中的属性和方法
2.super使用细节
查找方法
查找属性
3.super和this比较
7.方法的重写/覆盖
1.介绍
2.细节
第二条;String是object的子类,所以仍然可以构成重写
但如果反过来就会报错
比如方法m2在子类Dog用object,父类Animal用string就会报错
第三条
比如父类的eat方法为protected,子类方法为public,就能成功运行
3.课堂练习
8.多态
1.养宠物引出多态
Food类
Fish类
Bone类
Animal类
Cat类
Dog类
Master类
Poly类(main方法)
2.方法的多态
3.对象的多态
可以把一个子类对象赋给一个父类的对象引用
也就是说我可以用一个父类的引用指向一个子类的对象
4.多态的快速入门
Dog与Cat是animal的子类,故可以运行成功
5.向上转型
父类Animal
子类Cat
Main
6.向下转型
下图中运用向上转型的过程无法调用cat中的catchMouse方法,所以要用到向下转型
Dog dog = (Dog) animal 会报错,不可以
7.属性重写问题(instanceof)
第一条
在这边属性和方法的不一样,属性这边直接看编译类型
下面base的编译类型为Base,故结果为10
(这个当做一个结论记住)
下面的sub的编译类型为Sub,故结果为20
第二条
下面的结果为false和true
注释掉的那一行编译不会通过
8.多态课堂练习
第一个:s.count是访问属性,看编译类型,故输出20
第二个:s.display()是查找关系,要从运行查找关系开始,这边的运行类型就是sub,故为20
第三个:b == s判断,比较的是地址,b与s指向的是同一个sub
第四个:b.count是访问属性,看编译类型,它的编译类型是Base
第五个:b.display()是查找关系,要从运行查找关系开始,他的运行类型是sub,故为20
9.动态绑定机制
当将32-34行注销之后
a.sum()会运行父类A中的a.sum()方法,
根据动态绑定机制,这里的getI()调用的是子类的gerI(),
所以说上面的输出a.sum()的结果变为30
当将40-42行也注销之后,再调用a.sum1()
由于属性没有动态绑定机制,所以sum1中的i在当前的类A中进行查找为10
a.sum1()的结果就为20
10.多态数组(多态应用)
父类person
子类student
子类teacher
main方法
先在teacher中加一个特有的方法teach
再在student中加一个特有方法study
我们发现无法通过person[i]调用它们的特有方法teach和study,因为person[i]的编译类型为Person类,而Person类是没有这两个方法的,编译通过不了
通过以下方法解决
11.多态参数(多态应用)
Employee类
worker类
Manager类
主方法