JavaSE内容整理五

深入面向对象

一、包
作用:1.避免重名 2.模块划分
使用:域名.公司名.项目名.模块名 全部小写
eg:com.icss.bookshop.dao
package:哪个包下
import:导入包
快捷键:ctrl+shift+o—导包
F2/Fn+F2—修改源文件名字或者包名
Ctrl+D–删除一行
Ctrl+shift+F—格式化
Ctrl+/ --单行注释或者解开注释
Ctrl+shift+/—多行注释
Ctrl+shift±–解开多行注释
Ctrl+点击方法----定位到此方法
Alt+/----代码提示

二、访问权限修饰符
在这里插入图片描述
三、继承
1、为什么要使用继承?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2、继承的概念和声明形式
概念:子类能吸收已有类的数据属性和行为,并能扩展新的能力。
声明形式:【访问权限修饰符】【修饰符】子类名 extends 父类名{子类体}
3、继承的好处
(1)提高了代码的复用性:多个类相同的成员可以放到同一个类中(父类)
(2)提高了代码的维护性:如果功能的代码需要修改,修改一处即可
(3)让类与类之间产生了关系,是多态的前提.
其实这也是继承的一个弊端:类的耦合性很强
4、继承的注意事项
(1)Java只支持单继承,不支持多继承,但是支持多层继承(继承体系)
(2)子类只能继承父类所有非私有的成员(成员方法和成员变量)
其实这也体现了继承的另一个弊端:打破了封装性
(3)子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
(4)不要为了部分功能而去继承
5、继承中的成员变量
在子类方法中访问一个变量
首先在子类局部范围找
然后在子类成员范围找
最后在父类成员范围找(肯定不能访问到父类局部范围)
如果还是没有就报错。(不考虑父亲的父亲…)
6、super关键字
this代表本类对应的引用。
super代表父类存储空间的标识(可以理解为父类引用)
用法(this和super均可如下使用)
访问成员变量
this.成员变量 super.成员变量
访问构造方法
this(…) super(…)
访问成员方法
this.成员方法() super.成员方法()

7、继承中子父类的构造方法
(1)子类中所有的构造方法默认都会访问父类中无参数的构造方法。因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
(2)子类通过super去显示调用父类其他的带参的构造方法.
(3)super(…)或者this(….)必须出现在第一条语句上

8、继承中子父类的成员方法
通过子类对象去访问一个方法
(1)首先在子类中找
(2)然后在父类中找
(3)如果还是没有就报错。(不考虑父亲的父亲…)
9、继承中执行顺序
父类静态代码块—子类的静态代码块—父类的实例块—父类的构造方法–子类的实例块—子类的构造方法。
10、方法覆盖
方法覆盖(方法重写):子父类中 同名、同参、同返回值、访问权限不能缩小的方法

四、多态性

1.多态的含义
对外表现一种形态,内在有多种具体实现
eg:宠物类,实际可以是各种子类 酒 实际可以是白酒、啤酒
2.多态的体现
方法重载:同名不同参
方法覆盖(重写):同名、同参、同返回值、访问权限不能缩小
多态参数
3.向上造型
对象的向上造型(父类引用指向子类对象)
eg:Pet pet = new Dog() 父类 对象名= new 子类构造方法()
4.编译期类型和运行期类型
编译期:=左边的
运行期:=右边的
eg:Pet pet = new Dog() Pet–编译期类型 Dog()–运行期类型
编译看左,运行看右
5.向下造型
多态环境下:想要调用子类特有的方法的时候(父类中没有的),使用向下造型。
eg:Pet pet = new Dog();Dog dg = (Dog)pet; 子类类型 对象名= (子类)父类对象
6.多态环境下对属性和方法的调用特点
多态环境下对成员变量调用:编译和运行都看等号左边(父类),成员变量不存在被覆盖
多态环境下对静态成员变量的调用:编译和运行都看等号左边
多态环境下对成员方法的调用:编译看左,运行看右(如果子类没有此方法,就执行父类的方法)
多态环境下对静态成员方法的调用:编译和运行看左
7.多态参数
eg:方法的形式参数是父类类型,而实际传递的是任意的子类对象。
class Animal{
void eat() {}
}
class Cat extends Animal{
void eat() {}
}
class Dog extends Animal{
void eat(){}
}
//方法的形式参数类型是父类类型,而传递的实际参数可以是任意子类的对象
method(Animal animal){
animal .eat();
}
public static void main(String[] args) {
Test t = new Test();
t.eatMethod(new Dog());
t.eatMethod(new Cat());
}
8.instanceof运算符
对象 instanceof 类
该表达式为一个boolean表达式,如果对象的类型是后面提供的类或其子类,则返回true,反之返回false
public void play(Pet pet){
//判断pet是不是Dog类型
if (pet instanceof Dog) {
Dog dog = (Dog)pet; //向下造型,因为要调用子类特有的方法
dog.frisbee(); //调用接飞盘的方法
}else if (pet instanceof Penguin) {
Penguin penguin = (Penguin)pet; //向下造型
penguin.swimming(); //调用游泳的方法
}
}
五、抽象

