Java知识点细节简易汇总——(7)面向对象编程(高级部分)

news2025/5/28 1:09:27

一、类变量、静态变量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;
	}

	@Override
	public String toString() {
		return "GirlFriend [name=" + name + "]";
	}
}

懒汉式:

public class SingleTon02 {
	public static void main(String[] args) {
		
		Cat instance = Cat.getInstance();
		System.out.println(instance);
		
		//再次调用 getInstance
		Cat 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;
	}

	@Override
	public 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
	 */
	@Override
	public 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 {
	@Override
	public void start() {
		System.out.println("手机连接成功开始工作...");
	}

	@Override
	public void stop() {
		System.out.println("手机断开成功结束工作...");
	}
}

//照相机
class Camera implements Usb {
	@Override
	public void start() {
		System.out.println("相机连接成功开始工作...");
	}

	@Override
	public 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() {
			@Override
			public void cry() {
				System.out.println("老虎在叫唤...");
			}
		};
		tiger.cry();
	}
}

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

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

相关文章

代码随想录NO38 |动态规划——leetcode 343. 整数拆分 96.不同的二叉搜索树

动态规划—leetcode 343. 整数拆分 96.不同的二叉搜索树今天是动态规划第三天的题&#xff0c;动态规划这块儿题目比较多&#xff01; 343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的…

拼经济促发展,雨花区脚踏实地将“民生愿景”变为“幸福实景”

2022年&#xff0c;面对国内外复杂的经济形势&#xff0c;我国经济发展依旧保持稳中向好态势。经济增长总体平稳且后续动力强劲&#xff0c;物价涨幅持续可控&#xff0c;结构调整积极推进。经济增长由政策刺激向自主增长有序转变&#xff0c;继续朝着宏观调控的预期方向发展&a…

Linux环境下Redis单机、集群升级部署

目录 前言 一、Redis安装环境准备 二、安装升级Redis 1.Redis升级前准备&#xff08;首次安装忽略&#xff09; 2.Redis安装 总结 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可…

回顾 | .NET MAUI 跨平台应用开发 - 用 .NET MAUI 开发一个无人机应用(下)

点击蓝字关注我们编辑&#xff1a;Alan Wang排版&#xff1a;Rani Sun微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0c;将…

七、Linux文件 - main函数参数讲解、代码实现cp指令

目录 1、main函数参数 2.cp指令的使用 3、实现cp指令 3.1实现cp指令-入门版 3.2实现cp指令-进阶版 1、main函数参数 int main(int argc,char *argv[]) {return 0; } C语言规定了main函数的参数只能由2个&#xff0c;一个是argc,一个是argv,并且argc只能是整数&#xff0c…

[Leetcode] 打开转盘锁(BFS求最短路径)

题目链接&#xff1a;https://leetcode.cn/problems/open-the-lock/你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 。每个拨轮可以自由旋转&#xff1a;例如把 9 变为 0&#xff0c;0 变为 9 。每次旋转都只能旋转一个拨轮…

你不会还不知道arrify的内部到底是怎么执行的吧?

作为一个前端工程师&#xff0c;经常会遇见转换成数组的需求&#xff0c;被转换的对象有可能是String、Set()、null、Map()、undefined、或者是数组本身。我们最经常的做法就是写一个arrify函数帮我去进行转换。久而久之因为经常会做不同的项目中遇到同样的需求所以我们通常会把…

WeNet - 初识

文章目录关于 WeNet快速上手识别训练环境准备训练关于 WeNet Production First and Production Ready End-to-End Speech Recognition Toolkit github: https://github.com/wenet-e2e/wenet官方中文说明&#xff1a;https://github.com/wenet-e2e/wenet/blob/main/README_CN.md…

分享宠物店微信小程序制作步骤_宠物店管理系统怎么做

大多数人对于动物医疗专业知识比较匮乏&#xff0c;再加上宠物医疗费用&#xff0c;日常用品都略高&#xff0c;宠物店/宠物医院的前景&#xff0c;再未来依旧可观。 相比于实体店&#xff0c;线上平台无疑有着更广阔的拓客渠道和销售前景&#xff0c;做宠物店/宠物医院小程序…

