JAVA之面向对象进阶
1、static
static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。
- 被static修饰的成员变量,叫做静态变量【特点:1.被该类所有对象共享 2.不属于对象,属于类 3.随着类的加载而加载,优先于对象存在 调用方式:1、类名调用(推荐) 2、对象名调用】
- 被static修饰的成员方法,叫做静态方法
javabean类:用来描述一类事物的类
测试类:用来检查其他类是否书写正确,带有main方法的类,是程序的入口
工具类:不是用来描述一类事物的,而是帮我们做一些事情的类【规范:1.类名见名知意 2.私有化构造方法 3.方法定义成静态】
static注意事项:
- 静态方法只能访问静态变量和静态方法
- 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
- 静态方法中没有this关键字
- 静态:随着类的加载而加载;非静态:跟对象有关的
static内存图:
- 静态方法只能访问静态
- 静态方法不能访问非静态
- 静态方法不能调用非静态成员变量【即实例变量】
- 静态方法不能调用非静态成员方法
2、重新认识main方法
public: 被JVM调用,访问权限足够大
static: 被JVM调用,不用创建对象,直接类名访问。因为main方法是静态的,所以测试类中其他方法也需要是静态的
void: 被JVM调用,不需要给JVM返回值
main: 一个通用的名称,虽然不是关键字,但是被JVM识别
String[] args: 以前用于接收键盘录入数据的,现在没用
public class Text {
public static void main(String[] args) {
// []:数组
// String:数据类型
// args:数组名
System.out.println(args.length); // 0
}
}
3、封装
对象代表什么,就得分装对应的数据,并提供数据对应的行为
4、继承
- java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。
- Student称为子类(派生类),Person称为父类(基类或超类)
使用继承的好处:
可以把多个子类中重复的代码抽取到父类中,提高代码的复用性
子类可以在父类的基础上,增加其他的功能,使子类更强大
什么时候用继承:
当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码
继承的特点:
- Java只支持单继承,不支持多继承,但支持多层继承[子类只能访问父类中非私有的成员]
- 单继承:一个子类只能继承一个父类
- 不支持多继承:子类不能同时继承多个父类
- 多层继承:子类A继承父类B,父类B可以继承父类C【每一个类都直接或者间接的继承于Object】
子类能继承父类中的哪些内容:
构造方法 | 非私有 不能 | private 不能 |
成员变量 | 非私有 能 | private 能继承,但不能直接使用 |
成员方法 | 非私有【能加载到虚方法表】 能 | private【不能加载到虚方法表】 不能 |
虚方法表:非private、非static、非final
只有父类中的虚方法才能被子类继承
5、继承中的成员变量的访问特点:
就近原则:先在局部位置找,本类成员位置找,父类成员位置找,逐级往上
6、继承中的成员方法的访问特点:
直接调用满足就近原则:谁离我近,我就用谁
super调用,直接访问父类
7、方法的重写
当父类的方法不能满足子类现在的需求时,需要进行方法重写
书写格式:
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法时重写的方法
@Override重写注解
- @Override是放在重写后的方法上,校验子类重写时语法是否正确
- 加上注解后如果有红色波浪线,表示语法错误
- 建议重写方法都加@Override注解,代码安全,优雅
方法重写注意事项和要求
- 重写方法的名称、形参列表必须与父类中的一致
- 子类重写父类方法时,访问权限子类必须大于等于父类(暂时了解:空着不写<protected<public)
- 子类重写父类方法时,返回值类型子类必须小于等于父类
- 建议:重写的方法尽量和父类保持一致
- 只有添加到虚方法表里的方法才能被重写、
8、继承中:构造方法的访问特点
- 父类中的构造方法不会被子类继承,但子类可以通过super调用
- 子类构造方法的第一行,有一个默认的super()
- 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己
为什么?
- 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
- 子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化
怎么调用父类构造方法?
- 子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行
- 如果像调用父类有参构造,必须手动写super进行
9、this、super使用总结
- this:理解为一个变量,表示当前方法调用者的地址值
- super:代表父类存储空间
10、多态
定义:同类型的对象,表现出的不同形态。
多态的表现形式: 父类类型 对象名称 = 子类对象;
多态的前提:
- 有继承关系
- 有父类引用指向子类对象 Fu f = new Zi();
- 有方法重写
多态的好处:
使用父类型作为参数,可以接收所有子类对象
体现多态的扩展性与遍利
多态调用成员的特点:
变量调用:编译看左边【javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有,编译失败】,运行也看左边【java运行代码的时候,实际获取的就是左边父类中成员变量的值】
方法调用:编译看左边【javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有,编译失败】,运行看右边【java运行代码的时候,实际运行的是子类中的方法】
多态的优势:
在多态形式下,右边对象可以实现解耦合,便于扩展和维护
定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
多态的弊端:
不能使用子类的特有功能
引用数据类型的类型转换,有几种方式:
自动类型转换 Person p = new Student();
强制类型转换 Student s = (Student)p;【强制类型转换能解决什么问题:可以转换成真正的子类类型,从而调用子类独有功能;转换类型与真实对象类型不一致会报错;转换的时候用instanceof关键字进行判断】
11、包
包就是文件夹。用来管理各种不同功能的java类,方便后期代码维护。
包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意
使用其他类的规则:
1、使用同一个包中的类时,不需要导包。
2、使用java.lang包中的类时,不需要导包。
3、其他情况都需要导包
4、如果同时使用两个包中的同名类,需要用全类名
12、final
最终的不可被更改的,可用于修饰方法【表明该方法是最终方法,不能被重写】、类【表明该类是最终类,不能被继承】、变量【叫做常量,只能被赋值一次】
常量:实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
常量的命令规范:
单个单词:全部大写
多个单词:全部大写,单词之间用下划线隔开
细节:
final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。
final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变
13、权限修饰符
是用来控制一个成员能够被访问的范围的
可以用来修饰成员变量,方法,构造方法,内部类
权限修饰符分类:
有四种作用范围由小到大(private<空着不写<protected<public)
14、代码块
局部代码块
构造代码块【1、写在成员变量位置 2、作用:可以把多个构造方法中重复的代码抽取出来 3、执行时机:我们在创建本类对象的时候会先执行构造代码块再执行构造方法】
静态代码块
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
使用场景:在类加载的时候,做一些数据初始化的时候使用
15、抽象类
抽象方法:
1、将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容不一样,所以,在父类中不能确定具体的方法等。该方法可以定义为抽象方法。
2、定义格式:public abstract 返回值类型 方法名(参数列表)
抽象类:
1、如果一个类中存在抽象方法,那么该类就必须声明为抽象类
2、定义格式:public abstract class 类名{}
3、作用:强制让子类进行重写;抽象方法所在的类,必须是抽象类
抽象类和抽象方法的注意事项:
1、抽象类不能实例化
2、抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
3、可以有构造方法
4、抽象类的子类,要么重写抽象类的所有抽象方法,要么是抽象类
16、接口
接口的定义和使用
1、接口用关键字interface来定义 public interface 接口名{}
2、接口不能实例化
3、接口和类之间是实现关系,通过implements关键字表示 public class 类名 implements 接口名{}
4、接口的子类(实现类),要么重写接口重点的所有抽象方法,要么是抽象类
5、注意1:接口和类的实现关系,可以单实现,也可以多实现。 public class 类名 implements 接口名1,接口名2 {}
6、注意2:实现类还可以在继承一个类的同时实现多个接口。public class 类名 extends 父类 implements 接囗名1,接口名2 {}
接口中成员的特点
1、成员变量 只能是常量 默认修饰符:public static final
2、构造方法 么有
3、成员方法 只能是抽象方法 默认修饰符:public abstract
4、JDK7以前:接口中只能定义抽象方法
5、JDK8中的新特性:接口中可以定义有方法体的方法
6、JDK9中的新特性:接口中可以定义私有方法
接口和类之间的关系
1、类和类的关系 继承关系,只能单继承,不能多继承,但是可以多层继承
2、类和接口的关系 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
3、接口和接口的关系 继承关系,可以单继承,也可以多继承
17、扩展
JDK8开始接口中新增的方法
JDK7以前:接口中只能定义抽象方法
JDK8中的新特性:接口中可以定义有方法体的方法(默认、静态)
允许在接口中定义默认方法,需要使用关键字default修饰 作用:解决接口升级的问题
接口中默认方法的定义格式:public default 返回值类型 方法名(参数列表){}
接口中默认方法的注意事项:
1、默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
2、 public可以省略,default不能省略
3、如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
允许在接口中定义静态方法,需要用static修饰
接口中静态方法的定义格式:public static 返回值类型 方法名(参数列表) {}
接口中静态方法的注意事项:
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
public可以省略,static不能省略
JDK9中的新特性:接口中可以定义私有方法
接口中私有方法的定义格式:
格式1:private 返回值类型 方法名(参数列表){}
格式2:private static 返回值类型 方法名(参数列表) {}
接口的应用
接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了
当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态
适配器设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。简单理解:设计模式就是各种套路。
适配器设计模式:解决接口与接口实现类之间的矛盾问题
书写步骤:编写中间类XXXAdapter,实现对应的接口,对接口中的抽象方法进行空实现,让真正的实现类继承中间类,并重写需要用的方法。为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰。
18、内部类
在一个类的里面,再定义一个类。内部类表示的事物是外部类的一部分。内部类单独出现没有任何意义。
内部类的访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
类的五大成员:属性、方法、构造方法、代码块、内部类
内部类的分类:
- 成员内部类【写在成员位置的,属于外部类的成员;成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等;在成员内部类里,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量】
获取成员内部类对象:
写在成员位置的,属于外部类的成员
方式一:在外部类中编写方法,对外提供内部类的对象(private)
方式二:直接创造格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
在外部类成员变量和内部成员变量重名时,在内部类如何访问?
静态内部类
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建外部类的对象。
局部内部类
1、将内部类定义在方法里面就叫做局部内部类,类似于方法里的局部变量
2、外界是无法直接使用,需要在方法内部创建对象并使用
3、该类可以直接访问外部类的成员,也可以访问方法内的局部变量
匿名内部类
匿名内部类本质上就是隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置
格式的细节:包含了继承或实现,方法重写,创建对象。整体就是一个类的子类对象或者接口的实现类对象
适应场景:当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象。如果实现类只要使用一次,就可以用匿名内部类简化代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App