1、抽象类
使用abstract修饰的类就是抽象类
抽象类不能被实例化,可以被继承,它有构造方法
如果不想创建某个类的对象,那么我们就定义成抽象类
2、抽象方法
没有方法体的方法就是抽象方法
【访问权限修饰符】abstract 返回值类型 抽象方法名(形参列表);
抽象方法必须在子类写具体实现
3、注意事项
(1)java中用abstract修饰抽象类和抽象方法,抽象方法必须位于抽象类中,抽象类中可以有非抽象方法
(2)抽象类不可以直接实例化,但是一定有构造方法。
(3)抽象类只可以用来继承作为其他类的父类存在,抽象类的派生子类应该提供对其所有抽象方法的具体实现。
(4)抽象方法没有方法体.

六、final修饰符
final修饰变量
[访问权限] final 数据类型 常量名 = 值;
注意:1.如果将某个变量修饰为final,那么该变量就成为常量
2.被final修饰的常量必须在初始化的时候赋值,并且不能被修改
3.赋值方式:可以直接赋值、也可以通过构造方法赋值,如果有多个构造方法,每个构造方法都要对常量赋值)

final方法
注意:1.如果将某个成员方法修饰为final,则意味着该方法不能被子类覆盖
2.final和abstract不能同时修饰一个方法
[访问权限] final 返回值类型 方法名(参数列表) {
……
return 返回值
}

final类
注意:1.被final修饰的类,不能被继承
2.Java中有一个最常用的final类:java.lang.String
七、static修饰符
static修饰属性
1.在成员变量前加static关键字,可以将其声明为静态成员变量
2.如果类中成员变量被定义为静态,那么就与对象无关,无论创建多少个对象,该静态成员变量被所有对象共享
3.如何调用静态成员变量:可以通过对象名也可以通过类名直接调用
4.静态成员变量的作用域只在类内部,但其生命周期却贯穿整个程序
5.在定义一个常量的时候,通常使用static和final一起修饰。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

结果:1 5
static修饰方法
1.在成员方法前加static关键字,可以将其声明为静态成员方法
2.静态成员方法只能对方法的局部变量或类的静态成员变量进行操作
3.静态成员方法没有this引用
4.可以通过类名或对象访问静态成员方法
5.API中Math类定义的全部是静态方法 Math.abs(-1)
6.静态方法和非静态方法之间的调用
静态方法–非静态方法:无法直接调用,创建对象,通过对象名.方法名()调用
静态方法–静态方法:直接通过类名调用
非静态方法–静态方法:直接通过类名调用(使用最多)
非静态方法–非静态方法:直接调用

import static
1.Static Import机制,可以用略掉所在的类或接口名的方式,来使用静态成员
eg:import static java.lang.Math.*; 可以直接使用Math类中的所有静态成员 abs(-5)

八、接口
1.接口的作用和声明形式
[访问权限] interface 接口名 {
公开静态常量列表;
公开抽象方法列表;
}
注意:1.在接口中只存在公开静态常量(即便没有使用static final修饰,Java也会默认确定其性质)
2.在接口中只存在公开抽象方法(即便没有abstract修饰,Java也会默认其抽象性质)
3.jdk8有默认方法
4.接口名–首字母大写 常量—全部大写
5.接口定义的是多个类都要实现的操作,即“what to do”;类可以实现接口,从而覆盖接口中的方法,实现“how to do”。

2.抽象类和接口的区别
在这里插入图片描述
3.实现类的声明形式
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
}
注意:1.最多继承一个类,也可以不继承
2.可以实现多个接口,多个接口用逗号分隔,也可以不实现接口
4.接口继承接口
Interface3 extends Interface0, Interface1, interface……{}
注意:1.Java类是单一继承,Java接口可以继承多个接口
2.接口继承接口依然使用关键字extends,不要错用成implements
5.接口默认方法(了解、不做重点)
在这里插入图片描述
6.面向接口编程
(1)三层架构
UI展示层—页面(测试–控制台输入)
业务层—业务逻辑(biz)
数据层—操作数据库,对数据库的增删改查(数组模拟数据库 dao)

com.icss.booksystem.ui—测试类
com.icss.booksystem.entity—实体类,大多数只包含属性、getset方法、构造方法
com.icss.booksystem.biz—业务层 biz接口 biz实现类
com.icss.booksystem.dao—数据层 dao接口 dao实现类

