【Java】面向对象笔记

news2024/11/27 13:51:08

开篇

主线

  1. 类及类的成员

    属性、方法、构造器;

    代码块,内部类

  2. 面向对象三大特征

    继承、封装、多态

  3. 其他关键字

    this,super,static,final,abstract,interface

面向对象的两个要素

一、是什么

类:对一类事物的描述,是抽象的、概念上的定义

对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)

  • 面向对象程序设计的重点是类的设计

  • 设计类,就是设计类的成员。(这个设计是动词)

二、类和对象的使用(面向对象思想落地的实现):

  1. 创建类,设计类的成员
  2. 创建类的对象
  3. 通过对象.属性对象.方法调用对象的结构

三、如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)

意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。

对象的内存解析

对象的内存解析

实践

public class PersonTest {
	public static void main(String[] args) {
		//2. 创建Person类的对象
		Person p1 = new Person();
		//和这个一样Scanner scanner = new Scanner(System.in);
		
		//调用对象的结构:属性、方法
		//调用属性:“对象.属性”
		p1.name = "Tom";
		p1.isMale = true;
		System.out.println(p1.name);
		
		//调用方法:“对象.方法”
		p1.eat();
		p1.sleep();
		p1.talk("Chinese");
		
		//*******************************
		Person p2 = new Person();
		System.out.println(p2.name);//null
		System.out.println(p2.isMale);
		//*******************************
		//将p1变量保存的对象地址值赋给p3,导致p1和p3指向了堆空间中的同一个对象实体。
		Person p3 = p1;
		System.out.println(p3.name);//Tom
		
		p3.age = 10;
		System.out.println(p1.age);//10
		
	}
}

//1.创建类,设计类的成员
class Person{
	
	//属性
	String name;
	int age = 1;
	boolean isMale;
	
	//方法
	public void eat(){
		System.out.println("人可以吃饭");
	}
	
	public void sleep(){
		System.out.println("人可以睡觉");
	}
	
	public void talk(String language){
		System.out.println("人可以说话,使用的是:" + language);
	}
	
}

类的成员

属性

属性(成员变量) vs 局部变量

  1. 相同点:

    • 定义变量的格式:数据类型 变量名 = 变量值
    • 先声明,后使用
    • 变量都有其对应的作用域
  2. 不同点:

    1. 在类中声明的位置的不同
      属性:直接定义在类的一对{}
      局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量

    2. 关于权限修饰符的不同
      属性:可以在声明属性时,指明其权限,使用权限修饰符。
      常用的权限修饰符:缺省(不写时默认)、private、public、protected —>详细在封装性中

      目前,大家声明属性时,都使用缺省就可以了。

      局部变量:不可以使用权限修饰符。

    3. 默认初始化值的情况:

      • 属性:类的属性,根据其类型,都有默认初始化值。
        整型(byte、short、int、long):0
        浮点型(float、double):0.0
        字符型(char):0 (或’\u0000’)
        布尔型(boolean):false
        引用数据类型(类、数组、接口):null
      • 局部变量:没有默认初始化值。
        意味着,我们在调用局部变量之前,一定要显式赋值。
        特别地:形参在调用时,我们赋值即可。
  3. 在内存中加载的位置:
    属性:加载到堆空间中 (非static)
    局部变量:加载到栈空间

  4. 总结

成员变量局部变量
声明的位置直接声明在类中方法形参或内部、代码块内、构造器内等
修饰符private、public、static、final等不能用权限修饰符修饰,可以用final修饰
初始化值有默认初始化值没有默认初始化值,必须显式赋值,方可使用
内存加载位置堆空间 或 静态域内栈空间

方法

方法的声明格式:

image-20230110125550880

注意:static、final、abstract 来修饰的方法,后面再讲。

