【JavaSE】保姆级教程|1万字+10张图学会类与对象--建议收藏

news2024/11/14 22:44:19

在这里插入图片描述

🌱博主简介:大一计科生,努力学习Java中!热爱写博客~预备程序媛
📜所属专栏:爪洼岛冒险记【从小白到大佬之路】
✈往期博文回顾: 【爪洼岛冒险记】第5站:多图解,超详细讲解Java中的数组、二维数组–建议收藏
🕵️‍♂️近期目标:成为千粉小博主。
🌺“再牛的程序员也是从小白开始,既然开始了,就全身心投入去学习技术”

👩‍🎨write in the front:

  • 这篇文章将带领大家从0开始,学会Java中的类&对象~看不懂找我!!!在线教你🙇‍♀️

JavaSE:类与对象

  • Part1:引入:
    • 1.1:人类的生活在面向对象化
    • 1.2:深入---万物皆对象
    • 1.2:面向对象编程三大关键:
  • Part2:为什么会有"类与对象"?
    • 2.1:现有技术无法满足需求
  • Part3:初识类&对象
    • 3.1:类的构成
    • 3.2:类的定义:
    • 3.3:对象的实例化
    • 3.4:类&对象的关系:
    • 3.5:成员变量的访问方式:
      • 3.5.1:成员变量的默认值
    • 3.6:深入内存分析-对象在内存中如何存在⭐:
      • 3.6.1:对象实例化过程图解:
      • 3.6.2:访问成员变量过程图解:
      • 3.6.3:总结:
    • 3.7:静态成员变量:
      • 3.7.1:静态成员变量的定义:
      • 3.7.2:内存分配:
      • 3.7.3:
  • Part4:详谈成员方法
    • 4.1:成员方法定义:
    • 4.2:成员方法内存分配问题:
    • 4.2.1:实例方法
    • 4.2.3:静态方法:
    • 4.2.3:总结:
  • Part5:不容小觑的细节
    • 5.1:实例方法内不能定义静态变量
    • 5.2:静态方法内不可定义静态变量
    • 5.3:静态方法内部不可调用实例方法
    • 5.4:总结:

Part1:引入:

🤹‍♀️相信很多了解过C和Java/C++的,一定对面向对象编程、面向对象编程、万物皆对象都早已耳闻了,那到底什么是面向对象,什么是面向过程呢?接下来会举一个生动的例子,让大家切身感受一下~

1.1:人类的生活在面向对象化

🍳古人饿了vs现代人饿了:

  • 古人饿了:
    在这里插入图片描述
  • 现代人饿了:
    在这里插入图片描述
    对比:
  • 古代人:古代人饿了,他们要从打猎、生火、做饭再到吃,要亲自把每一步都实现:
//伪代码:
public static void hunt(){
	hunt a woolf;
}
public static void makeFire(){
	...
}
cook(){
	食材:woolf;
	....
}
eat(){
	吃狼肉;
}
public static void main(String[] args){
	hunt();//打猎
	makeFire();//生火
	cook();//做饭
	eat();//吃
}
  • 现代人:饿了,可以叫个外卖,快递小哥接单,厨师做菜,快递小哥送单,最后吃。每个人各司其职,叫外卖的人不必知道外卖小哥是怎么送单,也不必知道厨师是如何做菜;同样,外卖小哥不必知道年轻人是如何打的电话,厨师又是如何做的菜…
//伪代码
//一:抽取出3个类
class youngMan{
	public void call();
	public void eat();
}
class manForTakeaway{
	public void takeOrders();
	public void delivery();
}
class cook{
	public void cooking();
}		
class Demo{
	public static void main(String[] args){
		//二:创建对象
		youngMan Ming = new youngMan();//创建明同学
		manForTakeaway Hua = new manFortakeaway();//创建出华这个外卖员
		cook Wang = new cook();//创建出厨师王

		//三:使用对象
		Ming.call();
		Hua.takeOrders();
		Wang.cooking();
		Hua.delivery();
		Wang.cooking();
	}
}

