面向对象编程(中级部分)

IDEA使用

Idea除了支持Java开发,还支持HTML/CSS/PHP/MySql/Python等

安装

jetbrains.com

使用技巧

编码设置为utf-8
在这里插入图片描述

快捷键使用

快捷键修改位置:
在这里插入图片描述

  • 删除当前行:ctrl+d
  • 复制当前行:ctrl+↓
  • 补全代码:alt+/
  • 注释:ctrl+/
  • 导入该行需要的类:alt+enter
    在这里插入图片描述
  • 快速格式化代码:ctrl+alt +L
  • 快速运行程序:alt+r(需要先配置主类)
  • 生成构造器等:alt+insert
  • 查看类的层级关系:ctrl+H
  • 定位方法所在位置:ctrl+b
  • 自动补全代码:.var
  • 自动补全封装方法:alt+insert

模板/自定义模板

main就是一个模板
sout一条输出语句也是一个模板
fori循环也是一个模板
模板快捷键可以自己添加,能极大提高开发效率
在这里插入图片描述

包的作用:
1、区分相同名字的类
2、当类很多时,可以管理类。
3、控制访问范围

包的语法:
包的本质就是创建不同的文件夹来保存类

包的命名规则:
只能包含数字、字母、下划线、小圆点,不能用数字开头,不能是关键字或保留字。

命名规范:
com.公司名.项目名.业务模块

常用包:
java.lang.* :默认引用
java.util.:系统提供的工具包,使用Scanner
java.net.
:网络开发包
java.awt.*:界面开发包

导入包:
建议需要使用什么类导入什么类即可。

注意事项和细节:
1、package作用是声明当前类所在包,需要放在类最上面,一个类最多只有一个package
2、import位置放在package下面,可以有多条。

访问修饰符

java提供四种访问修饰符号,控制方法和属性的访问权限:
1、公开级别:public 对外公开
2、受保护级别:protected 对子类和同一个包的类公开
3、默认级别:向同一个包的类公开
4、私有级别:private 只有类本身可以访问,不对外公开

使用注意事项:

  • 修饰符可以修饰成员方法和成员变量
  • 只有默认的和public才能修饰类
  • 成员方法的规则和属性一致

封装(重要)

面向对象的三个特点,封装、继承、多态

封装:
就是把抽象出来的属性和对数据的操作方法封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作方法,才能对数据进行操作。

封装的好处:
1、隐藏实现细节
2、可以对数据进行验证,保证安全合理。

封装实现的步骤:

  1. 将属性私有化private(不可直接更改属性)
  2. 提供一个公共的(public)set方法,用于对属性判断并赋值
  3. 提供一个公共的(public)get方法,用于获取属性的值

特殊情况:setter和构造器一起使用
在构造器中调用set方法
在这里插入图片描述

继承(重要)

继承用来解决代码重复性。让我们的编程更加靠近人类思维,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。
在这里插入图片描述

继承的基础语法:

class 子类 extends 父类{
}
  1. 子类就会自动拥有父类定义的属性和方法
    2)子类又叫超类,基类。
    3)子类又叫派生类。

基础的好处:

  • 增强代码的复用性
  • 增强了代码的扩展性和维护性

基础细节问题:

  1. 子类继承了所有的属性和方法,但是私有属性不能在子类直接访问,要通过父类提供公共的方法去访问。
  2. 子类必须调用父类的构造器,完成父类的初始化
    系统会默认调用父类的无参构造器super();
  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
  4. 如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表);
  5. super在使用时,必须放在构造器的第一行;super关键字只能在构造器中使用
  6. super和this都只能放在第一行,因此这两个方法不能同时存在一个构造器中
  7. java所有类都是Object子类,Object是所有类的基类
  8. 父类构造器的调用不限于直接父类!将一直往上追溯直到Object类
  9. 子类最多只能继承一个父类,java是单继承机制。
  10. 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系

继承的本质分析:
创建子类对象时,内存中在发生什么?
当子类对象创建后,建立查找的关系
在这里插入图片描述

多态(重要)

问题是,代码的复用性不高,不利于代码维护
解决:多态

多态基本介绍:
方法或对象具有多种形态 ,是面向对象的第三大特征,多态是建立在封装和继承基础之上的。

多态的具体体现:
1、方法的多态(重写和重载体现多态)
2、对象的多态
(1)一个对象的编译类型和运行类型可以不一致
如用父类的引用指向一个子类的对象
Animal animal =new Dog()【animal的编译类型是Animal,但运行类型是Dog】
(2)编译类型在定义对象时就确定了,不能改变
(3)运行类型是可以变化的
(4)编译类型看定义时 =号左边,运行类型看=号右边。

多态的注意事项和细节讨论:
多态的前提是:两个对象(类)存在继承关系