说明:

  1. 关于权限修饰符:默认方法的权限修饰符先都使用public
    Java规定的4种权限修饰符:private、public、缺省、protected -->封装性再细说
  2. 返回值类型: 有返回值 vs 没有返回值
    • 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量:“return 数据”。
    • 如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要使用return.但是,如果使用的话,只能“return;”表示结束此方法的意思。
    • 我们定义方法该不该有返回值?
      ① 题目要求
      ② 凭经验:具体问题具体分析
  3. 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
  4. 形参列表: 方法可以声明0个,1个,或多个形参。
    • 格式:数据类型1 形参1,数据类型2 形参2,…
    • 我们定义方法时,该不该定义形参?
      ① 题目要求
      ② 凭经验:具体问题具体分析
  5. 方法体:方法功能的体现。

return关键字的使用:

  1. 使用范围:使用在方法体中
  2. 作用:
    ① 结束方法
    ② 针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据。
  3. 注意点:return关键字后面不可以声明执行语句。

递归调用

  • 方法的使用中,可以调用当前类的属性或方法

    特殊的:方法A中又调用了方法A:递归方法。

  • 方法中,不可以定义方法。⭐

练习

  1. 利用面向对象的编程方法,设计类Circle计算圆的面积。
package com.atguigu.exer;

public class CircleTest {
	public static void main(String[] args) {
		Circle circle = new Circle();
		circle.radius = 2;//半径
		System.out.println(circle.findArea());
	}
}

//圆
class Circle{
	double radius;

	public double findArea() {
		return Math.PI * radius * radius;
	}
}
  1. 编写程序,声明一个printMatrix方法,在方法中打印一个4行3列的*型矩形,在main方法中调用该方法。
public class Exer3Test {
	public static void main(String[] args) {
		Exer3Test test = new Exer3Test();
		test.printMatrix();
	}
	public void printMatrix() {
		for (int i = 0; i < 4;i++){
			for(int j = 0; j < 3;j++){
				System.out.print("* ");
			}
			System.out.println();
		}
	}
}
  1. 修改上一个程序,在printMatrix方法中,除打印一个4行3列的*型矩形外,再计算该矩形的面积,并将其作为方法返回值。在main方法中调用该方法,接收返回的面积值并打印。
public class Exer3Test {
	public static void main(String[] args) {
		Exer3Test test = new Exer3Test();
		System.out.println("面积是:" + test.printMatrix());
	}
	
	public int printMatrix() {
		for (int i = 0; i < 4;i++){
			for(int j = 0; j < 3;j++){
				System.out.print("* ");
			}
			System.out.println();
		}
		return 4 * 3;//返回矩形面积
	}
}
  1. 修改上一个程序,在printMatrix方法提供rowcolumn两个参数,方法中打印一个m*n*型矩形,并计算该矩形的面积, 将其作为方法返回值。在main方法中调用该方法,接收返回的面积值并打印。
public class Exer3Test {
	public static void main(String[] args) {
		Exer3Test test = new Exer3Test();
		System.out.println("面积是:" + test.printMatrix(4,3));
	}
	
	public int printMatrix(int row, int column) {
		for (int i = 0; i < row;i++){
			for(int j = 0; j < column;j++){
				System.out.print("* ");
			}
			System.out.println();
		}
		return row * column;//返回矩形面积
	}
}
  1. 对象数组题目:

定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。

  • 问题一:打印出3年级(state值为3)的学生信息。

  • 问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息

提示:

  1. 生成随机数:Math.random(),返回值类型double;

  2. 四舍五入取整:Math.round(double d),返回值类型long。