🙇‍♀️总结:

  • 面向过程:对于一个问题,分成几个步骤,逐步解决。
  • 面向对象:对于一个问题,把问题中的每一个事物都看成是一个对象,每个对象是唯一的,有属于自己的功能。只需要发挥每一个对象自己的功能,就能将问题解决。

1.2:深入—万物皆对象

🤷‍♀️虽然根据上面这两个例子,面向过程和面向对象,可见一斑。但是,你能说古人饿了这个问题,完全是面向过程的嘛?我其实认为不然。

  • 打猎:古人使用弓箭,但古人并不知道弓箭的箭与弓之间是如何受力,如何发射的,因为古人有射箭的属性,而发射是弓箭的属性。所以古人和弓箭二者就是对象。
  • 生火:古人有钻木取火的功能,但是木头因为摩擦而与空气发生燃烧,这是木头的性质与功能,古人并不具备。所以,这也能看成两个对象。

🦉综上,万物其实皆对象~

1.2:面向对象编程三大关键:

  • 找对象
    • 🌙对象从哪里来?对象由类而来。而类,就是具体事物的抽象.所以找对象的关键就是把具体事物抽象为类.
      eg:上面”现代人饿了“例子中,我们把具体的一个年轻人抽象为一类:youngMan;把具体的外卖员抽象为一个类:manForTakeaway;把具体的一个厨师抽象为一类:cook。
  • 创建对象
  • 使用对象

Part2:为什么会有"类与对象"?

当然,通过上面所讲,我们大概能参悟点对象&类的概念。我个人始终认为,要理解好一个概念,一个知识,如果能明白它为什么存在,存在的意义是什么?则能更好去理解和运用

2.1:现有技术无法满足需求

🙇‍♀️所有的技术,最后还是和现实生活接轨的,我们不可能只是简简单单的用编程来完成一些整数的运算,求最大公约数诸如此类…而且,只靠那些内置类型,是完全不够的。比如,你如何表示”人“这个类型?又如何表示”动物“这个类型?这些与现实生活相关,一些复杂的问题,仅仅靠int char Strin…是无法解决的,也许能,但是我想对开发人员也不友好吧,如果一开始就有”人“/”动物“这个类型,那得多方便~开发效率也会提高。
当然这也是我目前的一种理解,也许每个人有自己的理解,只要合理即可。

Part3:初识类&对象

3.1:类的构成

  • 字段/属性/成员变量
    • 普通成员变量
    • 静态成员变量(被static修饰)
  • 方法/行为
    • 普通成员方法
    • 静态成员方法
      在这里插入图片描述

3.2:类的定义:

  • 👩‍💼👨‍✈️👩‍⚖️👨‍🚒👩‍🏫👨‍⚕️👨‍🍳👩‍💻引子:现实生活中有各个职位的人,每一个具体职业的人,或者说每一个具体的人抽象起来,都有共同的属性(如:年龄,性别)和共同的行为(如:吃饭),可以形成一个类–人类。
class Person{
	String name;
	int age;
	public void eat(){
		System.out.print(name+"eating");
	}
}
  • 字段/属性/成员变量:定义在类的里面,方法的外面。

注意:类的命名采用大驼峰

3.3:对象的实例化

  • 🧘‍♀️由类来创建对象,我们叫做对象的实例化。
class Person{
	String name;
	int age;
	public void eat(){
		System.out.print(name+"eating");
	}
}
public class Demo{
	public static void main(){
	Person XiaoWang = new Person();//创建小王这个对象
	}
}
  • 类也可看作一种类型
  • 类是引用类型

3.4:类&对象的关系:

在这里插入图片描述

3.5:成员变量的访问方式:

  • 通过引用来访问成员变量/方法.person1是Person类变量(引用类变量)
class Person{
	String name;
	int age;
	public void eat(){
		System.out.print(name+"eating");
	}
}
public class Demo{
	public static void main(){
	Person person1 = new Person();
	//通过引用变量person1.来访问对象的属性
	person1.name="XiaoWang";
	person1.age=18;
	}
}

3.5.1:成员变量的默认值

在这里插入图片描述

