当前位置: 首页 > news >正文

【狂神说Java】学习笔记Day(09/10)

面向对象2 2026/03/27

封装 get&set

demo04

Student

package oop.demo04; ​ //类 private:私有 public class Student { //属性私有 private String name; //名字 private int age; //年龄 //private char sex; //性别 ​ //虽然在private下不能直接调用属性, //但可以提供一些操作这些属性的方法: //可以提供一些public的get、set方法 ​ //get:获得这个数据 public String getName(){ return this.name; } ​ //set:给这个数据设置值 public void setName(String name){ this.name = name; } ​ public void setAge(int age){ if (age>120 || age<0) { System.out.println("年龄不合法"); }else this.age = age; } ​ public int getAge(){ return this.age; } ​ } ​

Application

package oop.demo04; ​ /* 1.提高程序的安全性,保护数据 2.隐藏代码的实现细节 3.统一接口 4.系统可维护增加了 */ ​ ​ public class Application { public static void main(String[] args) { Student s1 = new Student(); s1.setName("zhx"); System.out.println(s1.getName()); ​ s1.setAge(80); //不合法的 System.out.println(s1.getAge()); } } ​

继承 extends、super

demo05

Person

package oop.demo05; ​ //在Java中,所有的类,都默认直接或间接继承object //Person 人 :父类 public class Person /*extends object*/ { ​ //public 公开的 //protected //default //private 私有的 public int money = 10_0000_0000; ​ public void say(){ System.out.println("说了一句话"); } ​ public int getMoney(){ return money; } ​ public void setMoney(int money){ this.money = money; } } ​

Student

package oop.demo05; ​ //学生 is 人 :是派生类,是子类 //子类继承了父类,就会拥有父类的全部方法 public class Student extends Person { } ​

Teacher

package oop.demo05; ​ //老师 is 人 :是派生类,是子类 public class Teacher extends Person{ } ​

Application

package oop.demo05; ​ public class Application { public static void main(String[] args) { ​ Student student = new Student(); student.say(); //子类继承了父类,就会拥有父类的全部方法 System.out.println(student.money); //如果父类那边的money用private定义,则不可用,会报错 } ​ } ​

super

Student_super

package oop.demo05; ​ public class Student_super extends Person_super{ public Student_super(){ //隐藏代码:调用了父类的无参构造 //super() //调用了父类的构造器,必须要在子类构造器 “this()” 的第一行 System.out.println("Student无参执行了"); } ​ private String name = "zhx"; ​ public void print(){ System.out.println("Student"); } ​ public void test1(){ print(); this.print(); super.print(); } ​ ​ ​ ​ public void test(String name){ System.out.println(name); //寒心 System.out.println(this.name); //zhx System.out.println(super.name); //zhanghanxin } } ​

Person_super

package oop.demo05; ​ public class Person_super { ​ public Person_super(){ System.out.println("Person无参执行了"); } protected String name = "zhuanghanxin"; ​ //私有的东西无法被继承 //这里改成private就会报错 public void print(){ System.out.println("Person"); } ​ } ​

Application_super

package oop.demo05; public class Application_super { public static void main(String[] args) { Student_super student = new Student_super(); //这里输出Person无参执行了 Student无参执行了两句 //说明子类包含了隐藏代码(调用了父类的无参构造) //student.test("寒心"); student.test1(); } }

super注意点

  1. super调用父类的构造方法,必须在构造方法的第一个

  2. super必须只能出现在子类的方法或者构造方法中

  3. super和this不能同时调用构造方法

Vs this:

  • 代表的对象不同:

    • this:指本身调用者这个对象

    • super:代表父类对象的应用

  • 前提

    • this:没有继承也可以使用

    • super:只能在继承条件下才可以使用

  • 构造方法:

    • this():本类的构造

    • super():父类的构造

重写 Override

A

package oop.demo05; //继承 public class A extends B{ //Override 重写 public void test(){ System.out.println("A=>test()"); } }

B

package oop.demo05; //重写是方法的重写,与属性无关 public class B { public void test(){ System.out.println("B=>test()"); } }

Application_AB

package oop.demo05; public class Application_AB { public static void main(String[] args) { //静态方法和非静态方法的区别很大! //当子类父类都是static,即都是静态方法时, //方法的调用只和左边,和定义的数据类型有关 A a = new A(); a.test(); //输出A=>test() //父类的引用指向了子类 B b = new A(); b.test(); //当子类父类都是static时,输出B=>test() //当子类父类都不是static时,输出A=>test() //非静态方法:重写 } }

小结

  • 需要有继承关系,子类重写父类的方法

  1. 方法名必须相同

  2. 参数列表必须相同

  3. 修饰符:范围可以扩大但不能缩小: public>protected>default>private

  4. 抛出的异常:范围可以被缩小,但不能扩大: ClassNotFoundException --> Exception(大)

  • 子类和父类的方法必须要一致;方法体可不同

  • 为什么需要重写?

    • 父类的功能需要,子类不一定需要,或者不一定满足

多态

demo06

Person

package oop.demo06; public class Person { public void run(){ System.out.println("run"); } }

Student

package oop.demo06; public class Student extends Person { @Override public void run(){ System.out.println("son"); } public void eat(){ System.out.println("eat"); } }

Application

package oop.demo06; public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的 //new Student() //new Person() //而可以指向的引用类型就不确定了:父类的引用指向子类 //Student 能调用的方法都是自己的或者继承父类的 Student s1 = new Student(); //而Person 是父类型,可以指向子类,但不能调用子类独有的方法 Person s2 = new Student(); Object s3 = new Student(); s1.eat(); //输出eat s2.run(); //输出son,子类重写了父类的方法,执行子类的方法 //对象能执行哪些方法,主要看对象左边的类型,和右边的关系不大 ((Student)s2).eat(); //进行了一个强制转换 高转低 Person-->Student } }

小结

  • 注意事项:

    1. 多态是方法的多态,属性没有多态

    2. 父类和子类:有联系才能转换,无联系如:String和Student就会类型转换异常 ClassCastException

    3. 存在条件:继承关系、方法需要重写、父类引用指向子类对象 Father f1 = new Son();

    4. 不能重写的特例:

      1. static 静态方法,属于类,不属于实例

      2. final 常量 被final定义后不能被继承

      3. private

http://www.jsqmd.com/news/637367/

相关文章:

  • FRCRN语音增强工具实操手册:批量处理WAV文件的Shell脚本示例
  • 2026年评价高的浙江实木家具/浙江纯实木家具口碑好的厂家推荐 - 行业平台推荐
  • AI前沿思想、AI理想、AI的妄言、AI极致观测文明
  • 树莓派5 Ubuntu24.04部署Astra Pro深度相机SDK实战指南
  • 新房线上推广究竟该怎么做?
  • LVGL嵌入式GUI入门:从基础Demo到MVP架构实战
  • 从零到项目发布:用VSCode和CMake管理你的第一个C++小游戏(Windows平台实战)
  • Android 13手势导航卡顿?深入剖析Launcher3最近任务(Recents)的动画性能优化点
  • OriginPro与Python联用(Chapter 1)
  • AI智能体视觉检测系统(TVA)工作原理系列(二十)
  • 【狂神说Java】学习笔记Day(10/10)
  • 批判性思考绕过AIGC检测是什么原理?深度拆解降AI底层逻辑
  • 基于SpringBoot与Vue3开发的新能源充电桩智能管理平台(含完整源码+MySQL数据库+万字技术文档)
  • 【daft框架】和ray分布式计算的结合运行自定义函数
  • Win10+VS2019配置vcpkg:从安装到项目集成的完整指南
  • 港科大等联合发布让实验室变身“智能侦探“的贝叶斯优化教程
  • SwiftUI 微信SDK接入完全指南:解决回调丢失的双路径策略
  • 3年Go开发经验,为什么说Go适合后端
  • 忙得上天入地的导师派师姐助我毕设之救我狗命笔记(二)
  • ImageJ批量自动化分析脚本|高效科研图像处理工具,一键完成多类实验定量分析
  • 从形式逻辑到认知几何:基于RAE引擎的逻辑律强制与可信AI构建方法研究(修订稿)
  • 4、sdn 网络性能的测试与验证
  • Java抽象类详解:定义、用法、构造器与总结
  • 2026年万方AIGC检测升级了哪些内容?应对方法一次讲清楚
  • 2026年质量好的防火涂料源头工厂推荐 - 行业平台推荐
  • java特性之封装
  • 【AIAgent长期记忆管理黄金法则】:SITS2026首席架构师首次公开3层记忆分层架构与实时衰减算法
  • 【LeetCode HOT100 】:最小覆盖子串——滑动窗口的经典应用题解
  • 别再对着空白界面发呆了!手把手教你用GNURadio Companion(GRC)画出第一个信号流图
  • GoB插件深度解析:3步实现Blender与ZBrush专业级数据传输