【Java】2026 Java学习路线:语言根基(三)★ 核心

张开发
2026/5/22 22:26:22 15 分钟阅读
【Java】2026 Java学习路线:语言根基(三)★ 核心
【Java】面向对象OOP★ 核心—— 语言根基三Java基础必学知识点 之 语言根基三一、基础概念1. 什么是面向对象2. 类与对象二、OOP 三大核心特征重中之重1. 封装2. 继承3. 多态三、进阶 OOP 相关语法1. 构造方法2. this 关键字3. static 关键字4. 代码块四、抽象 接口非常重要1. 抽象类2. 接口3. 抽象类 vs 接口初学者必知Java基础必学知识点 之 语言根基三一、基础概念1. 什么是面向对象对比面向过程C语言面向对象Java关注点怎么做步骤谁来做对象例子把大象装冰箱1.开门 2.装进去 3.关门创建三个对象人、大象、冰箱调用各自的方法特点数据和方法分离数据和方法封装在对象中核心面向对象就是把现实世界中的“东西”直接映射成程序中的“对象”每个对象有自己的数据属性和操作方法。2. 类与对象类 Class模板/蓝图定义了一类事物共有的属性和行为。不占内存。对象 Object根据类创建出来的具体实例。占内存有具体的属性值。示例定义一个Student类创建多个学生对象。// 1. 定义 Student 类模板publicclassStudent{// 成员变量属性Stringname;intage;StringstudentId;// 成员方法行为publicvoidstudy(){System.out.println(name 正在学习...);}publicvoidintroduce(){System.out.println(大家好我叫 name今年 age 岁学号是 studentId);}}// 2. 在另一个类比如 Main中创建对象publicclassMain{publicstaticvoidmain(String[]args){// 创建第一个学生对象Studentstu1newStudent();stu1.name张三;stu1.age18;stu1.studentId20240001;stu1.introduce();// 输出大家好我叫 张三今年 18 岁学号是 20240001stu1.study();// 输出张三 正在学习...// 创建第二个学生对象Studentstu2newStudent();stu2.name李四;stu2.age19;stu2.studentId20240002;stu2.introduce();// 输出大家好我叫 李四今年 19 岁学号是 20240002}}Student类定义了“所有学生都有的东西”姓名、年龄、学习而stu1和stu2是两个具体的、不同的学生实例。成员变量属性对象拥有的数据如name、age。成员方法行为对象能执行的操作如study()。二、OOP 三大核心特征重中之重1. 封装目的保护数据不被外部随意修改隐藏内部的复杂实现细节。使用时只需要通过已经提供的方法来操作而不是直接碰内部零件。实现private修饰属性 → 外部不能直接访问。public的getter/setter→ 提供受控的访问入口。提供public的getter获取值和setter设置值方法让外部通过方法来间接访问。在setter方法里可以加入逻辑检查比如余额不能为负数。示例一个BankAccount类余额不允许直接修改。publicclassBankAccount{privateStringowner;// 私有属性privatedoublebalance;// 私有属性不能直接修改// 构造方法稍后细讲publicBankAccount(Stringowner,doubleinitialBalance){this.ownerowner;if(initialBalance0){this.balanceinitialBalance;}else{this.balance0;}}// Getter 方法提供安全的读取方式publicdoublegetBalance(){returnbalance;}// 自定义的业务方法而不是通用的 setterpublicvoiddeposit(doubleamount){// 存款if(amount0){balanceamount;System.out.println(存款成功当前余额balance);}else{System.out.println(存款金额必须为正数);}}publicvoidwithdraw(doubleamount){// 取款if(amount0amountbalance){balance-amount;System.out.println(取款成功当前余额balance);}else{System.out.println(余额不足或金额无效);}}}// 测试publicclassMain{publicstaticvoidmain(String[]args){BankAccountmyAccountnewBankAccount(张三,1000);// myAccount.balance -100; // 错误balance 是 private无法访问System.out.println(当前余额myAccount.getBalance());// 输出1000.0myAccount.deposit(500);// 输出存款成功当前余额1500.0myAccount.withdraw(2000);// 输出余额不足或金额无效myAccount.withdraw(200);// 输出取款成功当前余额1300.0}}2. 继承概念一个类子类可以继承另一个类父类的属性和方法实现代码复用。这是一个“is-a”的关系。Dog是一个Animal。关键字extends。方法重写 Override子类重新实现父类的方法。super关键字在子类中调用父类的构造方法或成员。示例Animal→Dog/Cat// 父类publicclassAnimal{Stringname;publicvoideat(){System.out.println(name 正在吃东西);}}// 子类 DogpublicclassDogextendsAnimal{// 子类特有的属性publicStringbreed;// 品种// 方法重写 (Override)Overridepublicvoideat(){System.out.println(name 正在啃骨头);}// 子类特有的方法publicvoidbark(){System.out.println(name 汪汪叫);}}// 子类 CatpublicclassCatextendsAnimal{Overridepublicvoideat(){System.out.println(name 正在吃鱼);}publicvoidmeow(){System.out.println(name 喵喵叫);}}// 测试publicclassMain{publicstaticvoidmain(String[]args){DogdognewDog();dog.name旺财;dog.eat();// 输出旺财 正在啃骨头 (调用的是重写后的)dog.bark();// 输出旺财 汪汪叫CatcatnewCat();cat.name咪咪;cat.eat();// 输出咪咪 正在吃鱼cat.meow();// 输出咪咪 喵喵叫}}3. 多态概念同一个行为作用于不同的对象可以产生不同的结果。核心语法通过父类引用调用子类重写的方法。例如Animal myAnimal new Dog();编译时类型 vs 运行时类型编译时类型声明类型决定能调用哪些方法。运行时类型实际类型决定执行哪个版本的方法。myAnimal的编译时类型是Animal编译器只认Animal类里的方法比如eat()。myAnimal的运行时类型是Dog实际执行时会执行Dog类里重写后的方法。多态的好处方法参数写成父类型可以传入任意子类对象扩展性强。示例写一个makeSound(Animal a)方法// 沿用上面的 Animal, Dog, Cat 类publicclassMain{// 这个方法的参数是 Animal 类型但你可以传入任何 Animal 的子类对象publicstaticvoidmakeSound(Animala){// 这里展示了多态a 可能是 Dog也可能是 Catif(ainstanceofDog){Dogd(Dog)a;// 向下转型d.bark();}elseif(ainstanceofCat){Catc(Cat)a;c.meow();}else{a.eat();// 默认行为}}// 更经典的多态例子publicstaticvoidletAnimalEat(Animala){a.eat();// 编译时看 Animal 有 eat()运行时看具体子类的 eat()}publicstaticvoidmain(String[]args){DogdognewDog();dog.name旺财;CatcatnewCat();cat.name咪咪;letAnimalEat(dog);// 输出旺财 正在啃骨头letAnimalEat(cat);// 输出咪咪 正在吃鱼makeSound(dog);// 输出旺财 汪汪叫makeSound(cat);// 输出咪咪 喵喵叫}}三、进阶 OOP 相关语法1. 构造方法特点方法名与类名相同没有返回值。在创建对象时new自动调用用于初始化对象。默认构造如果不写构造方法Java 会提供默认无参构造。有参构造 重载你可以定义多个构造方法参数列表不同方便用不同方式创建对象。publicclassPerson{Stringname;intage;// 无参构造publicPerson(){}// 有参构造重载publicPerson(Stringname){this.namename;// 用 this 区分成员变量和参数System.out.println(一个叫name的人被创建了);}// 另一个有参构造重载publicPerson(Stringname,intage){this.namename;this.ageage;System.out.println(姓名name年龄age);}}2.this关键字代表当前对象的引用。用途区分成员变量和局部变量如this.name name;。关键用法限制this.属性/this.方法()只能在非静态方法/构造方法中使用this(...)调用构造方法必须是构造方法中的第一条语句且只能在构造方法中使用示例publicclassStudent{privateStringname;privateintage;// 构造方法1两个参数publicStudent(Stringname,intage){this.namename;this.ageage;System.out.println(调用2参数构造方法);}// 构造方法2只有姓名年龄使用默认值publicStudent(Stringname){this(name,18);// 调用上面的2参数构造方法System.out.println(调用1参数构造方法);}// 构造方法3无参数使用默认值publicStudent(){this(匿名,18);// 调用2参数构造方法System.out.println(调用无参数构造方法);}publicstaticvoidmain(String[]args){Students1newStudent(张三,20);Students2newStudent(李四);Students3newStudent();}}执行结果调用2参数构造方法调用2参数构造方法调用1参数构造方法调用2参数构造方法调用无参数构造方法3.static关键字实例变量/方法与静态变量/方法类型属于访问方式共享性实例变量/方法对象对象.xxx每个对象独立一份静态变量/方法类类名.xxx所有对象共享一份静态方法中不能直接访问实例变量和实例方法因为没有this,但是可以通过对象引用来访问。publicclassSchool{publicstaticStringschoolName第一中学;// 静态变量publicStringstudentName;// 实例变量publicstaticvoidprintSchoolName(){// 静态方法System.out.println(学校名称schoolName);// System.out.println(studentName); // 错误静态方法不能访问非静态变量}publicvoidprintInfo(){// 实例方法System.out.println(schoolName 的学生studentName);}}// 使用publicclassMain{publicstaticvoidmain(String[]args){System.out.println(School.schoolName);// 直接通过类名访问Schools1newSchool();Schools2newSchool();s1.studentName张三;s2.studentName李四;s1.printInfo();// 输出第一中学 的学生张三s2.printInfo();// 输出第一中学 的学生李四}}4. 代码块构造块写在类里方法外的{ }。每次创建对象时在构造方法之前执行。静态块用static { }包裹。在类第一次加载时执行一次常用于初始化静态变量。publicclassDemo{static{System.out.println(静态块类加载时执行一次);}{System.out.println(构造块每次创建对象前执行);}publicDemo(){System.out.println(构造方法执行);}publicstaticvoidmain(String[]args){newDemo();System.out.println(---);newDemo();}}// 输出顺序// 静态块类加载时执行一次// 构造块每次创建对象前执行// 构造方法执行// ---// 构造块每次创建对象前执行// 构造方法执行四、抽象 接口非常重要1. 抽象类抽象类是使用abstract关键字修饰的类不能被实例化主要用于被其他类继承。基本语法// 抽象类 public abstract class Animal { // 普通成员变量 private String name; // 普通方法有实现 public void eat() { System.out.println(动物吃东西); } // 抽象方法没有方法体 public abstract void makeSound(); }抽象方法使用abstract关键字修饰。没有方法体没有大括号和实现代码。必须以分号结尾。// 正确抽象方法 public abstract void doSomething(); // 错误抽象方法不能有方法体 public abstract void doSomething() { } // 编译错误抽象类特点对比总结普通类抽象类能否实例化可以不可以可以有抽象方法不可以可以可以有普通方法可以可以可以有构造方法可以可以可以有成员变量可以可以示例public abstract class Vehicle { private String brand; private int speed; // 构造方法子类可以调用 public Vehicle(String brand) { this.brand brand; System.out.println(Vehicle构造方法被调用); } // 普通方法 public void setSpeed(int speed) { this.speed speed; System.out.println(brand 速度设置为: speed); } // 抽象方法 public abstract void start(); public abstract void stop(); } // 子类必须实现所有抽象方法 public class Car extends Vehicle { public Car(String brand) { super(brand); // 调用父类构造方法 } Override public void start() { System.out.println(汽车通过点火启动); } Override public void stop() { System.out.println(汽车踩刹车停止); } } // 使用 public class Test { public static void main(String[] args) { // Vehicle v new Vehicle(); // 错误不能实例化抽象类 Car car new Car(特斯拉); car.start(); // 输出汽车通过点火启动 car.setSpeed(100); // 输出特斯拉 速度设置为: 100 car.stop(); // 输出汽车踩刹车停止 } }2. 接口接口定义规则或标准。任何类只要遵守这些规则就能被统一使用。定义接口// 使用 interface 关键字不是 class public interface Animal { // 接口中的方法没有方法体没有大括号 void eat(); void sleep(); }实现接口使用 implements 关键字// 类使用 implements 实现接口 public class Dog implements Animal { // 必须实现接口中的所有方法 Override public void eat() { System.out.println(狗吃骨头); } Override public void sleep() { System.out.println(狗趴着睡觉); } } public class Cat implements Animal { Override public void eat() { System.out.println(猫吃鱼); } Override public void sleep() { System.out.println(猫蜷缩着睡觉); } }使用接口public class Test { public static void main(String[] args) { // 接口不能直接创建对象 // Animal a new Animal(); 错误 // 但可以用接口引用实现类的对象多态 Animal dog new Dog(); Animal cat new Cat(); dog.eat(); // 输出狗吃骨头 cat.eat(); // 输出猫吃鱼 } }核心特点说明不能实例化new 接口名()是错误的多实现一个类可以实现多个接口多继承接口可以继承多个接口方法默认是 public abstract可以不写编译器自动加上接口中可以定义常量默认是public static final接口中的变量都是常量接口的继承接口可以继承多个接口。interface A { void methodA(); } interface B { void methodB(); } // 接口可以多继承 interface C extends A, B { void methodC(); } // 实现C的类必须实现所有方法A、B、C中的 public class MyClass implements C { Override public void methodA() { System.out.println(实现A); } Override public void methodB() { System.out.println(实现B); } Override public void methodC() { System.out.println(实现C); } }3. 抽象类 vs 接口初学者必知对比项抽象类接口关键字abstract classinterface继承/实现单继承多实现构造方法可以有不能有成员变量可以是普通变量只能是常量普通方法可以有默认方法/静态方法何时使用是什么关系能做什么关系

更多文章