- 类的实例化:
类名 对象名 = new 类名();
Person person = new Person();
- 类本身自带无参构造器
- 使用new关键字,本质上是在调用构造器
- 一旦定义有参构造器,无参构造器就需要显示定义
public class Student {
String name;
public Student(){};
public Student(String name){
this.name = name;
}
}
- Java内存分为三部分:
- 栈:存放引用变量,即对象名(对象地址)
- 堆:存放对象实体
- 方法区:存放类和静态方法区
- 类的封装:
- 属性值设为私有,设定get/set方法
- IDEA里面直接使用alt+insert可以快速设置get/set方法
- 类的继承:
- 使用关键字extends
- 所有的类默认直接或者间接继承Object类
- 子类只能继承父类的非private属性和方法
- super关键字:
- 作用是在子类里面可以通过这个关键字调用父类的属性或者方法(构造器)
- 严谨一点,在调用本类的方法和属性时使用this,调用父类的就使用super
- 在调用子类无参构造器的时候(即使用new来创建对象的时候),会自动先调用父类的无参构造器(super(),并且如果super()显式调用,必须放在代码的第一行,同样的情况还出现在this身上,super和this不能同时调用构造方法),再调用子类的无参构造器
- 方法的重写
- 作用对象:子类继承的父类的非静态方法
非静态方法才能重写,静态方法跟随类一起加载,比如
public class A {
public static void print(){
System.out.println("A==>print");
}
}
public class B extends A{
public static void print(){
System.out.println("B==>print");
}
}
public class Application {
public static void main(String[] args) {
A a = new B();
B b = new B();
a.print();
b.print();
}
}
输出结果:
A==>print
B==>print
- 为什么要重写:父类的方法不一定满足子类的需求(父类方法功能太少了)/或者父类的方法,子类不一定需要(父类的方法功能太多了)
- 在子类里面可以使用alt+insert选择override,重写父类的方法,会有@override注解显示这是一个重写方法,IDEA的左边也会有一个箭头标识
public class A {
public void print(){
System.out.println("A==>print");
}
}
public class B extends A{
@Override
public void print() {
System.out.println("B==>print");
}
}
public class Application {
public static void main(String[] args) {
A a = new B();
B b = new B();
a.print();
b.print();
}
}
输出:
B==>print
B==>print
- 重写方法名、参数列表必须相同
- 修饰符范围可以扩大,不能缩小 public>protected>defalut>private
- 抛出异常范围可以缩小,不能扩大 ClassNotFoundException --> Exception(大)
- 多态:
- 即同一方法可以根据发送对象的不同采取多种不同的行为方式
- 一个对象的实际类型是确定的,由new之后的类名来决定,但是指向这个对象的引用类型可以是他的父类或者其他有关系的类声明的
- 多态存在的条件:1. 有继承关系 2. 子类重写父类的方法 3. 父类引用指向子类对象
- 多态是方法的多态,没有属性的多态
- 有三种方法不能重写:①static②final③private
- instanceof用法
X x = new A()
x instanceof Y
如果X和Y没有联系(即没有父子、孙子之类的关系),编译不通过
如果A和Y有联系,返回true,否则返回false
- static关键字:static的属性又叫做类属性,可以直接通过类名调用。
非static方法可以调用static方法,但是static方法不能调用非static方法
- 抽象类:在声明类的时候,加一个abstract
public abstract class A
- 抽象类不能new
- 约束(抽象方法)只能存在于抽象类/接口
- 不能new
- 继承抽象类的类需要实现抽象方法
- 接口:
public interface TimeService {
void time();
}
- 接口里面只有约束(抽象方法),抽象类里面除了抽象方法还可以有正常的方法
- 接口需要有对应的实现类,一般实现类的类名在接口名后面加上Impl,实现接口使用的关键字是implement
public class UserServiceImpl implements UserService,TimeService{
@Override
public void add() {
}
@Override
public void delete() {
}
@Override
public void change() {
}
@Override
public void query() {
}
@Override
public void time() {
}
}
- 实现类需要重写接口里面的所有抽象方法
- 接口可以多继承
- 接口的所有方法其实是默认public abstract
- 作用:约束和实现的分离
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)