(2)使用三层架构编写图书商城—登入功能
User实体类:User属性:userId、userName、pwd、phone
方法:属性对应的get和set方法
构造方法:无参的,有全部参数的
IUserBiz接口:只写抽象方法,定义what to do 登入的抽象方法(login)
UserBizImpl实现类:实现IUserBiz接口,重写登入方法–调用dao层的方法
IUserDao接口:只写抽象方法,定义what to do 登入的抽象方法(login)
UserDaoImpl实现类:实现IUserDao接口,重写登入方法–模拟数据库操作(数组)
BaseDao:初始化数据在数组中,模拟数据库
Test类:ui页码–控制台输入

  调用顺序:Test--UserBizImpl(重写IUserBiz的抽象方法)的方法--UserDaoImpl(重写IUserDao的抽象方法)的方法(调用的过程中用到User、BaseDao)

(3)注册:从控制台输入信息,添加到users
Test:从控制台输入信息 userid usernanme pwd repwd phone 通过接口创建实现类对象,通过对象调用UserBizImpl的regisit方法。
IUserBiz:regist抽象方法 有没有返回值?布尔 有没有参数?有 5个参数 对象和String repwd
UserBizImpl—regist重写接口的抽象方法—先判断密码是否符合要求,如果符合继续调用UserDaoImpl的regist方法;如果不符合直接返回false
IUserDao:regist抽象方法 有没有返回值?布尔 有没有参数? 有 4个参数,对象类型
UserDaoImpl:regist重写方法 — 把传过来的对象保存到users数组里
1.先得到已有的数组
2.判断数据里有多少个有元素的数据,不是空 —遍历的过程中判断是不是null,如果不是null,使用计数器 统计已有多少条数据
3.把参数保存到users中
(4) 查看所有用户
登入成功后:
用户端:查看图书列表 查看图书详情 购买图书 查看个人信息 修改个人信息 修改密码 搜索图书
管理员端: 添加图书 查看图书 图书上架 图书下架 修改图书信息 添加库存 查看所有用户信息
如果区分是普通用户还是管理员?角色判断 role 1–普通用户 2管理员
Sys(1.添加图书 2.查看图书 3.图书上架 4.图书下架 5.修改图书信息 6. 添加库存 7查看所有用户信息 )
Test:从控制台输入信息要做什么7 通过接口创建实现类对象,通过对象调用UserBizImpl的finAllUser方法。
IUserBiz:finAllUser抽象方法 有没有返回值?有 User[] 有没有参数?没有 UserBizImpl—findAllUser重写接口的抽象方法—调用UserDaoImpl的findAllUser方法;
IUserDao:findAllUser抽象方法 有没有返回值?User[] 有没有参数? 没有
UserDaoImpl:findAllUser重写方法 —调用父类的getUsers方法

九、枚举
声明形式
[访问权限] enum 枚举名{
枚举值列表,多个用逗号分隔

在这里插入图片描述

十、关联与依赖
用户 :姓名、性别、买了哪些票。只可以买设置开放的票
票:编号、价格、状态
管理员:管理状态 可以设置开放或者关闭。
最后要输出 姓名、性别、编号、价格。

1.关联关系:表示has-a关系:一个类作为另一个类的属性存在
一对一关系:一个人只能有一个驾照
一对多关系:一个人可以有多本荣誉证书
2.依赖关系:表示 use a关系:一个类作为另一个类的参数存在
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

十一、内部类
1.内部类的声明与使用
(1)对于一个名为OuterClass的外围类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class
(2)在Java中内部类主要分为成员内部类、局部内部类、匿名内部类、静态内部类
2.成员内部类
(1)内部类可以直接使用外部类的成员变量
(2)注意构建内部类的形式
1.首先构建外部类对象
2.以外部类.内部类的形式进行声明
3.以外部类对象.new 内部类构造方法()的方式构建对象
在这里插入图片描述
3.局部内部类
注意:1.局部内部类可以直接操作外部类的成员变量,也可以调用方法的临时变量(包括方法的参数,final常量可以操作)
2.在方法内创建内部类对象
在这里插入图片描述
4.static内部类
它的创建是不需要依赖于外部类的;它不能使用任何外部类的非static成员变量和方法;和成员内部类不同,static内部类能够声明static的成员
1.可以定义static成员
2.static内部类构建对象时不需要依赖外部类的对象
在这里插入图片描述
5.this和外部类名.this
this和外部类名.this的区别
1.直接使用this引用的是内部类的对象自身
2.使用外部类名.this引用的是外部类的对象

6.匿名内部类
前提:匿名内部类必须继承一个父类或实现一个接口
声明形式:
[访问权限] [修饰符]父类名/接口名 引用名 = new 父类名/接口名([父类构造方法参数列表]){
匿名内部类成员;

注意:1.匿名内部类没有构造方法
在这里插入图片描述
7.JDK8lambda表达式(本节的重点)
Lambda表达式对返回的实例类型有比较严格的要求:
1.必须是接口
2.接口中只有一个需要实现的抽象方法,因此如果接口中有超过1个抽象方法需要实现的情况并不适用于lambda表达式
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

8.JDK8的 :: 关键字
::操作符主要用作静态方法、成员方法或构造方法的绑定

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值