多态的向上转型

  1. 本质:父类的引用指向子类的对象
  2. 语法:父类类型 引用名 = new 子类类型();
  3. 特点:编译类型看左边,运行类型看右边。
    可以调用父类的所有成员(要遵守访问权限)
    不能调用子类的特有成员;
    最终运行效果看子类的具体实现(能否调用由编译器决定)
    不能编译调用子类特有成员不代表运行的时候不去查找,调用方法时,按照从子类开始查找方法,然后开始调用。

多态的向下转型

  • 语法:子类类型 引用名 = (子类类型) 父类引用;
  • 只能强转父类的引用,不能强转父类的对象;
  • 要求父类的引用必须指向的是当前目标类型的对象
  • 当向下转型后,可以用子类类型的所有成员

多态注意事项和细节讨论:
1、属性没有重写之说。直接看属性的编译类型(=号左边)
2、instanceOf比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型
3、方法的引用看运行类型,属性的引用看编译类型

Java的动态绑定机制:
1、当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
2、当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用。

多态的应用:
1)多态数组
数组的定义类型为父类类型,里面保存的实际元素类型为子类类型。
2)多态参数
方法定义的形参类型为父类类型,实参类型运行为子类类型。

super

基本介绍:代表父类的引用,用于访问父类的属性、方法、构造器

基本语法:

  1. 访问父类的属性,但是不能访问父类的private属性
    访问方式:super.属性
  2. 访问父类的方法,不能访问父类的private方法
    调用方式:super.方法
  3. 访问父类的构造器
    super(参数列表)只能在第一行。

super的细节:

  • 调用父类的构造器好处(分工明确),父类属性由父类初始化,子类的属性由子类初始化
  • 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super/this直接访问是一样的效果。(super是直接查找父类,不会查找子类方法,其他规则一致)
  • super的访问不限于父类,一直向上查找,如果多个基类中都有同名的成员,使用super访问遵循就近原则,并遵守访问权限的相关规则。
    在这里插入图片描述

Override重写/覆盖

概念:
方法覆盖就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的那个方法。

方法重写注意事项和细节:
1、子类方法的参数、方法名要和父类完全一致。
2、子类方法的返回类型和父类方法的返回类型一致,或者是父类返回类型的子类。
3、子类方法不能缩小父类方法的访问权限,可以扩大父类的访问权限,如父类是protected,子类可以是public
权限:public>protected>默认>private

在这里插入图片描述

Object类详解

equals方法

==和equals对比
“==”


==是比较运算符
1== 既可以判断基本类型,又可以判断引用类型
2== 如果判断基本类型,判断的值是否相等
3== 如果判断引用类型,判断的是地址是否相同,判断是否为同一个对象。

equals
1、是Object类的方法,只能判断引用类型
2、默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。如String,Integer

如何查看源码:
Ctrl+B
如果没有需要手动添加
在这里插入图片描述
如何重写equals方法

hashCode方法

返回该对象的哈希码值(提高哈希表的性能)
1、提高具有哈希结构的容器的效率
2、两个引用,如果指向的是同一个对象,则哈希值肯定是一样的。
3、两个引用,如果指向的是不同对象,则哈希值是不一样的
4、哈希值主要根据地址号来的
5、后面在集合中hashCode可能需要重写。

toString方法

toString方法默认返回;全类名+@+哈希值的十六进制

1、toString方法一般用于重写,打印对象或拼接对象。
2、当直接输出一个对象时,toString方法会被默认调用。

finalize

finalize可以被重写,可写自己的业务逻辑代码(比如释放资源:数据库连接,或者打开文件等)
1、当对象呗回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作。
2、什么时候回收:Danger某个对象没有任何引用时。
3、垃圾回收机制的调用,是由系统决定的(有自己的GC算法)System.gc() 主动触发垃圾回收机制

实际开发中,几乎不会去运用,更多的为了应付面试。

断点调试

用来排除错误,断点调试过程中是运行状态,是以对象的运行类型来执行的。

debug
断点调试是程序员必须掌握的技能。
断点调试也能帮助我们查看java底层源代码的执行过程,提高java水平。

断点调试快捷键:
F7跳入方法内
F8跳过逐行执行
shift+F8 跳出方法
F9(resume,执行到下一个断点)

在debug过程中怎么追踪源码

断点可以在debug过程中,动态的下断点

项目学习

编程思想:

  • 化繁为简
  • 一段代码完成一个小功能
  • 进行一系列判断时尽量找不满足的条件(过关斩将的编程方式)

构造器:
子类的有参构造中默认执行父类的无参构造(super方法)

多态:
1、写代码的时候只认编译类型(=号左边)
2、执行的时候会先认运行类型(=号右边)
在这里插入图片描述
动态绑定:
1、当调用对象方法时,该方法会和对象的内存地址/运行类型绑定/2、当调用对象属性时,没有动态绑定,哪里声明哪里使用

准备工具类Utility,提高开发效率
实际开发中,公司都会提供工具类和开发库,提高开发效率
1、了解Utility类的使用
2、测试Utility类

静态方法调用:通过类名.方法名()调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值