public class Exer3Test {
	public static void main(String[] args) {
		//对象数组,当作引用数据类型即可
		Student[] stus = new Student[20];
		for(int i = 0; i < stus.length; i++){
			stus[i] = new Student();//赋值(对象)
			stus[i].number = (i+1);
			stus[i].state = (int)(Math.random() * (6 - 1 + 1) + 1);
			stus[i].score = (int)(Math.random() * (100 + 1));
		}
		//输出成绩:打印出3年级(state值为3)的学生信息
		for (int i = 0; i < stus.length; i++) {
			if (stus[i].state == 3) {
				System.out.println(stus[i].showInfo());
			}
		}
		System.out.println("---------------------------");
		//使用冒泡排序按学生成绩排序,并遍历所有学生信息
		for (int i = 0; i < stus.length - 1; i++) {
			for (int j = 0; j < stus.length - 1 - i; j++) {
				if (stus[j].score > stus[j+1].score) {
					Student temp = stus[j];
					stus[j] = stus[j+1];
					stus[j+1] = temp;
				}
			}
		}
		for (int i = 0; i < stus.length; i++) {
			System.out.println(stus[i].showInfo());
		}
	}
}
/**
 * Student
 */
class Student {
	int number;
	int state;
	int score;

	public String showInfo() {
		return "学号:" + number + ",年级:" + state + ",成绩:" + score;
	}
}

改进,将其中的方法进行封装。优雅!!!

public class Exer3Test {
	public static void main(String[] args) {

		//对象数组,当作引用数据类型即可
		Student[] stus = new Student[20];
		for(int i = 0; i < stus.length; i++){
			stus[i] = new Student();//赋值(对象)
			stus[i].number = (i+1);
			stus[i].state = (int)(Math.random() * (6 - 1 + 1) + 1);
			stus[i].score = (int)(Math.random() * (100 + 1));	
		}

		//输出成绩:打印出3年级(state值为3)的学生信息
		Exer3Test test = new Exer3Test();
		test.searchState(stus, 3);
		System.out.println("---------------------------");
		//使用冒泡排序按学生成绩排序,并遍历所有学生信息
		test.bobuleSort(stus);
		test.print(stus);

	}

	/**
	 * 查找指定年级的学生并输出
	 * @param stus 要查找的学生数组
	 * @param state 要查找的年级
	 */
	public void searchState(Student[] stus, int state){
		for (int i = 0; i < stus.length; i++) {
			if (stus[i].state == state) {
				System.out.println(stus[i].showInfo());
			}
		}
	}
	
	/**
	 * 冒泡排序数组
	 * @param stus 要排序的数组
	 */
	public void bobuleSort(Student[] stus){
		for (int i = 0; i < stus.length - 1; i++) {
			for (int j = 0; j < stus.length - 1 - i; j++) {
				if (stus[j].score > stus[j+1].score) {
					Student temp = stus[j];
					stus[j] = stus[j+1];
					stus[j+1] = temp;
				}
			}
		}
	}

	/**
	 * 遍历输出数组
	 * @param stus	要遍历的数组
	 */
	public void print(Student[] stus){
		for (int i = 0; i < stus.length; i++) {
			System.out.println(stus[i].showInfo());
		}
	}
	
}
/**
 * Student
 */
class Student {
	int number;
	int state;
	int score;
	public String showInfo() {
		return "学号:" + number + ",年级:" + state + ",成绩:" + score;
	}
}
  1. 声明一个日期类型Date:有属性:年year,月month,日day。 创建2个日期对象,分别赋值为:你的出生日期,你对象的出生日期, 并显示信息。

    “没有对象,我很抱歉。” --鲁迅

public class Exer3Test {
	public static void main(String[] args) {
		Date myDate = new Date();
		Date exDate = new Date();
		myDate.setDate(2000, 10, 26);
		exDate.setDate(2000, 3, 11);
		System.out.println("我的生日" + myDate.print());
		System.out.println("前任生日" + exDate.print());
	}
}

class Date {
	int year;
	int month;
	int day;

	public void setDate(int year,int month,int day){
		this.year = year;
		this.month = month;
		this.day = day;
	}

	public String print() {
		return ("生日为:" + year + "年"
		 + month + "月" + day + "日。");
	}
}

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

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

相关文章

Java综合练习