3.6:深入内存分析-对象在内存中如何存在⭐:

3.6.1:对象实例化过程图解:

class Person{
	String name;
	int age;
	public void eat(){
		System.out.print(name+"eating");
	}
}
public class Demo{
	public static void main(){
	Person person1 = new Person();
	Person person2 = new Person();
	}
}

在这里插入图片描述

  • 首先Person person1的时候,Person类就会被加载进JVM的方法区</font》
  • 其次new Person()的时候,会在JVM的堆区中开辟一个空间,用来存储对象。
  • 最后再把该对象空间在堆区上的地址赋给栈区上的引用变量(类类型变量)person1.

3.6.2:访问成员变量过程图解:

class Person{
	String name;
	int age;
	public void eat(){
		System.out.print(name+"eating");
	}
}
public class Demo{
	public static void main(){
	Person person1 = new Person();
	person1.name = "XiaoWang";
	}
}

在这里插入图片描述

  • 首先通过对象名.属性找到该引用所指向其在堆内存上的对象,并访问其name属性
  • 由于name属性是引用类型,则会先在方法区常量池开辟空间来存储该常量字符串
  • 最后将该方法区处理字符串地址赋值给属性,即name

3.6.3:总结:

  • 对象存储在堆区上。
  • 普通成员变量依赖于对象存在,即每一个对象都有自己的普通成员变量
  • 类其实也是一种类型,类类型变量是引用类型变量,存放的是所指向对象在堆区上的地址.
  • 类,在计算机视角只是一个代码片段,放在JVM的方法区。不占用栈和堆的空间。

3.7:静态成员变量:

3.7.1:静态成员变量的定义:

class Person{
	String name;
	int age;
	//定义一个静态变量
	static int count=0;
}
public class Demo{
	public static void main(){
	Person person1 = new Person();
	}
}

3.7.2:内存分配:

在这里插入图片描述

  • 当类被加载进内存时,静态成员变量随着类一起进入方法区,并常驻方法区
  • 静态成员变量是依赖于类而不依赖与对象的

3.7.3:

class Person{
	String name;
	int age;
	//定义一个静态变量
	static int count=0;
}
public class Demo{
	public static void main(){
	Person person1 = new Person();
	Person person2 = new Person();
	//通过类直接访问静态变量(不依赖于对象)
	System.out.println(Person.count);
	//通过对象访问
	person1.count++;
	person2.count++;
	System.out.println(count);
	//2
	}
}
  • 无论有多少个对象,静态变量只占一份空间。对象对静态变量的修改都是对这一份空间的修改。

Part4:详谈成员方法

4.1:成员方法定义:

class Person{
	String name;
	int age;
	//如下,定义的eat()是一个成员方法
	public void eat(){
		System.out.print(name+"eating");
	}
}
public class Demo{
	public static void main(){
	Person person1 = new Person();
	person1.name = "XiaoWang";
	}
}
  • public:表示方法是公开的(后期细讲)

4.2:成员方法内存分配问题:

在这里插入图片描述

  • 一般认为,其实无论是static方法还是non-static方法,都是常驻内存空间的,即当类被加载进JVM的时候,方法信息(方法的指令数据,第一步干什么,第二步干什么)就被存储在了方法区中,不过此时的方法处于。-----方法的静态表现
  • 但是我们经常听说某某方法在栈区开辟内存,难道方法是存在与栈区上?no,no,no!我们通常所说方法在栈区开辟内存,其实是为这个方法开辟空间,或者说开辟方法的栈帧,来存方法中的局部变量、形参,这些数据,随着方法的调用而生成,随着方法的调用结束而销毁-----函数栈帧的创建&销毁。------方法的动态表现

4.2.1:实例方法

  • 实例方法其实就是普通成员方法(non-static method),上面说到,当类被加载进内存时,类中所有方法信息都被保存进了方法区。普通成员方法也在方法区,但是处于睡眠状态。你只有new对象来,用对象去调用该实例方法,该方法才会处于苏醒状态,并且该实例方法会记住它们属于哪个对象~,并指向此对象.实例方法运行过程中的形参、局部变量存储在栈区上。
    在这里插入图片描述
  • 综上,能调用实例对象的前提是—有对象!!!