Java进阶(下篇)

Java进阶&#xff08;下篇&#xff09;Java进阶 P387一、IDEA使用与多线程1.概述①idea安装②IDEA常用设置③idea快捷键设置④模板的使用和设置2.程序进程、线程概念3.单核cpu与多核cpu任务执行_ 并行与并发4.多线程优点5.创建多线程方式一&#xff1a;继承Thread类6.线程常用方…

[oeasy]python0078_设置索引颜色_index_color_ansi_控制终端颜色

更多颜色 回忆上次内容 上次 了解了 高亮颜色 91-97 是 高亮 前景色101-107是 高亮 背景色 颜色种类 在原来基础上 增加了一些但也非常有限 还想要 更精细的颜色 有可能吗&#xff1f;&#xff1f;&#x1f914; 更多颜色 继续深挖 关于 逃逸字符的文档 可以用 索引颜色 …

MyBatis源码概述及运行原理解析(篇一)

&#x1f426;MyBatis源码概述及运行原理解析 MyBatis的整体架构分为三层&#xff0c;分别是基础支持层、核心处理层和接口层 &#x1f58c; 中文注释源码Git地址 &#x1f5bd;架构图 &#x1f4c2;源码结构 &#x1f4c1;parsing包 &#x1f5ca;parsing包对应基础支持层中…

Matlab论文插图绘制模板第76期—半对数刻度折线图(Semilogx和Semilogy)

在之前的文章中&#xff0c;分享了Matlab双对数刻度折线图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下半对数刻度折线图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matlab进行科研…

为什么bitnami 安装的软件进入容器,用户名都是I have no name

文章目录背景原因user 参数的缺陷一### user 参数的缺陷二Docker 官方的解决方案背景 在bitnami 安装的软件进入容器用户名都显示I have no name&#xff0c;这是什么原因呢&#xff1f; 原因 在k8中容器默认好像是以uid1001启动的&#xff0c;可以修改该uid docker 启动的时…

leaflet 实现左卷帘效果 (代码示例045)

第045个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中实现左卷帘效果,这里主要引用了leaflet-side-by-side这个插件,直接调用的话,CSS方面有些问题,需要自行调整一下。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配…

目标检测论文阅读:GaFPN算法笔记

标题&#xff1a;Construct Effective Geometry Aware Feature Pyramid Network for Multi-Scale Object Detection 会议&#xff1a;AAAI2022 论文地址&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/19932 文章目录Abstract1. Introduction2. Related Work2.…

探索 Google 的 Bard AI 的强大功能

谷歌最近推出了名为“Bard AI”的新人工智能项目。 该项目旨在改善人工智能的语言和创造力&#xff0c;是谷歌旨在推进人工智能发展的更大“红色代码”计划的一部分。 该项目的主要目标是开发一种可以生成创意写作的语言模型。 什么是巴德人工智能&#xff1f; Bard AI 是一种…

Python 数据库开发实战 - Python与Redis交互篇- 缓存新闻数据至redis

实现新闻缓存功能 - “news_dao.py” - 从数据库提取明确的新闻数据保存至 redis - search_cache() 方法 只有在新闻被管理员审批通过的时候&#xff0c;新闻才可以缓存到 redis 里面。 管理员在 “审批新闻” 的时候是可以获得到 “被审批通过的新闻” 的 id&#xff0c;所以…

Allegro如何用Label Tune功能自动调整丝印到器件中心

Allegro如何用Label Tune功能自动调整丝印到器件中心 在做PCB设计的时候,调整丝印是比较费时的工作,如果需要把整板的丝印位号调整到器件的中心做装配图使用,Allegro的Label Tune功能支持快速把丝印位号居中到器件中心。 以下图为例,快速把所有丝印位号居中 调整前 调整后…

若依框架 --- 偶发的el-select无法选择的问题

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…