JavaOOP

news/2026/1/16 22:47:55/文章来源:https://www.cnblogs.com/flora222/p/19494274

JavaOOP

Java面向对象


2026.01.15

我好想哭吧我昨天写的没保存

算了不管了反正也没看多少(

回顾方法以及加深


不多说吧,记一下重点的东西好了

break和return的区别:

break:跳出switch,结束循环

return:结束方法,返回一个结果

方法名注意规范定义,首字母大写,见名知意

静态方法与非静态方法

//这里是另外定义的类
package com.flora.base.lovers;
//Demo01 类
public class Demo01 {//方法public static void say(){System.out.println("上课不许说话");}public void dontsay(){System.out.println("上课应该玩手机");}}
//这里是主要使用的类
package com.flora.base.lovers;public class Demo02 {static void main(String[] args) {//静态方法  staticDemo01.say();//当我们使用非静态方法时,我们就要实例化这个类//对象类型  对象名  =  对象值Demo01 demo=new Demo01();demo.dontsay();//静态方法不能调用非静态方法,但是非静态方法可以调用静态方法}
}

静态方法不能调用非静态方法,但是非静态方法可以调用静态方法

原因:静态方法是和类一起加载的,而非静态方法是类实例化后才存在的

​ 在静态方法中调用一个非静态方法相当于在调用一个不存在的方法

值传递与引用传递

值传递:

package com.flora.base.lovers;public class Demo03 {static void main(String[] args) {int a=1;Demo03.change(a);System.out.println(a);//1//值传递只是将值赋给了调用方法中的形参,本身没有变化}//值传递public static void change(int a){a=10;//返回值为空}
}

引用传递:

package com.flora.base.lovers;
//引用传递:对象,本质还是值传递
public class Demo04 {static void main(String[] args) {Student student=new Student();System.out.println(student.name);//nullDemo04.change(student);System.out.println(student.name);//flora2}public static void change(Student student){//Student 是一个对象,指向的是Student student=new Student(),这是一个具体的人,可以改变属性student.name="flora2";}
}//定义了一个Student类,有一个属性name
class Student{String name;
}

类与对象的关系


类是一种抽象的数据类型,它是对某一类事物的整体描述或定义,但是不能代表某一个具

体的事务

而对象则是抽象概念的一个具体事例

比如说:人类是一个类,而其中一个人就是人类这个类的具体事例

注意

一个项目应该只存在一个main方法!!!

实例:

//这是一个Classmate类
package com.flora.base.lovers;
//学生类
public class Classmate {//属性:字段String name;//默认nullint age;//默认0//方法public void study(){System.out.println(this.name+"学生不许学习");}
}
//这里是主类,main方法在这里
package com.flora.base.lovers;public class Application {static void main(String[] args) {//类: 抽象的,我们需要将他实例化//类实例化后会返回一个自己的对象Classmate classmate=new Classmate();classmate.name="sakuya";classmate.age=18;System.out.println(classmate.name);//sakuyaSystem.out.println(classmate.age);//18}
}

构造器详解


一个类即使什么都不写,也会存在一个方法

package com.flora.base.lovers;
//学生类
public class Classmate {String name;//显示的定义构造器//实例化初始值public Classmate(){this.name="flora";//原来的初始值是null,现在是flora}//构造器的作用://1.使用new关键字的本质是调用构造器//2.构造器用来初始化值//有参构造:一旦定义了有参构造,无参就必须显示定义public Classmate(String a){this.name="aaa";}//alt+insert快捷键生成构造器
}
//这里是实例应用
package com.flora.base.lovers;public class Application {static void main(String[] args) {Classmate classmate=new Classmate();System.out.println(classmate.name);//floraClassmate mate=new Classmate("papa");System.out.println(mate.name);//aaa}
}

构造器 特点:和类名相同,没有返回值

​ 作用:使用new关键字的本质是调用构造器,构造器用来初始化值

注意

  • 定义有参构造之后,如果要使用无参构造,要明确定义一个可见的无参构造
  • alt+insert快捷键生成构造器

this关键字:

this在Java中主要有三个作用:

  1. 在代码中,当方法的参数名和类的成员变量名一样时,用this变量名就知道指的是这个类自己的成员变量,不是传进来的参数
  2. 在类的一个构造器里,用this()可以直接调用这个类的另外一个构造器,少写重复代码
  3. 对于当前这个对象的指代

创建对象内存分析


​ 我们在创建对象时,即使都是new Pet(),但是由于Java的指针无处不在(,两个对象在内存中所指向的地址不同

诶呀反正就是堆栈内存区那些

类与对象小结


必须使用new关键字创建对象,构造器Person person=new Person();

对象的属性:person.name

对象的方法:person.sleep()

默认初始化:

数字:0 0.0

char:u0000

boolean:false

引用:null

封装


程序设计要求高内聚低耦合

***:属性私有,get/set

//这里是主程序
package com.flora.base.lovers.Demo01;public class Main {static void main(String[] args) {Student s1=new Student();//s1.name=,报错,不让用,因为name在Student类里面是私有权限s1.setName("flora");System.out.println(s1.getName());//floras1.setAge(999);System.out.println(s1.getAge());//114514,哥们你是人类不}
}
//这里是调用它的类
package com.flora.base.lovers.Demo01;
//关键词private,私有
public class Student {//属性私有private String name;private int id;private char sex;private int age;//提供一些可以操作这个属性的方法//提供一些public的get,set方法//get,获得这个数据public String getName(){return this.name;}//set,给这个数据设置值public void setName(String name){this.name=name;}//依旧是alt+insert快捷方式//在Java中,由于我们对类进行了封装,因此使用get/set方式可以对外部调用输入的值进行检查或过滤public int getAge() {return age;}public void setAge(int age) {if(age>=0&&age<=120){this.age = age;}else{System.out.println("哥们你是人类不");this.age=114514;}}
}

封装的作用:

  1. 可以对输入的数据进行过滤,提高程序的安全性,保护数据
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 提高了系统的可维护性

继承


继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模

关键词extends,子类是父类的扩展

Java中类只有单继承,没有多继承!!!!

啥意思捏,一个儿子只能有一个爸爸,但是一个爸爸可以有很多个儿子(

继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等等

子类(派生类),父类(基类),子类继承父类,使用关键字extends来表示

在Java中,所有的类都默认直接或者间接继承object类!

package com.flora.base.lovers.Demo02;
//学生 is 人:派生类,子类
public class Student extends Person{}
package com.flora.base.lovers.Demo02;
//人   父类
public class Person {public void say(){System.out.println("我好困");}
}
package com.flora.base.lovers.Demo02;public class Appplication {static void main(String[] args) {Student stu1=new Student();stu1.say();//我好困//诶你说神不神奇呢我Student类里什么都没写为什么能用呢?//因为Student类继承了Person类!//子类能够继承父类的所有方法!!//前提:权限是public权限*************//private权限的无法继承,只能通过get/set}
}

Super关键词


子类可以通过super关键词来访问父类的属性

super注意点:

  1. super是调用父类的构造方法,必须在子类构造方法语句的第一个(不显式也行,默认先执行父类构造)
  2. super只能出现在子类的方法或者构造方法中!!!
  3. super和this不能同时调用构造方法!!!

super与this的区别:

  • 代表的对象不同。

​ this代表本身调用的对象,super代表父类对象的应用

  • 前提条件不同。

    this没有继承也可以使用,super只能在继承条件下才可以使用

  • 构造方法不同。

    this():本类的构造

    super():父类的构造

方法重写


先上代码示例:

package com.flora.base.lovers.Demo;public class A extends B{@Overridepublic void test() {System.out.println("A==test()");}
}
package com.flora.base.lovers.Demo;
//重写都是方法的重写,和属性无关
public class B {public void test(){System.out.println("B==test()");}
}
package com.flora.base.lovers.Demo;public class AApplication {//静态的方法和非静态的方法区别很大!//静态方法:方法的调用只和左边定义的数据类型有关//static void main(String[] args) {A a=new A();a.test();//A//父类的引用指向了子类B b=new A();//子类重写了父类的方法b.test();//A}
}

总结:重写需要有继承关系,而且是子类重写父类的方法

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符:范围可以扩大,但是不能缩小 public>Protected>Default>private
  4. 抛出的异常范围可以被缩小,但是不能扩大

重写,子类的方法和父类必须一致,方法体不同!

为什么需要重写:

  1. 父类的部分功能子类不一定需要,或者不一定满足
  2. alt+insert :override,重写选项

多态


即同一方法可以根据发送对象的不同而采用多种不同的行为方式

话不多说上代码!

package com.flora.base.lovers.Demo04;
//父类
public class Person {public void run(){System.out.println("run");}
}
package com.flora.base.lovers.Demo04;
//子类
public class Student extends Person{@Overridepublic void run() {System.out.println("son");}public void eat(){System.out.println("eat");}
}
package com.flora.base.lovers.Demo04;public class Applicationn {static void main(String[] args) {//一个对象的实际类型是确定的//但是可以指向的引用类型就不确定了:父类的引用指向子类//Student能调用的方法都是自己的或者继承父类的Student s1 = new Student();//Person父类可以指向子类,但是不能调用子类独有的方法Person s2 = new Student();Object s3 = new Student();//对象能执行哪些方法,主要看对象左边的类型,与右边关系不大!!!s2.run();//son,子类重写了父类的方法,执行子类//s2.eat()报错//((Student)s2)=eat();可以进行类型转换,此时运行不报错s1.run();//son}
}

多态的注意事项:

  1. 多态是方法的多态(重写(误),属性没有多态!
  2. 只有存在父类和子类之间这种关系才可以进行类型转换!
  3. 存在条件:有继承关系,方法需要进行重写,父类引用指向子类对象!

不能进行重写的方法:

  • static方法属于类,不属于实例,不能进行重写
  • final 常量
  • private 私有方法也不能进行重写

instanceof关键字


instanceof关键字可以判断两个类之间是否存在父子关系

工作方式:

  1. 先判断instanceof左右两边的类是不是存在父子关系,不是直接编译报错
  2. 是的话,进行下一步判断,左边的对象属不属于右边的类,是的话true,不是的话false

类型转换


package com.flora.base.lovers.Demo04;
//父类
public class Person {public void run(){System.out.println("run");}
}
package com.flora.base.lovers.Demo04;
//子类
public class Student extends Person{public void pri(){System.out.println("儿子自己的");}
}
package com.flora.base.lovers.Demo04;public class Applicationn {static void main(String[] args) {//类型之间的转化:父类  子类//高转低Person obj=new Student();//如果我们将student对象转换为Student类型,就可以使用Student类的方法了!((Student)obj).pri();//强制转型//子类转换为父类,可能会丢失自己本来的方法Student student=new Student();Person person=student;person.run();//student子类转换为person父类,不能再使用自己独有的pri()方法}
}

总结:

  1. 父类的引用指向子类的对象
  2. 把子类转换为父类,向上自动转型
  3. 把父类转换为子类,强制向下转型
  4. 作用:方便方法的调用,减少重复代码

Static修饰符


package com.flora.base.lovers.Demo05;
//static
public class Student {private static int age;//静态变量private double score;//非静态变量static void main(String[] args) {Student student=new Student();System.out.println(student.score);System.out.println(student.age);//System.out.println(Student.score);//score不是类变量,不能通过类来调用System.out.println(Student.age);//age有static修饰,是类变量,可以通过类来调用}
}

方法

非静态的方法可以调用静态方法,静态方法可以调用静态方法,但是静态方法不可以调用非静态方法,如果要调用,必须先new一个类

代码块

代码块在构造器之前执行,静态代码块最先执行且永久只执行一次

代码块常被用来赋初值

**:通过final修饰的类不可以有子类

抽象类


关键字abstract

抽象类的所有方法必须要由它的子类通过重写方法来实现

抽象类的特点:

  1. 抽象类不能new,只能靠子类去实现它:约束!
  2. 抽象类中可以写普通的方法
  3. 抽象方法必须在抽象类中

抽象的抽象:约束!

package com.flora.base.lovers.Demo06;public abstract class Action {//不想自己写,有人帮咱们写//abstract,抽象方法,没有方法的实现,只有方法的名字public abstract void doSomething();
}
package com.flora.base.lovers.Demo06;
//子类必须要通过重写实现抽象类父类的方法,否则报错
//除非子类也是一个abstract
public class A extends Action{@Overridepublic void doSomething() {}
}

抽象类存在构造器吗?

存在。抽象类的子类继承他的时候,子类的构造器会默认调用抽象类的构造器,用来初始化抽象类里面的成员变量,跟普通类的继承逻辑是一样的。

抽象类存在的意义是什么?

给同类型的子类定好通用规则和共性功能,保证子类都能够实现这些方法,从而保证子类行为一致

接口的定义与实现


把接口与之前的普通类和抽象类作对比

普通类只有具体实现

抽象类具体实现和规范(抽象方法)都有

而接口只有规范,自己无法写方法

关键字interface

package com.flora.base.lovers.Demo07;
//接口都需要有实践类
public interface nserService {//接口中的所有定义其实都是抽象的(public abstract)void add(String name);void delete(String name);void update(String name);void query(String name);//接口中的属性都是常量(public static final)int age=99;
}
package com.flora.base.lovers.Demo07;public interface timeService {void time();
}
package com.flora.base.lovers.Demo07;
//类 可以通过关键字implements实现接口
//实现接口的类必须要重写接口中的方法
//接口可以实现多继承,继承的接口之间用逗号分隔
public class nserImpr implements nserService,timeService{@Overridepublic void add(String name) {}@Overridepublic void delete(String name) {}@Overridepublic void update(String name) {}@Overridepublic void query(String name) {}@Overridepublic void time() {}
}

接口的作用:

  1. 约束
  2. 定义一些方法,让不同的人实现抽象方法
  3. 接口内的方法是抽象的,属性是常量
  4. 接口不能被实例化,接口中没有构造方法
  5. implements关键字可以实现多个接口
  6. 实现接口的类必须要重写接口中的方法

内部类


package com.flora.base.lovers.Demo10;public class Outer {private int id=10;public void out(){System.out.println("这是外部类");}public class Inner{public void in(){System.out.println("这是内部类");}//内部类可以获得外部类的私有属性public void getId(){System.out.println(id);}}
}
//一个java类里可以有多个class类,但是只能有一个public class
class A{}
package com.flora.base.lovers.Demo10;public class Applicaation {static void main(String[] args) {Outer out=new Outer();//可以通过外部类来实现内部类的实例化**Outer.Inner inner=out.new Inner();inner.getId();//10inner.in();//这是内部类}
}

内部类就是在一个类的内部再次定义一个类,内部类分为四种:

成员内部类

静态内部类:成员内部类加一个static修饰符

局部内部类:在方法内定义的类

匿名内部类:不用将实例保存到变量中直接new

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《欲罢不能:刷屏时代如何摆脱行为上瘾》

《欲罢不能》不只是讲网瘾&#xff0c;而是把它归到“行为上瘾”这个大概念里说。核心就是&#xff0c;我们刷手机、打游戏停不下来&#xff0c;不是意志力差&#xff0c;是背后有顶尖设计师&#xff0c;盯着人类心理弱点设计了上瘾套路。 书里说行为上瘾和吸毒、喝酒的生…

家用照片打印天花板!佳能 PIXMA iP3500 驱动让色彩还原度拉满

作为摄影爱好者&#xff0c;平时喜欢把拍的照片打印出来做成相册&#xff0c;但家用打印机总达不到预期 —— 要么色彩偏暗&#xff0c;要么细节模糊&#xff0c;直到我找到适配佳能 PIXMA iP3500 的专属驱动&#xff08;https://www.qudongwu.com/xiazai_9543.html&#xff09…

Redis 事务(MULTI/EXEC)与 Lua 脚本的核心区别 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

办公党狂喜!惠普 Deskjet F4180 一体机驱动稳定版,打印扫描复印全在线

作为小型工作室的打工人&#xff0c;惠普 Deskjet F4180 一体机是我们的核心设备 —— 打印合同、扫描文件、复印资料全靠它&#xff0c;可之前的驱动总是掉链子&#xff1a;扫描时分辨率模糊&#xff0c;复印超过 10 页就卡纸&#xff0c;偶尔还会出现 “驱动冲突” 导致设备离…

2026年嘉应学院寒假算法冬令营结训赛

2026年嘉应学院寒假算法冬令营结训赛A B2029 大象喝水 - 洛谷 数学题,对于圆周率 π ,可以100之后再除回去,避免小数带来的精度误差。 void solve(){int h,r;cin>>h>>r;int sum=h*314*r*r;//cout<&l…

STM32上进行卡尔曼滤波

1.卡尔曼滤波介绍 卡尔曼滤波的核心是融合测量值和系统模型预测值,消除随机噪声,即用动态加权平均,逐步逼近真实状态。 2.程序简单分析 程序上首先初始化滤波器的参数,然后取芯片内部温度传感器的值,然后进行滤波…

上海团队与华盛顿大学联手:AI实现医学图像精准识别突破

这项由上海医疗图像洞察&#xff08;Medical Image Insights&#xff09;团队的史鹏程、陈佳伟、刘佳琦、张星林&#xff0c;联合华盛顿大学的李雷、滑铁卢大学的陈涛以及西安交通大学的研究人员共同完成的重大研究&#xff0c;于2025年11月发表在arXiv预印本服务器上&#xff…

SEO救星上线!Google Search Console新功能手把手教你秒提收录

SEO救星上线&#xff01;Google Search Console新功能手把手教你秒提收录SEO救星上线&#xff01;Google Search Console新功能手把手教你秒提收录先别急着点按钮&#xff0c;把“门”打开再说点“请求索引”之前&#xff0c;先给页面做个“全身体检”1. 看看有没有瞎写 noinde…

微信立减金回收,2026年最聪明的省钱新姿势你真的知道吗 - 京顺回收

春节脚步渐近,不少人翻看微信钱包时,会意外发现里面悄悄积攒了不少“微信立减金”。这些立减金看似金额不大,但日积月累下来,数量也颇为可观。然而,烦恼也随之而来:有些立减金临近过期,只能眼睁睁看着它们失效,…

多模一体破局:金仓数据库引领文档数据库国产化新征程

多模一体破局&#xff1a;金仓数据库引领文档数据库国产化新征程 在数字化转型的深水区&#xff0c;企业对数据处理的期待早已超越简单的存储与调用。文档数据库凭借其对半结构化数据的天然亲和力&#xff0c;已成为现代应用开发的重要支柱。然而&#xff0c;当企业面临技术自主…

跨平台虚拟机网络故障排查

引言跨平台虚拟机网络架构的常见应用场景网络故障对业务连续性的影响排查工具与方法概述常见网络故障类型虚拟机与宿主机通信失败跨虚拟机间通信问题外部网络访问异常DHCP/DNS配置错误防火墙或安全策略阻断基础排查步骤检查虚拟机网络适配器配置&#xff08;NAT/桥接/仅主机模式…

金仓数据库如何以“多模融合”重塑文档数据库新范式:技术实战与代码示例

文章目录金仓数据库如何以“多模融合”重塑文档数据库新范式&#xff1a;技术实战与代码示例一、性能实测&#xff1a;直面行业标杆&#xff0c;展现硬核实力二、内核筑基&#xff1a;企业级能力的原生继承三、无缝迁移与极致可用四、实践验证&#xff1a;电子证照系统的平滑替…

新加坡科技设计大学:AI音乐生成终于学会“听懂“人类喜好了

这项由新加坡科技设计大学AMAAI实验室的Dorien Herremans和Abhinaba Roy共同完成的研究发表于2025年11月&#xff0c;论文编号为arXiv:2511.15038v1。对这项突破性研究感兴趣的读者可以通过该编号查找完整论文内容。说起AI作曲&#xff0c;你可能已经听过那些能根据文字描述生成…

Meta团队首次发现:AI研究助手的成功竟然靠“不断试错“?

一支来自Meta FAIR实验室的研究团队&#xff0c;联合伦敦大学学院、Meta超级智能实验室和英属哥伦比亚大学的学者们&#xff0c;在2025年11月发表了一项开创性研究。这项研究深入探讨了什么让AI研究助手变得更加出色&#xff0c;论文发表在国际顶级学术期刊上&#xff0c;编号为…

《企业元宇宙架构设计,AI应用架构师如何打造经典》

企业元宇宙架构设计&#xff1a;AI应用架构师如何打造经典 一、引言&#xff1a;企业元宇宙不是噱头&#xff0c;是数字化转型的下一站 钩子&#xff1a;你见过“能预测未来”的工厂吗&#xff1f; 去年&#xff0c;我去参观一家长三角的汽车零部件工厂&#xff0c;车间里没有传…

基于 Flutter × OpenHarmony 构建应用选择主题部分实现

文章目录基于 Flutter OpenHarmony 构建应用选择主题部分实现前言背景Flutter OpenHarmony 跨端开发介绍开发核心代码心得总结基于 Flutter OpenHarmony 构建应用选择主题部分实现 前言 在现代移动应用开发中&#xff0c;“关于应用”页面是用户了解应用信息的重要入口。它…

激发集体好奇心的团队活动设计

激发集体好奇心的团队活动设计关键词&#xff1a;集体好奇心、团队活动设计、团队协作、创新思维、互动体验摘要&#xff1a;本文聚焦于激发集体好奇心的团队活动设计。通过系统分析背景&#xff0c;阐述核心概念&#xff0c;介绍具体算法原理与操作步骤&#xff0c;构建数学模…

实用指南:React Native学习路径与资源推荐

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Doris数据导入方案大全:从Kafka到HDFS的完整链路实现

Doris数据导入方案大全:从Kafka到HDFS的完整链路实现 1. 引入与连接 1.1 引人入胜的开场 想象一下,你是一家电商公司的数据分析师,每天都会有海量的用户行为数据产生,比如用户的浏览记录、购买记录、加购行为等等。这些数据就像一座巨大的金矿,如果能合理地挖掘和分析,…

导师推荐8个AI论文工具,专科生轻松搞定毕业论文!

导师推荐8个AI论文工具&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何助力论文写作&#xff1f; 在当今学术环境中&#xff0c;越来越多的专科生开始借助 AI 工具来提升论文写作效率。尤其是随着 AIGC&#xff08;人工智能生成内容&#xff09;技术的发展&#x…