static关键字和继承

news2024/12/24 21:36:20

1、static关键字

1.1案例题目

•	编程实现People类的封装,特征有:姓名、年龄、国籍,要求提供打印所有特征的方法。
•	编程实现PeopleTest类,main方法中使用有参方式构造两个对象并打印。
/*
    编程实现People类的封装
 */
public class People {
	
	// 1.私有化成员变量,使用private关键字修饰
	private String name;
	private int age;
	//private String country; // 隶属于对象层级,也就是每个对象都拥有独立的一份
	//public static String country; // 隶属于类层级,也就是整个类只有一份并且被所有对象共享
	private static String country;
	
	// 3.在构造方法中调用set方法进行合理值的判断
	public People() {}
	public People(String name, int age/*, String country*/) {
		setName(name);
		setAge(age);
		//setCountry(country);
	}
	
	// 2.提供公有的get和set方法,并在方法体中进行合理值的判断
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		if(age > 0 && age < 150) {
			this.age = age;
		} else {
			System.out.println("年龄不合理哦!!!");
		}
	}
	public static String getCountry() {
		return country;
	}
	public static void setCountry(String country) {
		//this.country = country;
		People.country = country;
	}
	
	public void show() {
		System.out.println("我是" + getName() + ",今年" + getAge() + "岁了,来自" + getCountry());
	}
}
/*
    编程实现People类的测试
 */
public class PeopleTest {
	
	public static void main(String[] args) {
		
		// 3.验证static关键字修饰的静态成员(类成员)是否与创建对象无关  类名.的方式 => 无关
		//System.out.println("获取到的国籍信息是:" + People.country); // null
		System.out.println("获取到的国籍信息是:" + People.getCountry()); // null
		
		// 1.使用有参方式构造两个People类型的对象并打印特征
		People p1 = new People("zhangfei", 30/*, "China"*/);
		p1.show(); // zhangfei 30 China
		
		People p2 = new People("guanyu", 35/*, "China"*/);
		p2.show(); // guanyu 35 China

		System.out.println("--------------------------------------------");
		// 2.验证static关键字修饰的静态成员(类成员) 是否被所有对象共享  => 共享
		//p1.country = "蜀国";
		p1.setCountry("蜀国");
		//System.out.println("第一个对象的国籍是:" + p1.country); // 蜀国
		//System.out.println("第二个对象的国籍是:" + p2.country); // 蜀国
		System.out.println("第一个对象的国籍是:" + p1.getCountry()); // 蜀国
		System.out.println("第二个对象的国籍是:" + p2.getCountry()); // 蜀国
		
		People p3 = new People();
		//System.out.println("第三个对象的国籍是:" + p3.country); // 蜀国
		System.out.println("第三个对象的国籍是:" + p3.getCountry()); // 蜀国
	}
}

1.2基本概念

•	使用static关键字修饰成员变量表示静态的含义,此时成员变量由对象层级提升为类层级,也就是整个类只有一份并被所有对象共享,该成员变量随着类的加载准备就绪,与是否创建对象无关。
•	static关键字修饰的成员可以使用引用.的方式访问,但推荐类名.的方式。


1.3使用方式

•	在非静态成员方法中既能访问非静态的成员又能访问静态的成员。
(成员:成员变量 + 成员方法,	静态成员被所有对象共享)
•	在静态成员方法中只能访问静态成员不能访问非静态成员。
(成员:成员变量 + 成员方法,	因为此时可能还没有创建对象)
•	在以后的开发中只有隶属于类层级并被所有对象共享的内容才可以使用
static关键字修饰。(不能滥用static关键字)

1.4构造块和静态代码块(了解)



构造块和静态代码块(熟悉)
•	构造块:在类体中直接使用{}括起来的代码块。
•	每创建一个对象都会执行一次构造块。
•	静态代码块:使用static关键字修饰的构造块。
•	静态代码块随着类加载时执行一次。

/*
    编程实现构造块和静态代码块的使用
 */
public class BlockTest {
	
	// 当需要在执行构造方法体之前做一些准备工作时,则将准备工作的相关代码写在构造块中即可,比如:对成员变量进行的统一初始化操作
	{
		System.out.println("构造块!"); // (2)
	}
	
	// 静态代码块会随着类的加载而准备就绪,会先于构造块执行
	// 当需要在执行代码块之前随着类的加载做一些准备工作时,则编写代码到静态代码块中,比如:加载数据库的驱动包等
	static {
		System.out.println("#####################静态代码块!");   // (1)
	}
	
	// 自定义构造方法
	public BlockTest() {
		System.out.println("====构造方法体!"); // (3)
	}
	
