JavaHeiMa03
语法
包
- 包是用来分门别类的管理各种不同类的,类似于文件夹,建包有利于程序的管理和维护.
- 建包语法格式:package公司域名倒写,技术名称.包名建议全部英文小写,且具备意义.
- package com.itheima.javabean;
- 建包语句必须在第一行,一般idea工具会帮忙创建
导包
-
相同包下的类可以直接访问,不同包下的类必须导包,才可以使用!导包格式:import 包名.类名;
-
假如一个类中需要用到不同类,而这两个类的名称是一样的,那么默认只能导入一个类,另一个类要带包名访问.
权限修饰符
- 用来控制一个成员能够被访问的范围
- 可以修饰成员变量,方法,构造器,内部类,不同权限修饰符的成员能够被访问的范围将受到限制
作用范围
由小到大 (private-> 缺省(包类访问权限)->protected(子类访问权限)->public)
modifier 修饰符
final的作用
- final 关键字是最终的意思,可以修饰(类.方法.变量)
- 修饰类:表明该类是最终类,不能被继承
- 修饰方法:表面该方法是最终方法,不能被重写
- 修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)
final 修饰变量的注意事项
- final修饰的变量是基本类型:那么变量存储的数据值不能发生改变
- final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的
hobby 爱好
常量(constant)
-
唱两首使用public static final 修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变
-
作用和好处: 可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性.
-
//命名规范:英文单词全部大写 //多个单词下划线链接起来 public static final String SCHOOL_NAME = "传智教育";
执行原理
- 在编译阶段会处于"宏替换",把使用的常量全部替换成真实的字面量
- 这样做的好处是让使用常量的程序的执行性能与直接使用字面量一样的
选择常量做信息标志和分类:
- 代码可读性好,实现了软编码形式
- 约束性不足
枚举(enum)
Java中一种特殊类型
作用
是为了做信息的标志和信息的分类
格式
修饰符 enum 枚举名称{
第一行都是罗列枚举类实例的名称.
}
反编译后观察枚举的特征
特征
- 枚举类都是继承了枚举类型:java.lang.Enum
- 枚举都是最终类,不可以被继承
- 构造器的构造器都是私有的,枚举对外不能创建对象
- 枚举类的第一行默认都是罗列枚举对象的名称的.
- 枚举类相当于是多例模式
优点
- 代码可读性好,入参约束严谨,代码优雅,是最好的信息分类技术
- 建议使用
season(季节)
spring(春)
summer(夏)
autumn(秋)
winter(冬)
orientation 方向
抽象类
在Java中abstract是抽象的意思,可以修饰类,成员方法
abstract 修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法
特征
- 类的成员(成员变量,方法,构造器)抽象类都有
- 抽象类中不一定有抽象方法,有抽象方法的类有多少抽象类
- 最重要的特征 :得到了抽象方法,失去了创造对象的能力(有得有失)
注意事项
- 抽象方法只有方法签名,不能声明方法体
- 一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则报错.
- 一个类如果继承了抽象类,那么这个类必须重写完成抽象类的全部抽象方法,否则这个类也必须定义成抽象类
- 不能使用abstract修饰变量,代码块,构造器
使用场景
- 抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承.
- 当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成,此时这个类就可以声明成抽象类.
模板方法模式
使用场景
当系统中出现一个功能多出在开放,而该功能中大部分代码是一样的,只有其中部分可能不同的时候
模板方法模式实现步骤
- 把功能定义成一个所谓的模板方法,放在抽象类中,模板方法中只定义通用且能确定的代码
- 模板方法中不能决定的功能定义成抽象方法让具体子类去实现.
模板方法要有final修饰,防止子类重写,因为一但重写模板方法就失效了.更安全更专业.
解决的问题
- 提高了代码的复用性
- 模板方法已经定义了通用结构,模板方法不能确定的部分定义成抽象方法,交给子类实现,因此,使用者只需要关系自己需要实现的功能即可.
template (模板)
child(儿童)
middle(中间的)
接口(interface)
定义
接口是一种规范,规范一定是公开的
格式
//接口用关键字interface来定义
public interface 接口名{
//常量
//接口是一种规范,规范一定是公开的,在代码层面:public static final可以省略不写
//抽象方法
//接口是一种规范,规范一定是公开的,在代码层面:public abstract可以省略不写
}
law 法律
用法
接口是用来被类实现(implements)的,实现接口的类称为实现类,实现类可以理解成所谓的子类
修饰符 class 实现类 implements 接口1,接口2,...{
}
实现的关键字:implements
从上面可以看出:接口可以被类但是先,也可以被类多实现.
注意事项
- 一个类实现接口,必须重写完接口的全部抽象方法,否则这个类需要定义成抽象类.
接口多继承的作用
- 规范合并,整合多个接口为同一个接口,便于子类实现
JDK8开始后新增的方法
很少使用理解即可
- 默认方法: default修饰,实现类对象
- 静态方法:static修饰,必修当前接口名调用
- 私有方法:private修饰 ,jak9开始才有的,只能在接口内部被调用.
- 他们都会默认被public修饰
注意事项
- 接口不能创建对象(接口更加彻底的抽象)
- 一个类实现多个接口,多个接口中有同样的静态方法不冲突
- 原因是接口的静态方法不能被类调用,只能被接口本身调用.
- 一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的.
- 在类需要继承和接口时先写继承后写接口.否则报错
- 默认调用父类方法是因为和父亲更近
- 一个类实现多个接口,多个即可中存在同名的默认方法,不冲突,这个类重写该方法即可.
- 一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承.
basketball man 篮球运动员
多态
tortoise 乌龟
定义
同类型的对象,执行同一个行为,会表现处不同的行为特征
常见形式
父类对象类型 对象名称 = new 子类构造器
接口 对象名称 = new 实现类构造器
访问特点
- 方法调用:编译看左边,运行看右边
- 变量调用 : 编译看左边,运行也看左边(多态侧重行为多态)
多态的使用前提
- 有继承/实现关系;有父类引用指向子类对象;有方法重写
优势
-
在多态形势下,右边对象可以实现解耦合,便于扩展维护
-
Animal a = new Dog(); a.run();//后续业务行为随对象改变而改变,后续代码无需修改
定义方法的时候,使用父类型作为参数,该方法就可以接收父类的一切子类对象,体现出多态的扩展性与便利.
产生的问题
多态下不能使用子类独有的功能.
多态类型转换
自动类型转(从子到父):子类对象赋值给父类类型的变量指向
强制类型转换(从父到子)
-
此时必须进行强制类型转换;
- 子类 对象变量 = (子类) 父类类型的变量
-
作用:可以解决多态下的劣势,可以实现调用子类独有的功能
-
注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException
- 编写的时候不报错,编译的时候报错
Animal t = new Tortoise(); Dog d = (Dog)t;//出现异常
Java建议强制类型转换前使用instanceof判断对象的真实类型,在进行强制转换
变量名 instanceof 真实类型
判断关键字左边的变量指向对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true ,反之
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!