ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java 面向对象进阶:static、继承、重写、Object 全解析

Java 面向对象进阶:static、继承、重写、Object 全解析 前言这一篇进入面向对象进阶包与访问修饰符、static、继承、方法重写、Object 类。这五个点是从单个类走向类与类关系的关键也是面试高频区。每个知识点都配代码和我的理解期望和你的一起进步一、包的定义和使用1.1 什么是包包package就是用来管理类的文件夹相当于给类分类归档。比如java.lang核心类String、Object、Systemjava.util工具类ArrayList、HashMap、Scannerjava.io输入输出类1.2 定义包javapackage com.example.demo; public class Student { }注意package语句必须是文件第一行有效代码注释不算。1.3 包的命名规范通常用公司域名倒写 项目名 模块名textcom.baidu.search com.taobao.user com.example.demo全部小写用.分隔。1.4 导包同一个包下的类直接用不用导。不同包下的类需要importjavaimport java.util.Scanner; import java.util.ArrayList; // 或者批量导入 import java.util.*;注意java.lang包下的类String、Object、System自动导入不用写 import。1.5 我的理解包就像电脑里的文件夹。你不可能把所有文件都堆在桌面所以要分类图片放图片文件夹文档放文档文件夹。包就是 Java 给类做的分类管理。核心一句话包 类的文件夹package 声明import 导入。二、四种访问修饰符2.1 四种修饰符修饰符本类同包子类不同包任意位置private✅❌❌❌默认不写✅✅❌❌protected✅✅✅❌public✅✅✅✅2.2 记忆口诀private只有自己能用私房钱默认同包能用家里人protected同包 子类能用亲戚public谁都能用公开场合2.3 代码示例javapackage com.example.a; public class Demo { private int a 1; // 只有本类能用 int b 2; // 同包能用 protected int c 3; // 同包 子类能用 public int d 4; // 谁都能用 }javapackage com.example.b; import com.example.a.Demo; public class Test { public static void main(String[] args) { Demo demo new Demo(); // demo.a; // 报错private // demo.b; // 报错不同包 // demo.c; // 报错不是子类 demo.d 10; // 可以public } }2.4 我的理解访问修饰符就是给类、属性、方法设置门禁等级。private 是最高级别只有自己能进public 是完全开放谁都能进。核心一句话private 自己、默认同包、protected 子类、public 全开。三、static 修饰的静态变量3.1 什么是静态变量static 修饰的变量叫静态变量类变量它属于类不属于某个对象。3.2 实例变量 vs 静态变量对比项实例变量静态变量所属对象类内存每个对象一份全类共享一份调用对象.变量类名.变量推荐生命周期随对象创建销毁随类加载创建类卸载销毁3.3 代码示例javapublic class Student { String name; // 实例变量每个学生一份 static int count 0; // 静态变量所有学生共享 public Student(String name) { this.name name; count; // 每创建一个学生count 1 } }javaStudent s1 new Student(张三); Student s2 new Student(李四); Student s3 new Student(王五); System.out.println(Student.count); // 33.4 我的理解实例变量就像每个人的手机各用各的静态变量就像教室里的空调全班共用一台。count用来统计一共创建了多少个学生这个数字不属于某一个学生而是属于学生这个类。核心一句话静态变量属于类全类共享一份。四、static 修饰的静态方法4.1 什么是静态方法static 修饰的方法叫静态方法它属于类可以直接用类名.方法()调用。4.2 代码示例javapublic class MathUtil { public static int add(int a, int b) { return a b; } public static int max(int a, int b) { return a b ? a : b; } }javaint sum MathUtil.add(3, 5); // 不用 new直接类名调用 int max MathUtil.max(3, 5);4.3 静态方法的限制静态方法里不能直接用实例变量和实例方法javapublic class Demo { int a 10; // 实例变量 static int b 20; // 静态变量 public void instanceMethod() { System.out.println(实例方法); } public static void staticMethod() { System.out.println(b); // ✅ 可以访问静态变量 // System.out.println(a); // ❌ 不能访问实例变量 // instanceMethod(); // ❌ 不能访问实例方法 } }原因静态方法随类加载就有了此时对象可能还没创建实例变量根本不存在。4.4 我的理解静态方法就像工具不需要某个对象存在就能用。比如Math.abs(-5)你不需要先new Math()直接用就行。但工具不能依赖某个人的东西。如果静态方法里用了实例变量就等于工具要求必须先有某个人逻辑就矛盾了。核心一句话静态方法属于类不能直接访问实例成员。五、static 修饰的静态代码块5.1 什么是静态代码块静态代码块是用static {}包裹的代码块在类加载时执行一次且只执行一次。5.2 代码示例javapublic class Demo { static int count; static { System.out.println(静态代码块执行); count 100; } public Demo() { System.out.println(构造方法执行); } }javaDemo d1 new Demo(); Demo d2 new Demo();输出text静态代码块执行 构造方法执行 构造方法执行注意静态代码块只执行一次构造方法每创建一个对象就执行一次。5.3 执行顺序javapublic class Demo { static int a 10; // 1. 静态变量初始化 static { System.out.println(静态代码块); // 2. 静态代码块 } int b 20; // 3. 实例变量初始化 { System.out.println(实例代码块); // 4. 实例代码块 } public Demo() { System.out.println(构造方法); // 5. 构造方法 } }创建对象时输出text静态代码块 实例代码块 构造方法5.4 我的理解静态代码块就是类加载时的开机自检。类第一次被用到时先跑一遍静态代码块把该准备的准备好。之后再用这个类就不再跑了。核心一句话静态代码块随类加载执行一次常用于初始化静态资源。六、继承的基本使用6.1 什么是继承继承就是子类自动拥有父类的属性和方法用extends关键字实现。javapublic class 父类 { } public class 子类 extends 父类 { }6.2 代码示例java// 父类 public class Animal { String name; public void eat() { System.out.println(name 在吃东西); } public void sleep() { System.out.println(name 在睡觉); } } // 子类 public class Dog extends Animal { public void bark() { System.out.println(name 在汪汪叫); } }javaDog dog new Dog(); dog.name 旺财; dog.eat(); // 继承自父类 dog.sleep(); // 继承自父类 dog.bark(); // 子类自己的方法6.3 继承的特点单继承一个子类只能有一个直接父类多层继承可以 A → B → C所有类都继承 ObjectObject 是所有类的祖宗子类可以扩展父类在父类基础上增加新功能6.4 我的理解继承就像家族遗传。儿子自动拥有爸爸的某些特征姓、血型同时儿子还能有自己的特长。爸爸有的儿子基本都有儿子有的爸爸不一定有。核心一句话继承 子类自动拥有父类成员用 extends 实现。七、继承中构造方法和 super 关键字7.1 子类构造方法会先调用父类构造方法javapublic class Animal { public Animal() { System.out.println(Animal 构造方法); } } public class Dog extends Animal { public Dog() { // 这里默认隐藏了一句 super(); System.out.println(Dog 构造方法); } }javaDog dog new Dog();输出textAnimal 构造方法 Dog 构造方法7.2 super 的两种用法用法一调用父类构造方法javapublic class Dog extends Animal { public Dog(String name) { super(name); // 调用父类有参构造必须放第一行 } }用法二调用父类成员javapublic class Dog extends Animal { public void show() { super.eat(); // 调用父类 eat 方法 } }7.3 this vs super对比项thissuper代表当前对象父类部分调用构造this(...)super(...)调用方法this.方法()super.方法()位置构造方法第一行构造方法第一行注意this(...)和super(...)不能同时出现在同一个构造方法里。7.4 我的理解子类对象创建时先有爸爸才有儿子。所以父类构造方法先执行把父类那部分属性初始化好再执行子类构造方法。super就是我爸this就是我自己。核心一句话子类构造先调父类构造super 指父类this 指自己。八、静态方法的继承8.1 静态方法可以被继承javapublic class Animal { public static void show() { System.out.println(Animal 静态方法); } } public class Dog extends Animal { }javaDog.show(); // 可以调用继承自父类8.2 静态方法不能重写静态方法属于类不属于对象所以不能重写Override。如果子类定义了同名同参的静态方法那叫隐藏Hide不叫重写。javapublic class Animal { public static void show() { System.out.println(Animal 静态方法); } } public class Dog extends Animal { public static void show() { System.out.println(Dog 静态方法); } }javaAnimal animal new Dog(); animal.show(); // 输出Animal 静态方法看左边类型不是看右边对象注意静态方法看声明类型实例方法看实际对象。8.3 我的理解静态方法属于类不属于对象。继承关系是对象层面的静态方法虽然能被子类调用但它不参与多态。核心一句话静态方法可继承但不能重写调用看左边类型。九、Object 类9.1 Object 是什么Object 是所有类的祖宗Java 中所有类都直接或间接继承 Object。javapublic class Student { } // 等价于 public class Student extends Object { }9.2 Object 的常用方法方法说明toString()返回对象的字符串表示equals(Object obj)判断两个对象是否相等hashCode()返回对象的哈希码getClass()返回对象的运行时类clone()克隆对象9.3 toString()默认实现javapublic String toString() { return getClass().getName() Integer.toHexString(hashCode()); }输出类似com.example.Student1b6d3586不好看所以通常重写javaOverride public String toString() { return Student{name name , age age }; }9.4 equals()默认实现javapublic boolean equals(Object obj) { return (this obj); // 默认比较地址 }通常重写改成比较内容javaOverride public boolean equals(Object obj) { if (this obj) return true; if (obj null || getClass() ! obj.getClass()) return false; Student student (Student) obj; return age student.age Objects.equals(name, student.name); }9.5 我的理解Object 就像万物始祖。所有类都从它那里继承了一些基础能力能转成字符串、能比较、能算哈希值。toString()和equals()是最常被重写的两个方法前者让打印好看后者让比较变按内容比。核心一句话Object 是所有类的父类toString 和 equals 最常被重写。十、方法重写的基本规则10.1 什么是方法重写子类重新定义父类的方法方法名、参数列表、返回值类型都相同叫方法重写Override。10.2 重写的规则规则说明方法名必须相同参数列表必须相同返回值类型相同或是父类返回值的子类访问权限不能比父类更严格异常不能抛出比父类更宽的异常注解建议加Override10.3 代码示例javapublic class Animal { public void eat() { System.out.println(动物在吃东西); } } public class Dog extends Animal { Override public void eat() { System.out.println(狗在啃骨头); } }javaAnimal animal new Dog(); animal.eat(); // 输出狗在啃骨头看实际对象10.4 重写 vs 重载对比项重写Override重载Overload位置子类与父类之间同一个类中方法名相同相同参数列表必须相同必须不同返回值相同或子类无关多态是运行时多态是编译时多态10.5 我的理解重写就是儿子把爸爸的技能重新实现一遍。爸爸会吃东西儿子也会吃东西但儿子吃的是骨头爸爸吃的是草。核心一句话重写 子类重新实现父类方法方法签名必须相同。十一、核心口诀知识点口诀包类的文件夹package 声明import 导入访问修饰符private 自己、默认同包、protected 子类、public 全开静态变量属于类全类共享一份静态方法属于类不能访问实例成员静态代码块类加载时执行一次继承子类自动拥有父类成员单继承super指父类调父类构造或成员静态方法继承可继承不能重写看左边类型Object所有类的父类toString/equals 常重写重写子类重新实现父类方法签名相同十二、常见易错点易错点说明静态方法里用实例变量编译报错静态方法不能直接访问实例成员子类构造没调 super如果父类没有无参构造子类必须手动调 super(...)重写时权限变小子类重写方法权限不能比父类更严格静态方法当重写静态方法不能重写只能隐藏调用看左边类型toString 不重写打印出来是地址不好看建议重写equals 不重写默认比较地址比较内容必须重写结语这篇覆盖了 Java 面向对象进阶的五个核心点包与访问修饰符、static、继承、方法重写、Object 类。
返回列表