	public static void main(String[] args) {
		
		BlockTest bt = new BlockTest();
		
		
		BlockTest bt2 = new BlockTest();
	}
}

1.5又见main方法

•	语法格式:
public static void main(String[] args){}
•	参数使用的举例。
/*
    编程实现main方法的测试
 */
public class MainTest {
	
	public static void main(String[] args) {
		
		System.out.println("参数数组中元素的个数是:" + args.length);
		System.out.println("传递给main方法的实际参数为:");
		for(int i = 0; i < args.length; i++) {
			System.out.println("下标为" + i + "的形参变量数值为:" + args[i]);
		}
	}
}

1.6案例题目2

•	编程实现Singleton类的封装。
•	编程实现SingletonTest类对Singleton类进行测试,要求main方法中能得到且只能得到该类的一个对象。
/*
    编程实现Singleton类的封装
 */
public class Singleton {
	
	// 2.声明本类类型的引用指向本类类型的对象,使用private static关键字共同修饰
	//private static Singleton sin = new Singleton();  // 饿汉式
	private static Singleton sin = null;               // 懒汉式
	
	// 1.私有化构造方法,使用private关键字修饰
	private Singleton() {}
	
	// 3.提供公有的get方法负责将对象返回出去,使用public static关键字共同修饰
	public static Singleton getInstance() {
		//return sin;
		if(null == sin) {
			sin = new Singleton();
		}
		return sin;
	}
}

/*
    编程实现Singleton类的测试
 */
public class SingletonTest {
	
	public static void main(String[] args) {
		
		// 1.声明Singleton类型的引用指向该类型的对象
		//Singleton s1 = new Singleton();
		//Singleton s2 = new Singleton();
		//System.out.println(s1 == s2); // 比较变量s1的数值是否与变量s2的数值相等  false
		//Singleton.sin = null;  可以使得引用变量无效
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		System.out.println(s1 == s2); // true
	}
}

1.7单例设计模式的概念

•	在某些特殊场合中,一个类对外提供且只提供一个对象时,这样的类叫做单例类,而设计单例的流程和思想叫做单例设计模式。

1.7.1单例设计模式的实现流程

单例设计模式的实现流程
•	私有化构造方法,使用private关键字修饰。
•	声明本类类型的引用指向本类类型的对象,并使用private static关键字共同修饰。
•	提供公有的get方法负责将对象返回出去,并使用public static关键字共同修饰。

1.7.2单例设计模式的实现方式

•	单例设计模式的实现方式有两种:饿汉式 和 懒汉式,在以后的开发中推荐饿汉式。

2、继承(重中之重)

2.1继承的由来

2.2继承的概念

•	当多个类之间有相同的特征和行为时,可以将相同的内容提取出来组成一个公共类,
让多个类吸收公共类中已有特征和行为而在多个类型只需要编写自己独有特征和行为的机制,叫做继承。
•	在Java语言中使用extends(扩展)关键字来表示继承关系。
•	如:
public class Worker extends Person{}	- 表示Worker类继承自Person类其中Person类叫做超类、父类、基类。
其中Worker类叫做派生类、子类、孩子类。
•	使用继承提高了代码的复用性,可维护性及扩展性,是多态的前提条件。

2.3继承的特点

•	子类不能继承父类的构造方法和私有方法,但私有成员变量可以被继承只是不能直接访问。
•	无论使用何种方式构造子类的对象时都会自动调用父类的无参构造方法, 来初始化从父类中继承的成员变量,相当于在构造方法的第一行增加代 码super()的效果。


•	使用继承必须满足逻辑关系:子类 is a 父类,也就是不能滥用继承。
•	Java语言中只支持单继承不支持多继承,也就是说一个子类只能有一个父类,但一个父类可以有多个子类。

2.4案例题目

/*
    编程实现Person类的封装
 */
public class Person {
	
	// 1.私有化成员变量,使用private关键字修饰
	private String name;
	private int age;
	//private boolean gender; // 性别
	
	// 3.在构造方法中调用set方法进行合理值的判断
	public Person() {
		System.out.println("Person()");
	}
	public Person(String name, int age) {
		System.out.println("Person(String, int)");
		setName(name);
		setAge(age);
	}
	
	// 2.提供公有的get和set方法并在方法体中进行合理值的判断
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		if(age > 0 && age < 150) {
			this.age = age;
		} else {
			System.out.println("年龄不合理哦!!!");
		}
	}
	
	// 自定义成员方法实现特征的打印
	public void show() {
		System.out.println("我是" + getName() + ",今年" + getAge() + "岁了!");
	}
	// 自定义成员方法描述吃饭的行为
	public void eat(String food) {
		System.out.println(food + "真好吃!");
	}
	// 自定义成员方法描述娱乐的行为
	public void play(String game) {
		System.out.println(game + "真好玩!");
	}
}
/*
    自定义Worker类继承自Person类
 */