Java综合练习一、涉及到的知识点二、卖飞机票三、找质数四、开发验证码五、数组元素的复制六、评委打分七、数字加密八、数字解密九、抢红包方法一&#xff1a;判断是否被抽取方法二&#xff1a;打乱数组十、模拟双色球土、二维数组一、涉及到的知识点 变量、数组运算符程序流…

python采集IP代理数据,防止数据采集IP被封情况

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 为什么要IP代理&#xff1a; 当采集数据, 批量采集数据, 请求速度过快, 网站可能会把你IP封掉 <你的网络进不去这个网站> IP代理换一个IP, 再去采集请求数据 一. 抓包分析数据来源 1. 明…

Runtime、ProcessBuilder的区别(Java中,两种方法来启动其他程序)

目录 ■Runtime、ProcessBuilder 区别&#xff1a; ■Java中提供了两种方法来启动其他程序 ■代码 ・Runtime ・ProcessBuilder ■类的方法 ・Process.waitFor()方法 ・Process.getErrorStream()方法 ・Process.redirectErrorStream(true)方法: ■可运行代码 ・java…

解读YOLOv8的改进模块

回顾一下YOLOv5 Backbone&#xff1a;CSPDarkNet结构&#xff0c;主要结构思想的体现在C3模块&#xff0c;这里也是梯度分流的主要思想所在的地方&#xff1b;PAN-FPN&#xff1a;双流的FPN&#xff0c;必须香&#xff0c;也必须快&#xff0c;但是量化还是有些需要图优化才可以…

“数据二十条”发布背后:国企下场探路,技术路径日渐清晰

科技云报道原创。 近日&#xff0c;中共中央、国务院对外发布了《关于构建数据基础制度更好发挥数据要素作用的意见》&#xff08;又称“数据二十条”&#xff09;&#xff0c;为数据要素的流通和使用起到了举旗定向的作用&#xff0c;让从业者都感到振奋。 必须承认的是&…

通信原理与MATLAB(十二):MSK的调制解调

目录1.MSK的调制原理2.MSK的解调原理3.MSK代码4.结果图5.特点1.MSK的调制原理 MSK调制原理如下图所示&#xff0c;基带码元先差分编码&#xff0c;然后经过串并转换分成I、Q两路&#xff0c;再与对应的载波相乘&#xff0c;然后再相加完成QAM的调制。 其中注意:I、Q两路码元分…

【深度学习】LSTM预测股票价格

入行深度学习1年多了&#xff0c;该还的还得还&#xff0c;没接触过LSTM的预测项目&#xff0c;这就来活了。 文章目录前言1. 开工1.1 引入必须的库1.2 数据初探1.3 划分数据集1.4 数据归一化1.5 数据分组1.6 搭建模型1.7 训练1.8 测试集总结前言 LSTM是一个处理时序关联的数据…

数据结构-第七期——并查集的应用(Python)

在学习并查集的应用之前&#xff0c;请大家先学习第六期-并查集的入门 ,这样会比较好理解 真题训练1 合根植物2017年第八届决赛&#xff0c;lanqiao0J题号110 【题目描述】 w 星球的一个种植园&#xff0c;被分成 mn 个小格子&#xff08;东西方向 m 行&#xff0c;南北方向…

dubbo-admin安装

一、dubbo-admin安装 1、环境准备 dubbo-admin 是一个前后端分离的项目。前端使用vue&#xff0c;后端使用springboot&#xff0c;安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk&#xff0c;maven&#xff0c;nodejs 安装n…

基于Python的geopandas库处理矢量几何的教程

前言在许多工作中中&#xff0c;我使用 ArcGIS 平台从事过许多与地理空间相关的项目&#xff0c;我非常喜欢这个平台。 这意味着我可以在具有尖端地理空间技术的项目中进行咨询&#xff0c;例如多维栅格、深度学习和空间物联网自动化。 考虑到这一点&#xff0c;我总是试图跟踪…

openstack增加一个计算节点