4.2.3:静态方法:

  • 静态方法(static method),内存分配上也是随着类的加载,永驻方法区。与实例对象不同的是,它们不需要对象!!!即,静态方法和类绑定不需要创建对象,即可调用静态方法!
  • 但是静态方法被调用时,其局部变量&形参还是要在栈上开辟空间—方法栈帧。
  • 静态方法的意义:让该类所有对象共享方法。

4.2.3:总结:

  • 实例方法&静态方法均常驻内存.它们都是在类被加载进内存时分配了空间—加载时机、分配内存相同
  • 方法是作为代码(指令数据)加载进JVM方法区(不可写),方法占多少内存与static无关。与属性不同,不论有多少对象,方法的代码都是一样的,所以只需要一份内存来存放方法即可。
  • 实例方法运行起来表现不同,原因有二:1,所传形参不同;2,对象成员变量的值不同(属性不同)
  • 方法运行时,其临时变量、形参,会在栈区开辟内存存储----方法的栈帧

Part5:不容小觑的细节

5.1:实例方法内不能定义静态变量

  • 💥错误代码
class Person{
	String name;
	int age;
	//如下,定义的eat()是一个成员方法
	public void eat(){
		static int test;//erro!!!
		System.out.print(name+"eating");
	}
}
  • 首先实例方法是依赖对象,没有对象调用就不会运行。而static变量是随着对象的加载而在内存方法区中储存。
  • 把static变量定义在实例方法中,没有对象来调用方法使其运行,是无法为static变量开辟内存空间的。
  • 最后你要明白的是,实例方法属于对象,你把static定义在实例方法内部,就说明static变量属于对象,这是不对的。因为static变量属于类。

5.2:静态方法内不可定义静态变量

  • 💥错误代码
class Person{
	String name;
	int age;
	//如下,定义的eat()是一个成员方法
	public static void eat(){
		static int test();//erro!!!
		System.out.print(name+"eating");
	}
}
  • 上面讲成员方法使,已经很详细说了,static方法会保存进方法区,但是保存的是代码。
  • 其次,只有方法被调用,才会在运行,其内部变量才能开辟空间(局部变量&形参)
  • 把static变量定义在方法内部,方法不被调用,是不会未其开辟空间。这就导致类在加载进内存时无法储存static变量。故代码错误。

5.3:静态方法内部不可调用实例方法

  • 💥错误代码
class Person{
	String name;
	int age;
	int test(){
	}
	//如下,定义的eat()是一个静态成员方法
	public static void eat(){
		test();//erro!!!
		System.out.print(name+"eating");
	}
}
  • 实例方法永远依赖对象而存在。而静态方法依赖于类而存在。当用类去调用静态方法当然Ok,但当静态方法中有实例方法,此时没有对象,是无法调用此方法的!只有对象才可”唤醒“沉睡的实例方法啊!

5.4:总结:

  • 判断此类型,就要弄清楚先来后到
    类加载进内存。方法区存储:类的信息、方法信息(non-static&static方法的代码)、静态变量。–永远的第一步

  • 判断static修饰时,可以想想:如果没有对象,只用类名调用,行得通嘛?


🏄‍♀️下期预告–详细讲解Java中最重要的语法–封装
🙆‍♀️专栏系列文章:

  • 【爪洼岛冒险记】第5站:多图解,超详细讲解Java中的数组、二维数组–建议收藏
  • 【爪洼岛冒险记】第4站:Java中如何进行控制台输入&输出?用Java实现猜数字小游戏;超详细讲解Java中的方法:方法的重载,方法的签名
  • 【爪洼岛冒险记】第3站:任务1:学会int和String之间的转换;任务2:将Java运算符全部收入囊中~ 任务3:拿下Java中的类型提升
  • 【爪洼岛冒险记】第2站:带你学会:Java中三种输出语句,java中基本数据类型,学会变量,常量,类型转换知识点
  • 【爪洼岛冒险记】第1站:Java重要特性,JDK,JRE,JVM区别和联系,环境变量

