JAVA 面向对象(中级)

IDEA使用
  • IDEA安装

官网:https://www.jetbrains.com/

  • 目录结构

  • 快捷键使用

ctrl + y:删除当前行

ctrl + d:复制当前行

alt + /:补全代码

ctrl + /:注释和取消注释

配置好后使用 alt+ enter即可

ctrl + alt+ l:快速补全代码

ctrl + alt + L:格式化代码

ctrl + r:运行(需要自己修改)

alt + insert:生成构造器

ctrl + H:查看类的层级关系

ctrl + B:选择定位到哪个类的方法

在后面加.var:自动分配变量名。例:new Scanner(System.in).var

  • 模板/自定义模板

psvm:生成main模板

sout:生成输出模板

fori:生成for模板

  • 包的三大作用

区分相同名字的类

当类很多时,可以很好的管理类

控制访问范围

  • 包的基本语法

package com.hspedu;

说明

package:关键字,表示打包

com.hspedu表示包名

  • 包的本质分析

包的本质就是创建不同的文件夹来保存文件,示意图如下

  • 练习

创建小强和小明两个包,分别创建Dog类,然后使用test01分别引用

Dog.java Dog.java Test01.java

  • 命名

规则:

只能包含数字、字母、下划线、小圆点,但不能用数字开头,不能用关键字或保留字

demo.class.exc1 // 错误,class关键字

demo.12a // 错误,12a是数字开头

demo.ab12.oa // 正确

规范:

一般是小写字母 + 小圆点

com.公司名.项目名.业务模块名

比如:com.hspedu.oa.model

举例:

com.sina.crm.user // 用户模块

com.sina.crm.order // 订单模块

com.sina.crm.utils // 工具类

  • 常用的包

java.lang.* // lang包是基本包,默认引入,不需要再引入

java.util.* // util包,系统提供的工具包,工具类,Scanner

java.net.* // 网络包,网络开发

java.awt.* // 是做java的界面开发,GUI

  • 包的引入

我们需要哪个类就引入那个类即可,不建议使用*导入

import java.util.Scanner; //表示只会引入java.util 包下的 Scanner

import java.util.*; // 表示将java.util下的所有类都引入

  • 细节

package的作用是声明当前类所在的包,需要放在class的最上面,一个类中最多只有一句package

import指令位置放在package的下面,在类定义的前面,可以有多句,且没有顺序要求。

访问修饰符
  • 介绍

java提供了四种访问控制修饰符号,控制方法和属性(c成员变量)的访问权限:

  1. 公开级别:用public修饰,对外公开

  1. 受保护级别:用protected修饰,对子类和同一个包中的类公开

  1. 默认级别:没有修饰符号,向同一个包的类公开

  1. 私有级别:用private修饰,只有类本身可以访问,不对外公开

  • 注意事项

修饰符可以用来修饰类中的属性,成员方法以及类

只有默认和public才能修饰类,并遵循上述访问权限的特点。

成员方法的访问规则和属性完全一样

  • 演示

A.java

B.java

test.java

TestModifier.java

面向对象的三大特征
封装
  • 介绍

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

  • 优点

隐藏实现细节:方法(连接数据库) <-- 调用(传入参数..)

可以对数据进行验证,保证安全合理

  • 实现步骤

  1. 将属性进行私有化private【不能直接修改属性】

  1. 提供和一个公共的(public)set方法,用于对属性判断并赋值

public void setXxx(){ // Xxx表示某个属性
    // 加入数据验证和业务逻辑
}
  1. 提供一个公共的(public)get方法,用于获取属性值

public void getXxx(){ // 属性判断Xxx表示某个属性
    return Xxx;
}
  • 案例

Encap.java

继承
  • 介绍

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

  • 示意图

  • 基本语法

class 子类 extends 父类{

}
  1. 子类就会自动拥有父类定义的属性和方法

  1. 父类又叫超类,基类

  1. 子类又叫派生类

  • 练习

Extends01.java

  • 细节

  1. 子类继承所有的属性和方法(包括私有属性),非私有的方法和属性可以直接访问,但是私有属性和方法不能被子类直接访问,要通过父类提供的公共方法去访问。 Sub.java

  1. 子类必须调用父类的构造器,完成父类的初始化

  1. 当创建子类对象时,不管使用子类哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成父类的初始化操作,否则,编译不通过

  1. 如果希望指定去调用父类的某个构造器,则显式调用一下super(参数列表)

  1. super在使用时,需要放在构造器第一行

  1. super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器

  1. java所有类都是Object类,Object是所有类的基类

  1. 父类构造器的调用不限于直接父类,将一直往上追溯到Object(顶级父类)

  1. 子类最多只能继承一个父类(指直接继承),即java中是单继承机制。

  1. 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系

继承本质分析 ExtendsTheory.java

子类继承所有的属性和方法,非私有属性和方法可以在子类直接访问,但是私有属性和方法不能在子类中直接访问,需要通过父类提供的公共方法去访问

  • 练习

super关键字
  • 基本介绍

super代表父类的引用,用于访问父类属性、方法、构造器

  • 基本语法

  1. 访问父类的属性,但不能访问父类的private属性

  1. 访问父类的方法,但不能访问父类的private方法

  1. 访问父类的构造器