1.前言 由于资源有限&#xff0c;所以直接在存储节点&#xff08;block&#xff09;部署 由于存储节点最初只设计了一块网卡&#xff0c;所以需要增加一块网卡&#xff0c;名称为eth1&#xff0c;IP&#xff1a;192.168.200.30编辑ifcfg-eth1&#xff0c;然后重启网络systemct…

【优化】windows双网叠加 多网叠加 网速叠加 教程

【优化】windows双网叠加 多网叠加 网速叠加 教程 1 连接两个以上的网络, 网络不能是同一个 例如 网线-A wifi-B 2 控制面板\所有控制面板项\网络连接 最后 确定保存 同理 修改wifi-B的接口活跃点数为 25 并保存 如果没有生效 可以将两个网络连接禁用 再启用 通过命…

4656. 技能升级

4656. 技能升级 https://www.acwing.com/problem/content/4659/ 第十三届蓝桥杯省赛CC组 算法标签&#xff1a;贪心&#xff1b;多路归并&#xff1b;二分 思路 如果暴力来做的话&#xff0c;会将所有数放到一个集合里面排序&#xff0c;取前 mmm 项之和即可&#xff0c;但时…

Vue3——第六章(侦听器:watch、watchEffect)

一、watch 基本使用 在组合式 API 中&#xff0c;我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数&#xff1a; 二、侦听数据源类型 watch 的第一个参数可以是不同形式的“数据源”&#xff1a;它可以是一个 ref (包括计算属性)、一个响应式对象、一个 get…

5.2、运输层端口号、复用与分用的概念

1、端口号 运行在计算机上的进程使用进程标识符PID\color{red}进程标识符 PID进程标识符PID来标志。 因特网上的计算机并不是使用统一的操作系统 不同的操作系统(windows&#xff0c;Linux&#xff0c;Mac OS)又使用不同格式的进程标识符\color{red}不同格式的进程标识符不同…

ThreadLocal 实战应用

1 什么是 ThreadLocal&#xff1f;ThreadLocal 是一个关于创建线程局部变量的类。通常情况下&#xff0c;我们创建的变量是可以被任何一个线程访问并修改的。而使用 ThreadLocal 创建的变量只能被当前线程访问&#xff0c;其他线程则无法访问和修改。ThreadLocal 在设计之初就是…

CDN简单介绍

CDN 介绍 CDN (全称 Content Delivery Network)&#xff0c;即内容分发网络&#xff0c;服务器的静态资源存在CDN服务器上&#xff0c;用户在最近的CDN服务器上获取资源。 从功能上看&#xff0c;典型的 CDN 系统由分发服务系统、负载均衡系统和运营管理系统组成。分发服务系…

我利用 ChatGPT 提高工作效率的 5 种方式

技术应该是我们的朋友&#xff0c;而不是我们的敌人ChatGPT 在 11 月的发布改变了世界。学校阻止该计划&#xff0c;程序员对他们工作中新发现的效率赞不绝口&#xff0c;而创意人员则怀疑他们的工作是否受到威胁。每个人都在想同一个问题&#xff1a;ChatGPT 的未来会是什么样…

IPS+ESPC联动实现安全中心接管

目录 一、IPS介绍 原理 功能 缺陷 二、ESPC介绍 原理 功能 三、NIPSESPC联动 实验目的 实验过程 一、IPS介绍 原理 如今内部威胁增多&#xff0c;外部攻击剧增&#xff0c;防火墙存在着一定的局限性&#xff0c;如&#xff1a;部署在边界处&#xff0c;更多的是对一些…

环境搭建(python+pycharm(anconda可选)

python下载 python下载&#xff0c;由于网站服务器在国外&#xff0c;所以打开可能有点慢&#xff0c;也可以使用国内的镜像网站&#xff08;因为我没有试过&#xff0c;有兴趣的可以去尝试下&#xff0c;此文章的后面部分会有临时换源的操作&#xff09; 电脑位数的查看 …