🙈原创不易,如果对你有所帮助,还请三连+关注!我是瑶瑶子,持续输出优质文章!

在这里插入图片描述

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

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

相关文章

weston 1: 编译与运行傻瓜教程

sudo apt-get update sudo apt-get upgrade vim ~/.bashrc export WLD$HOME/install export LD_LIBRARY_PATH$WLD/lib export PKG_CONFIG_PATH$PKG_CONFIG_PATH:/home/zzj/install/lib/x86_64-linux-gnu/pkgconfig/ source ~/.bashrc 配置路径 此处根据个人电脑配置路径 …

高级Spring之BeanFactory的实现

Spring 的发展历史较为悠久&#xff0c;因此很多资料还在讲解它较旧的实现&#xff0c;这里出于怀旧的原因&#xff0c;把它们都列出来&#xff0c;供大家参考 DefaultListableBeanFactory&#xff0c;是 BeanFactory 最重要的实现&#xff0c;像控制反转和依赖注入功能&#x…

十六进制转八进制+超大数据处理(蓝桥杯基础练习C/C++)

目录 1 题目要求 2 代码 2.1 以十进制为媒介&#xff08;不可行&#xff09; 2.2 以二进制为媒介 3 可能会遇到的难点 4 结论 5 延伸 5.1 超大数据阶乘 5.2 超大数据加法 5.3 以十进制为媒介的进制转换 1 题目要求 2 代码 2.1 以十进制为媒介&#xf…

【LeetCode】一文吃透回溯算法(附例题)

回溯 DFS 算法深入浅出&#xff0c;一文吃透&#xff01; 原文同步在&#xff1a;https://github.com/EricPengShuai/Interview/blob/main/algorithm/回溯算法.md 回溯算法 主要参考的是 liweiwei 的总结 0. 概念 回溯法 采用试错的思想&#xff0c;它尝试分步的去解决一个问题…

MATLAB | 如何使用MATLAB绘制韦恩图的高阶版本:upset图

韦恩图随着阶数升高会越来越复杂&#xff0c;当阶数达到7或者以上时几乎没办法绘制&#xff1a; 但是使用upset图却可以比较轻易的绘制&#xff1a; 两种类型图的对应关系&#xff1a; 这期便教大家如何绘制这样的upset图&#xff1a; 教程部分 0 数据准备 数据需要的是0,1矩…

SQL注入现象

