Java知识点细节简易汇总——(7)面向对象编程(高级部分)
一、类变量、静态变量static

static访问方式:
public class VisitStatic {public static void main(String[] args) {//方法一://类名.类变量名//说明:类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问System.out.println(A.name);//方法二:A a = new A();//通过对象名.类变量名System.out.println("a.name=" + a.name);}
}class A {//类变量//类变量的访问,必须遵守 相关的访问权限. public static String name = "韩顺平教育";//普通属性/普通成员变量/非静态属性/非静态成员变量/实例变量private int num = 10;
}
二、静态方法,类方法static
public static void hi() {//类方法中不允许使用和对象有关的关键字,//比如 this 和 super。普通方法(成员方法)可以。System.out.println(this.n1);(报错)
}
静态方法(类方法)只能访问 静态方法或静态变量。
普通成员方法,既可以访问 非静态成员,也可以访问静态成
三、static课堂练习

答案:9 10 11
因为:count++ 所以先输出后++; 第一次 new count()方法,先输出9后,++则等于10。
第二次虽然也是new,但是是一个static方法,所以new出来的也是count=10。
四、main方法

五、代码块


作用:

(1) 下面的三个构造器都有相同的语句
(2) 这样代码看起来比较冗余
(3) 这时我们可以把相同的语句,放入到一个代码块中,即可
(4) 这样当我们不管调用哪个构造器,创建对象,都会先调用代码块的内容
(5) 代码块调用的顺序优先于构造器.
public class CodeBlock01 {public static void main(String[] args) {Movie movie = new Movie("你好,李焕英");System.out.println("===============");Movie movie2 = new Movie("唐探 3", 100, "陈思诚");}
}class Movie {private String name;private double price;private String director;{System.out.println("电影屏幕打开...");System.out.println("广告开始...");System.out.println("电影正是开始...");};public Movie(String name) {System.out.println("Movie(String name) 被调用...");this.name = name;}public Movie(String name, double price, String director) {System.out.println("Movie(String name, double price, String director) 被调用...");this.name = name;this.price = price;this.director = director;}
}
输出结果:

六、代码块的注意事项


七、单例设计模式
什么是单例:

单例模式应用实例:
以下代码不是单例模式,因为单例模式只能有一个实例对象。(只能有一个女朋友)
public class SingleTon01 {public static void main(String[] args) {GirlFriend xh = new GirlFriend("小红");GirlFriend xb = new GirlFriend("小白");}
}//有一个类, GirlFriend
//只能有一个女朋友
class GirlFriend {private String name;public GirlFriend(String name) {this.name = name;}
}
修改为:单例模式-饿汉式
public class SingleTon01 {public static void main(String[] args) {//通过方法可以获取对象GirlFriend instance = GirlFriend.getInstance();System.out.println(instance);}
}//有一个类, GirlFriend
//只能有一个女朋友
class GirlFriend {private String name;//为了能够在静态方法中,返回 gf 对象,需要将其修饰为 static//[单例模式-饿汉式]缺点:对象还没有创建就应该存在了。项目通常是重量級的對象, 饿汉式可能造成创建了对象,但是沒有使用,使得资源浪费 private static GirlFriend gf = new GirlFriend("小红红");/**如何保障我们只能创建一个 GirlFriend 对象*步骤[单例模式-饿汉式] * 1. 将构造器私有化 * 2. 在类的内部直接创建对象(该对象是 static)* 3. 提供一个公共的 static 方法,返回 gf 对象*/private GirlFriend(String name) {this.name = name;}public static GirlFriend getInstance() {return gf;}@Overridepublic String toString() {return "GirlFriend [name=" + name + "]";}
}
懒汉式:
public class SingleTon02 {public static void main(String[] args) {Cat instance = Cat.getInstance();System.out.println(instance);//再次调用 getInstanceCat instance2 = Cat.getInstance();System.out.println(instance2);System.out.println(instance == instance2);// T}
}//希望在程序进行过程中,只能创建一个 Cat 對象
//使用单例模式
class Cat {private String name;private static Cat cat; // 默认是 null/**步骤 * 1.仍然将造器私有化 * 2.定义一个 static 静态属性对象 * 3.提供一个 public 的 static 方法,可以返回一个Cat 对象 * 4.懒汉式:只有當用戶使用 getInstance 時,才返回 cat 对象, 后面再次调用时候,会返回上次创建的cat对象,* 从而保证了单例*/ private Cat(String name) {this.name = name;}public static Cat getInstance() {if (cat == null) { // 如果话沒有创建 cat 對象cat = new Cat("小可爱");}return cat;}@Overridepublic String toString() {return "Cat{" + "name='" + name + '\'' + '}';}
}
运行结果:

饿汉式 VS 懒汉式


个人总结:
饿汉式中只要GirlFriend被调用则,不管调用哪个函数或者属性 比如:调用GirlFriend中的public static int a = 1;的情况下
private static GirlFriend gf = new GirlFriend(“小红红”);一定会被执行,则“小红有可能就在不需要的情况下就会被创建。”
而懒汉式则应用到了
if (cat == null) { cat = new Cat(“小可爱…”); }
需要经过判断才会被执行
八、final关键字

一般情况下final和static一起使用效率更高,不会导致类加载。
public class A {public static void main(String[] args) {System.out.println(AA.num);}
}
class AA{public static int num = 999;static {System.out.println("AA静态代码块被执行...");}
}
输出结果:

static的代码块会被默认执行. . .
加上final后:
class AA{public final static int num = 999;static {System.out.println("AA静态代码块被执行...");}
}

final修饰的类或者属性被放在了常量池中
final练习://下面的代码是否有误,为什么?
public int addOne(final int x) { ++x; //错误,原因是不能修改 final x 的值return x + 1; //这里是可以,因为没有改变x的值
}
九、抽象类的介绍

抽象类细节

细节1:
public static void main(String[] args) {new AA(); // 报错!!!}
abstract class AA{
}

练习题:

十、模板模式——抽象类
//抽象类-模板设计模式
abstract class Template { // 抽象方法public abstract void job();// 实现方法,调用 job 方法public void calculateTime() {//得到开始的时间long start = System.currentTimeMillis();// 动态绑定机制job(); //得的结束的时间long end = System.currentTimeMillis();System.out.println("任务执行时间 : " + (end - start));}
}// AA 类
class AA extends Template {/** 计算任务* 1+....+ 800000* 实现 Template 的抽象方法 job*/@Overridepublic void job() {long num = 0;for (long i = 1; i <= 800000; i++) {num += i;}}
}// BB 类
class BB extends Template {// 这里也去,重写了 Template 的 job 方法public void job() {long num = 0;for (long i = 1; i <= 80000; i++) {num *= i;}}
}public class TestTemplate {public static void main(String[] args) {//子类调用父类方法。AA aa = new AA();aa.calculateTime(); // 这里还是需要有良好的 OOP 基础,对多态BB bb = new BB();bb.calculateTime();}
}
十一、接口

接口和抽象类里的方法 一样都不需要写具体的方法体。其实接口中的方法可以看似成抽象方法,只不过在接口中的方法abstrac关键字可以省略。
默认方法需要在方法名前加关键字:default。且default仅仅只能使用在接口中
接口的细节


细节6:
interface A{int n = 1; //实际上就等于 public static final int n = 1;
}
十二、接口 VS 继承
继承
小结: 当子类继承了父类,就自动的拥有父类的功能
如果子类需要扩展功能,可以通过实现接口的方式扩展.
可以理解 实现接口 是对 java 单继承机制的一种补充

十三、接口多态特征
//Usb接口
interface Usb{void start();void stop();
}//手机
class Phone implements Usb {@Overridepublic void start() {System.out.println("手机连接成功开始工作...");}@Overridepublic void stop() {System.out.println("手机断开成功结束工作...");}
}//照相机
class Camera implements Usb {@Overridepublic void start() {System.out.println("相机连接成功开始工作...");}@Overridepublic void stop() {System.out.println("相机断开成功结束工作...");}
}//主机——电脑
class Computer {public void work(Usb usb) {usb.start();usb.stop();}
}public class TestInterface {public static void main(String[] args) {Phone phone = new Phone(); Camera camera = new Camera(); Computer computer = new Computer();//将 相机 连接到主机电脑...computer.work(camera);//将 手机 连接到主机电脑...computer.work(phone);}
}
十四、接口多态传递
//通过BB bb = new CC();AA aa = new CC();}
}
interface AA {void getAA();
}
interface BB extends AA{}class CC implements BB {@Override //必须重写public void getAA() {// TODO Auto-generated method stub }
}
类的五大成员:属性、方法、构造器、代码块、内部类
十五、内部类

内部类一共有种:

15.1 局部 内部类

public static void main(String[] args) {Outer02 outer02 = new Outer02();outer02.m1();
}class Outer02 { // 外部类private int n1 = 100;private void m2() { System.out.println("Outer02 m2(私有方法)");}public void m1() { //方法/** 局部内部类是定义在外部类的局部位置,通常在方法中* 作用域 : 仅仅在定义它的方法或代码块中。例如:内部类Inner02()只能在m1()方法体内使用*/class Inner02{private int n1 = 999;//可以直接访问外部类的所有成员,包含私有的 属性 或 方法public void f1() {m2();//如果外部类和局部内部类的成员重名时System.out.println("内部类的属性: "+n1);System.out.println("外部类的属性: "+Outer02.this.n1);}}//外部类在方法中,可以创建 Inner02 对象,然后调用方法即可Inner02 inner02 = new Inner02();inner02.f1();}
}
15.2 匿名 内部类

public static void main(String[] args) {Outer03 out = new Outer03();out.method();}
}interface IA{public void cry();
}class Outer03 { // 外部类public void method() {/**基于接口的匿名内部类*老韩解读 * 1.需求: 想使用 IA 接口,并创建对象 * 2.传统方式,是写一个类,实现该接口,并创建对象* 3.老韩需求是 Tiger/Dog 类只是使用一次,后面再不使用* 4. 可以使用匿名内部类来简化开发 * 5. tiger 的编译类型 ? IA* 6. tiger 的运行类型 ? 就是匿名内部* 其实底层 会分配 匿名内部类一个类名 Outer03$1* jdk 底层在创建匿名内部类 Outer04$1,立即马上就创建了 Outer04$1 实例,并且把地址返回给 tiger* 匿名内部类使用一次,就不能再使用(这里指的是方法体中的内容,不是指tiger对象,tiger对象可以使用多次)*/ IA tiger = new IA() {@Overridepublic void cry() {System.out.println("老虎在叫唤...");}};tiger.cry();}
}
相关文章:
Java知识点细节简易汇总——(7)面向对象编程(高级部分)
一、类变量、静态变量static static访问方式: public class VisitStatic {public static void main(String[] args) {//方法一://类名.类变量名//说明:类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问System.out.println(A.…...
阻塞式队列-生产者消费者模型
1.阻塞队列是什么 阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则. 阻塞队列能是一种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队…...
引导滤波code
文章目录1. 原理概述2. 实验环节2.1 验证与opencv 库函数的结果一致2.2 与 双边滤波比较2.3 引导滤波应用,fathering2.3 引导滤波应用,图像增强2.4 灰度图引导,和各自通道引导的效果差异2.5 不同参数设置影响3. 参考引导滤波1. 原理概述 引导…...
Leetcode.2353 设计食物评分系统
题目链接 Leetcode.2353 设计食物评分系统 Rating : 1782 题目描述 设计一个支持下述操作的食物评分系统: 修改 系统中列出的某种食物的评分。 返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings类: FoodRatings(String[] foo…...
C语言学习_DAY_2_变量的定义_输入与输出
高质量博主,点个关注不迷路🌸🌸🌸! 目录 I. 变量的定义 II. 变量的赋值 III. 输出 IV. 输入 I. 变量的定义 首先,我们新建一个.c文件在Dev C中,并把之前定义好的程序框架放进去。 此时我…...
mac 安装navicat
由于各种原因发布不了链接,这里记录下,保存在了阿里云里...
RocketMQ快速入门
2.1 消息生产和消费介绍使用RocketMQ可以发送普通消息、顺序消息、事务消息,顺序消息能实现有序消费,事务消息可以解决分布式事务实现数据最终一致。RocketMQ有2种常见的消费模式,分别是DefaultMQPushConsumer和DefaultMQPullConsumer模式,这…...
【虚拟仿真】Unity3D实现从浏览器拉起本地exe程序并传参数
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 最近有项目需求,从浏览器调起来本地的exe程序&…...
Intel中断体系(1)中断与异常处理
文章目录概述中断与异常中断可屏蔽中断与不可屏蔽中断(NMI)异常异常分类中断与异常向量中断描述符表中断描述符中断与异常处理中断与异常处理过程堆栈切换错误码64位模式下的中断异常处理64位中断描述符64位处理器下的堆栈切换相关参考概述 中断是现代计…...
财报解读:四季度营收超预期,优步却越来越“不务正业”了
“公司第四季度的业绩表现将是强劲的”。 公布2022年第三季度财报时,优步的高管给出了这样的预告,给资本市场打了一针“强心剂”。然而有人对此表示质疑,后疫情时代,带着新模式、新车型的全新网约车公司层出不穷,车企…...
C语言-程序环境和预处理(14.2)
目录 预处理详解 1.预定义符号 2. #define 2.1 #define定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 注意事项: 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 3. #undef 4. 条件编译 4.1 单分支条件编译 4.2 多分支条件编译 4.3 判断是…...
VHDL语言基础-时序逻辑电路-计数器
目录 计数器的设计: 计数器的作用: 计数器的实现: 1、用“”函数描述: 用T触发器级联构成的串行进位的二进制加法计数器的仿真波形: 计数器的仿真: 计数器的设计: 计数是一种最简单基本的…...
MySQL数据库07——高级条件查询
前面一章介绍了基础的一个条件的查询,如果多条件,涉及到逻辑运算,and or 之类的。就是高级一点的条件查询。本章来介绍复杂的条件搜索表达式。 AND运算符 AND运算符只有当两边操作数均为True时,最后结果才为True。人们使用AND描述…...
《Terraform 101 从入门到实践》 第四章 States状态管理
《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。 军书十二卷,卷卷有爷名。 为什么需要状态管理 Terraform的主要作用是管理云平台上的资源ÿ…...
数据结构之二叉树
🎈一.二叉树相关概念 1.树 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合,树结构通常用来存储逻辑关系为 "一对多" 的数据。例如: 关于树的几个重要概念&…...
上海亚商投顾:三大指数集体调整 消费板块逆市活跃
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪三大指数今日集体调整,沪指全天弱势震荡,创业板指盘中跌超1%。旅游、食品、乳业等大消费板块…...
【2023unity游戏制作-mango的冒险】-开始画面API制作
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:游戏制作 ⭐mango的冒险-开始画面制作⭐ 文章目录⭐mango的冒险-开始画面制作⭐👨&…...
【微服务】Nacos配置管理
🚩本文已收录至专栏:微服务探索之旅 👍希望您能有所收获 Nacos除了可以做配置管理,同样可以当作注册中心来使用。 了解注册中心用法点击跳转👉【微服务】Nacos注册中心 一.引入 当微服务部署的实例越来越多࿰…...
【C++】类与对象理解和学习(上)
专栏放在【C知识总结】,会持续更新,期待支持🌹类是什么?类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它(实例化后才…...
Pyqt5小案例,界面与逻辑分离的小计算器程序
直接看下最终效果: 使用技术总结 使用Designer设计界面 使用pyuic5命令导出到python文件 新建逻辑处理文件,继承pyuic5导出的文件的类,在里面编写信号与槽的处理逻辑 使用Designer设计界面 要使用Designer,安装一个Python库即…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