public class Worker extends Person {
	
	private int salary;
	
	public Worker() {
		super(); // 表示调用父类的无参构造方法,若没有加则编译器自动添加
		System.out.println("Worker()");
	}
	public Worker(String name, int age, int salary) {
		super(name, age); // 表示调用父类的有参构造方法
		System.out.println("Worker(String, int, int)");
		//setName(name);
		//setAge(age);
		setSalary(salary);
	}
	
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		if(salary >= 2200) {
			this.salary = salary;
		} else {
			System.out.println("薪水不合理哦!!!");
		}
	}
	
	// 自定义成员方法描述工作的行为
	public void work() {
		System.out.println("今天的砖头有点烫手...");
	}
	// 自定义show方法覆盖从父类中继承的版本
	@Override  // 标注/注解,用于说明下面的方法是对父类方法的重写,若没有构成重写则编译报错
	public void show() {
		super.show(); // 表示调用父类的show方法
		System.out.println("我的薪水是:" + getSalary());
	}
}

/*
    编程实现Worker类的测试
 */
public class WorkerTest {
	
	public static void main(String[] args) {
		
		// 1.使用无参方式构造Worker类型的对象并打印特征
		Worker w1 = new Worker();
		// 当子类重写show方法后,则下面调用的是重写以后的版本
		w1.show(); // null  0
		
		System.out.println("----------------------------------");
		// 2.使用有参方式构造Worker类型的对象并打印特征
		Worker w2 = new Worker("zhangfei", 30, 3000);
		w2.show(); // zhangfei ...
		// 调用成员方法测试
		w2.eat("豆芽");
		w2.play("王者荣耀");
		w2.work();
	}
}

2.5方法重写概念

•	从父类中继承下来的方法不满足子类的需求时,就需要在子类中重新写一个和父类一样的方法来覆盖从父类中继承下来的版本,该方式就叫做方法的重写(Override)。

2.6方法重写的原则

•	要求方法名相同、参数列表相同以及返回值类型相同,从Java5开始允许返回子类类型。
•	要求方法的访问权限不能变小,可以相同或者变大。
•	要求方法不能抛出更大的异常(异常机制)。

3、java常用开发工具

•	文本编辑器(TE,Text Editor)
•	记事本、Notepad++、Edit Plus、UltraEdit、…
•	集成开发环境(IDE,Integrated Development Environment )
•	Jbuilder、NetBeans、Eclipse、MyEclipse、IDEA、…

3.1下载和安装方式

•	下载地址:https://www.jetbrains.com/
•	安装方式:一路点击下一步默认安装即可

4、又见构造块和静态代码块(笔试)

•	先执行父类的静态代码块,再执行子类的静态代码块。
•	执行父类的构造块,执行父类的构造方法体。
•	执行子类的构造块,执行子类的构造方法体。

5、访问控制

5.1常用的访问控制符

修饰符

本类

同一个包中的类

子类

其他类

public

可以访问

可以访问

可以访问

可以访问

protected

可以访问

可以访问

可以访问

不能访问

默认

可以访问

可以访问

不能访问

不能访问

private

可以访问

不能访问

不能访问

不能访问

5.2注意事项

•	public修饰的成员可以在任意位置使用。
•	private修饰的成员只能在本类内部使用。
•	通常情况下,成员方法都使用public关键字修饰,成员变量都使用private 关键字修饰。

6、package语句的由来

•	定义类时需要指定类的名称,但如果仅仅将类名作为类的唯一标识,则不可避免的出现命名冲突的问题。这会给组件复用以及团队间的合作造成很大的麻烦!
•	在Java语言中,用包(package)的概念来解决命名冲突的问题。

6.1包的定义

•	在定义一个类时,除了定义类的名称一般还要指定一个包名,格式如下:
package 包名;
package 包名1.包名2.包名3...包名n;
•	为了实现项目管理、解决命名冲突以及权限控制的效果。

6.2定义包的规范

•	如果各个公司或开发组织的程序员都随心所欲的命名包名的话,仍然不能从根本上解决命名冲突的问题。因此,在指定包名的时候应该按照一定的规范。
•	org.apache.commons.lang.StringUtil
•	其中StringUtils是类名而org.apache.commons.lang是多层包名,其含义如下:org.apache表示公司或组织的信息(是这个公司(或组织)域名的反写);common 表示项目的名称信息;lang 表示模块的名称信息。