package com.bjpowernode.jdbc;import java.sql.*; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import java.util.Scanner; /*** 如果输入的用户名和密码是下面这样的&#xff0c;就会发生非注册人员登录的情况&#xff0c;叫做SQL注入…

【Java|golang】2287. 重排字符形成目标字符串

给你两个下标从 0 开始的字符串 s 和 target 。你可以从 s 取出一些字符并将其重排&#xff0c;得到若干新的字符串。 从 s 中取出字符并重新排列&#xff0c;返回可以形成 target 的 最大 副本数。 示例 1&#xff1a; 输入&#xff1a;s “ilovecodingonleetcode”, targ…

go tool pprof与trace的简单使用

pprof pprof是Google的程序采样分析工具&#xff0c;其使用分为&#xff0c;采样和分析。Go 语言内置了pprof。 Go 语言库中有两种方式使用pprof&#xff0c;一种是通过net/http/pprof库&#xff0c;另一种是通过runtime/pprof库。 net/http/pprof的简单使用 引入 _ "n…

【计算机网络】HTTP/HTTPS

HTTP网络协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一 理解网络协议 协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符…

零基础学MySQL(三)-- 对表中数据的增删改【新年快乐】

目录✨一、INSERT 语句&#xff08;添加表中数据&#xff09;1.基本语法2.应用案例3.使用细节&#x1f386;二、UPDATE 语句&#xff08;修改表中数据&#xff09;1.基本语法2.应用案例3.使用细节&#x1f387;三、DELETE 语句&#xff08;删除表中数据&#xff09;1.基本语法2…

【手写 Vue2.x 源码】第三十七篇 - 组件部分 - 组件的合并

一&#xff0c;前言 上篇&#xff0c;介绍了 Vue.extend 实现&#xff0c;主要涉及以下几个点&#xff1a; Vue.extend 简介&#xff1b;Vue.extend 实现&#xff0c;包括&#xff1a;组件初始化&#xff1b;子类继承父类&#xff1b;修复 constructor 指向问题&#xff1b; …

基于ssm jsp在线教育系统源码

演示视频&#xff1a; 基于ssm jsp在线教育系统源码范围 系统主要目标设计 随着互联网发展&#xff0c;在线教学成为一种支持知识共享&#xff0c;无距离知识交流的一种方式&#xff0c;我们的系统主要完成在线视频观看&#xff0c;在线教学&#xff0c;在线知识交流&#xff0…

虚幻引擎中CityEngine导入资产的自动化替换

在这篇博文中&#xff0c;我们将学习将 ArcGIS CityEngine Datasmith 场景导入虚幻引擎后替换资产的流程。 替换工作流由虚幻引擎的数据资产&#xff08;可以认为是简单的表格数据&#xff09;控制。 一旦设置正确&#xff0c;这些数据资产就可以在项目之间共享。 推荐&#x…

This old-style function definition is not preceded by a prototype

文章目录Introwarning 及解决 截屏知其然&#xff0c;却不知其所以然Intro 在 Xcode 14 中随意写了几个C命令行程序&#xff0c;编译运行OK。 但是有以下两种报错&#xff1a; This old-style function definition is not preceded by a prototype This function declaration…

联诚发携手电影《流浪地球2》,让电影特效和场景全面升级!

一万五千年前&#xff0c;一根愈合的人类股骨&#xff0c;标志着人类文明的诞生&#xff1b;一万五千年后&#xff0c;当太阳系将不复存在&#xff0c;人类的团结与勇气将延续文明的火种&#xff01;新年第一部精彩绝伦的国产科幻大片&#xff0c;大家期待已久的《流浪地球2》终…

动态规划的优化

动态规划的优化 一、空间优化 说明 动态规划空间优化为滚动数组优化&#xff0c;即对于一个多维数组&#xff0c;转移时均是由上一阶段转移来的&#xff0c;则可以将这一维省略&#xff0c;以降低空间复杂度&#xff0c;但要注意转移时的顺序&#xff1b; 例题 0 - 1 背包…

基础算法--背包问题(01背包问题、完全背包问题、多重背包问题、分组背包问题)

文章目录前言01背包问题完全背包问题多重背包问题分组背包问题前言 背包问题&#xff1a;给我们 i 件物品&#xff0c;每件物品都有体积 vi 和权重 wi &#xff0c;给我们限制条件&#xff0c;让我们选择在背包的容量内&#xff0c;物品达到权重最大 01背包问题 01背包问题描…

KK集团再冲刺港交所上市:期内被罚款30万元,曾存在“二清”问题

时隔一年&#xff0c;KK集团再次在港交所递交上市申请。2023年1月20日&#xff0c;KK集团&#xff08;KK Group Company Holdings Limited&#xff09;向港交所提交上市申请。据贝多财经了解&#xff0c;KK集团曾于2021年11月4日在港交所递表&#xff0c;后已“失效”。 相较于…

LeetCode_单周赛_329

2544. 交替数字和 代码1 转成字符串&#xff0c;逐个判断 class Solution {public int alternateDigitSum(int n) {char[] s ("" n).toCharArray();int t 1;int ans 0;for (int i 0; i < s.length; i) {ans (s[i] - 0) * t;t -t;}return ans;} }代码2 一…

国内做SaaS软件的知名企业有哪些?

SaaS厂商还挺多挺杂的。具体要列举的话&#xff0c;还是按照分类来吧。 通用业务和垂直行业的SaaS 对使用方来说&#xff0c;一般分为业务通用型和垂直行业型。 通用型是可以服务所有企业的&#xff0c;比如CRM&#xff08;客户管理软件&#xff09;、HR软件、协同办公软件&a…