Super01.java

  • super给编程带来的便利

  1. 调用父类构造器的好处(分工明确,父类的属性由父类初始化,子类的属性由子类初始化)

  1. 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。

  1. super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super访问爷爷类的成员;如果多个基类(上级类)中都有同名成员,使用super访问遵循就近原则,也需要遵守访问权限的规定。

Super01.java

  • super和this的比较

  • 已学内容

方法的重写与覆盖
  • 基本介绍

简单地说:方法覆盖(重写)就是子类的一种方法和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的那个方法

  • 初次尝试

Override01.java

  • 细节

  1. 子类方法的参数、名称,要和父类方法的参数、名称完全一样

  1. 子类方法的返回类型和父类方法的返回类型一样,或者是父类返回类型的子类,比如父类返回类型是Object,子类返回类型是String。:

public Object getInfo(){}

public String getInfo(){}

  1. 子类方法不能缩小父类方法的访问权限

void soyOk(){} public void sayOk(){}

Override01.java

OverrideDetial.java

  • 课堂练习

多态

Poly01.java

  • 介绍

即方法或对象的多种形态,是面向对象的第三大特征,多态建立在封装和继承的基础上。

  • 多态的体现

  1. 对象的多态

一个对象的编译类型和运行类型可以不一致

编译类型在定义对象时,就确定了,不能改变

编译类型是可以变化的

编译类型看定义时 = 号 的左边,运行类型看 = 号 的右边

  1. 案例:

Animal animal = new Dog();【animal的编译类型是Animal,运行类型是Dog】

animal = new Cat();【animal的运行类型变成Cat,编译类型仍然是Animal】

Poly01.java

  • 细节

多态的前提:两个类存在继承关系

多态的向上转型

  1. 本质:父类的引用指向了子类的对象

  1. 语法:父类类型 引用名 = new 子类类型();

  1. 特点:编译类型看左边,运行类型看右边。可以调用父类的所有成员(须遵守访问权限),不能调用子类特有成员;最终运行效果看子类的具体体现

多态的向下转型

  1. 语法:子类类型 引用名 = (子类类型)父类引用

  1. 只能强转父类的引用,不能强转父类的对象

  1. 要求父类的引用必须指向的是当前目标类型的对象

  1. 可以调用子类类型中的所有成员

PolyDetail.java

属性没有重写之说

PolyDetail02.java

instanceOf比较运算符,用于判断对象的运行类型是否为XX类型或者X类型的子类型

PolyDetail03.java

  • 练习

  • 动态绑定机制

当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定。

当调用对象属性时,没有动态绑定机制,哪里声明,那里使用。

DynamicBinding.java

  • 多态的应用

多态数组

数组的定义类型为父类类型,里面保存的实际元素类型为子类类型

PolyArray.java

PolyParameter.java

object类详解
  • equals方法

== 和equals的对比

==是一个比较运算符

  1. ==:既可以判断基本类型,又可以判断引用类型

  1. ==:如果判断基本类型,判断的是值否相等

  1. ==:如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象

  1. equals:是object类中的方法,只能判断引用类型

  1. 默认判断的是地址是否相等,子类往往重写该方法,用于判断内容是否相等。比如Integer,String

练习

EqualsExe01.java

  • hashCode方法

介绍:返回对象的哈希码值,支持此方法是为了提高哈希表的性能

小结:

  1. 提高具有哈希结构的容器的效率

  1. 两个引用,如果指向的是同一个对象,则哈希值是一样的

  1. 两个引用,如果指向的是不同的对象,则哈希值不同

  1. 哈希值主要是根据地址号来的,不能完全将哈希值等价于地址

  1. obj.hashCode() [测试:A obj1 = new A(); A obj2 = new A(); A obj3 = obj1]

  1. 后面在集合中,hashCode如果需要的话,也会重写

  • toString方法

介绍:默认返回全类名+@+哈希值的十六进制,【查看Object的toString方法】,子类往往重写toString方法,用于返回对象的属性信息

重写toString方法,打印或拼接对象时,都会自动调用该对象的toString形式

直接输出一个对象时,toString方法会被默认调用System.out.println(monster),调用manster的toString方法

  • finalize方法

当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作

什么时候被回收,当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁对象,在销毁对象前,会先调用finalize方法

垃圾回收机制的调用,是由系统来定(即有自己的GC算法),也可以通过System.gc()主动触发垃圾回收机制

实际开发中几乎不会用到finalize,面试会问到

断点调试
  • 介绍

断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量的当前值,出错的话,调试到出错的代码行即显示错误,停下。进行分析从而找到这个bug

断点调试是程序员必须掌握的技能

断点调试也能帮助我们查看java底层源代码的执行过程,提高程序员的Java水平

  • 快捷键

F7(跳入),F8(跳过),shift+F8(跳出),F9(resume,执行到下一个断点)

F7:跳入方法内

F8:逐行执行代码

shift+F8:跳出方法

Debug01.java

Debug02.java

Debug03.java

Debug04.java

  • 练习

创建对象过程 DebugExe.java

零钱通开发

使用Java开发零钱通项目,实现收益入账,消费,查看明细,退出系统等功能。

SmallChangeSys.java

作业

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值