6.3包的导入

•	使用import关键字导入包。
•	使用import关键字导入静态成员,从Java5.0开始支持。

7、final关键字代码

7.1基本概念

•	final本意为"最终的、不可改变的",可以修饰类、成员方法以及成员变量。

7.2使用方式

•	final关键字修饰类体现在该类不能被继承。
-	主要用于防止滥用继承,如:java.lang.String类等。
•	final关键字修饰成员方法体现在该方法不能被重写但可以被继承。
-	主要用于防止不经意间造成重写,如:java.text.Dateformat类中format方法等。
•	final关键字修饰成员变量体现在该变量必须初始化且不能改变。
-	主要用于防止不经意间造成改变,如:java.lang.Thread类中MAX_PRIORITY等。

7.3常量的概念

•	final关键字修饰类体现在该类不能被继承。
-	主要用于防止滥用继承,如:java.lang.String类等。
•	final关键字修饰成员方法体现在该方法不能被重写但可以被继承。
-	主要用于防止不经意间造成重写,如:java.text.Dateformat类中format方法等。
•	final关键字修饰成员变量体现在该变量必须初始化且不能改变。
-	主要用于防止不经意间造成改变,如:java.lang.Thread类中MAX_PRIORITY等。

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

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

相关文章

Python+Texturepacker自动化处理图片

前言 本篇在讲什么 PythonTexturepacker自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖Texturepacker工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &…

ubuntu18.04 安装php7.4-xdebug

文章目录 场景解决 场景 apt install php7.4-xdebug 下载失败, 只好通过编译解决了 解决 https://xdebug.org/wizard 输入php -i的执行结果

mybatisplus映射解读

目录 自动映射 表映射 字段映射 字段失效 视图属性 Mybatis框架之所以能够简化数据库操作&#xff0c;是因为他内部的映射机制&#xff0c;通过自动映射&#xff0c;进行数据的封装&#xff0c;我们只要符合映射规则&#xff0c;就可以快速高效的完成SQL操作的实现。既然…

AI语音合成 VITS Fast Fine-tuning,半小时合成专属模型,部署训练使用讲解

前言 项目名&#xff1a;VITS-fast-fine-tuning &#xff08;VITS 快速微调&#xff09; 项目地址&#xff1a;https://github.com/Plachtaa/VITS-fast-fine-tuning 支持语言&#xff1a;中、日、英 官方简介&#xff1a; 这个代码库会指导你如何将自定义角色&#xff08;甚至…

低温试验中的液氮注入式宽温区超高精度温度控制解决方案

摘要&#xff1a;当前各种测试仪器中的低温温度控制过程中&#xff0c;普遍采用电增压液氮泵进行制冷和辅助电加热形式的控温方式。由于液氮温度和传输压力的不稳定&#xff0c;这种方式的控温精度仅能达到0.5K&#xff0c;很难实现小于0.1K的高精度控温。为此本文基于饱和蒸气…

知识梳理(一)

HTTPS握手过程 https的核心的技术&#xff1a;使用非对称加密传输对称加密的密钥&#xff0c;然后用对称加密通信 TLS http--超文本传输协议&#xff0c;是以前并且沿用至今的网页协议。 缺点&#xff1a;http属于明文传输 HTTP的明文传输带来的问题是无法防止中间人截获、…

VScode远程不用再输入密码操作

安装插件remote development 1.先检查自己电脑上有没有生成一对公钥和私钥。&#xff08;一般会在这个目录&#xff09; 如果没有的话就自己生成一下。 打开命令行输入以下命令 ssh-keygen -t rsa2.在虚拟机中先看一下有没有公钥和私钥。如果没有的话就自己生成一下。 打开…

pytorch2.x 官方quickstart测试

文章目录 1.本地环境2.[安装pytorch](https://pytorch.org/get-started/locally/) (Windows GPU版本&#xff09;3. [官方quickstart](https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html) 1.本地环境 D:\python2023>nvidia-smi Thu Jul 27 23:27:45…

idea项目依赖全部找不到

目录 1&#xff0c;出错现象2&#xff0c;解决3&#xff0c;其他尝试 1&#xff0c;出错现象 很久没打开的Java项目&#xff0c;打开之后大部分依赖都找不到&#xff0c;出现了所有的含有import语句的文件都会报错和一些注解报红报错&#xff0c;但pom文件中改依赖是确实被引入…

VS2015配置opencv4.1(x86和x64)

1.安装VS2015 vs版本和部门统一&#xff0c;安装C模块即可 2.安装opencv4.1 重点还是配置&#xff0c;安装opencv4.1&#xff0c;装就完事了 3.配置opencv4.1 给整麻了&#xff0c;配了一早上 3.1 在电脑属性中找到“高级系统配置” 3.2 环境变量 3.3 写上x86 和 x64的环…

草稿#systemverilog# 说说Systemverilog中《static》那些事儿(拓展篇)

3&#xff09;static和automatic可以将一个任务task或者函数function显式地声明成静态或者自动的&#xff1a;一个自动automatic 声明的任务、函数或块内声明的数据缺省情况下具有调用期或激活期内的生命周期&#xff0c;并且具有本地的作用范围&#xff1b; 一个静态static 声…

Java虚拟机——线程与协程

1 Java与线程 目前线程是Java里面进行处理器资源调度的最基本单位。如果日后Loom项目能够为Java引入纤程(Fiber)的话&#xff0c;可能会改变这一点。 1.1 线程的实现 这里先把Java技术的背景放下&#xff0c;以一个通用的应用程序的角度来看线程是如何实现的。 1.1.1 内核线…

C数据结构与算法——顺序查找和二分查找算法 应用

实验任务 (1) 掌握顺序查找算法的实现&#xff1b; (2) 掌握二分查找算法的实现&#xff1b; (3) 掌握两种查找算法的时间复杂度与适用场合。 实验内容 (1) 基于顺序查找表实现顺序查找和二分查找算法&#xff1b; (2) 使用两个不同大小的查找表进行两次理论和实际性能对比&…

利用STM32为主控以LORA为通讯模块,通过中继器链接MQTT服务器的物联网信息采集处理的信息系统方案

项目的详细方案如下&#xff1a; 硬件组成&#xff1a; STM32主控板&#xff1a;作为项目的主控单元&#xff0c;负责采集终端点位的温湿度信息&#xff0c;并通过LORA通讯模块发送数据到中继器。 LORA通讯模块&#xff1a;作为STM32与中继器之间的无线通信模块&#xff0c;负…

【NLP】语音识别 — GMM, HMM

一、说明 在语音识别的深度学习&#xff08;DL&#xff09;时代之前&#xff0c;HMM和GMM是语音识别的两项必学技术。现在&#xff0c;有将HMM与深度学习相结合的混合系统&#xff0c;并且有些系统是免费的HMM。我们现在有更多的设计选择。然而&#xff0c;对于许多生成模型来说…

浅谈集成式电力电容器无功补偿装置的技术特点及应用状况

安科瑞 华楠 摘要&#xff1a;阐述了集成式电力电容器无功补偿装置的组成与应用状况&#xff0e;在与常规电力电容器对比的基础上&#xff0c;分析了集成式电力电容器无功补偿装置的技术特点。通过对集成式无功补偿装置原理结构的分析&#xff0c;探讨了对集成式无功补偿装置的…

Spring Batch教程(四)tasklet使用示例:spring batch的定时任务使用

Spring batch 系列文章 Spring Batch教程&#xff08;一&#xff09; 简单的介绍以及通过springbatch将xml文件转成txt文件 Spring Batch教程&#xff08;二&#xff09;示例&#xff1a;将txt文件转成xml文件以及读取xml文件内容存储到数据库mysql Spring Batch教程&#xff…

TPU-MLIR编译部署算法

注意&#xff1a; 由于SOPHGO SE5微服务器的CPU是基于ARM架构&#xff0c;以下步骤将在基于x86架构CPU的开发环境中完成 初始化开发环境(基于x86架构CPU的开发环境中完成)模型转换 (基于x86架构CPU的开发环境中完成) 处理后的PP-OCR项目文件将被拷贝至 SE5微服务器 上进行推理…

el-table-column 合并列,切换表格显示,数据错乱问题

由于同一个页面需要通过lable进行切换显示不同的表格结果在切换的时候发现表格列错乱了 正常是这样的 切换错乱的是这样的 序号没有了&#xff0c;已接单协同总数列也不见了 切换回来发现第一个表格 原先的两列被后面的挤压了 代码也没啥毛病&#xff0c;最主要的原因是因为同…

【从零开始学习JAVA | 第三十二篇】 异常(下)新手必学!

目录 前言&#xff1a; Exceptions&#xff08;异常&#xff09;&#xff1a; 异常的两大作用&#xff1a; 异常的处理方式&#xff1a; 1.JVM默认处理 2.自己捕获异常 3.抛出处理 自定义异常&#xff1a; 异常的优点&#xff1a; 总结&#xff1a; 前言&#xff1a; 前…