【Java】面向对象基础

news/2025/12/7 14:56:00/文章来源:https://www.cnblogs.com/zbhgis/p/19318150

目录
  • 前言
  • 内容概览
  • 更新记录
  • 面向对象的概念
  • 对象的执行原理
  • 对象的注意点
  • this关键字
  • 构造器
  • 封装
  • 实体类JavaBean

前言

1.之前学过,因此本文是个人复习笔记,为视频的总结以及个人思考,可能不是很详细。

2.教程是b站黑马程序员的JAVASE基础课程,笔记中的大部分图片来自于视频中的PPT截图。

3.Java环境为Java SE 17.0.3.1,IntelliJ IDEA版本为2025.2

https://www.bilibili.com/video/BV1Cv411372m/?vd_source=3b69b85b41f42a9e26b3a8a195228a36

内容概览

1.本节内容包括面向对象的概念、执行原理,this关键字,构造器,封装,以及实体类JavaBean

2.笔记对应视频69-75节

更新记录

面向对象的概念

对象本质上是一种特殊的数据结构。class也就是类,也称为对象的设计图(或者对象的模板)。对象是用类new出阿里的,有了类就可以创建对象。

对象的执行原理

首先执行Test类,将其加载到方法区中,然后执行main();接下来需要创建学生类,需要调用Student类,因此将Student类加载到方法区中;由于开始创建对象,在栈内存中开始存储变量s1,并在堆内存中开辟新创建的对象的空间,s1存储具体对象的地址,地址指向的堆内存中存有对应的数据以及Student类的地址,其按照Student类的要求,创建对应的对象变量,存储值为默认值;此时对象s1根据具体对象的地址,指向堆内存中的数据,因此后续赋值时,对s1的各个变量赋值,相当于改变了s1地址指向的堆内存中的内部变量的值。

img

Student.java

package com.zbhgis.object;public class Student {String name;double chinese;double math;public void printTotalScore() {System.out.println(name + "总成绩是" + (chinese + math));}public void printAverageScore() {System.out.println(name + "平均成绩是:" + (chinese + math) / 2);}
}

ObjectDemo1.java

package com.zbhgis.object;public class ObjectDemo1 {public static void main(String[] args) {Student s1 = new Student();s1.name = "小明";s1.chinese = 100;s1.math = 10;s1.printTotalScore();s1.printAverageScore();Student s2 = new Student();s2.name = "李华";s2.chinese = 59;s2.math = 59;s2.printTotalScore();s2.printAverageScore();System.out.println(s1);System.out.println(s2);}}

打印结果

小明总成绩是110.0
小明平均成绩是:55.0
李华总成绩是118.0
李华平均成绩是:59.0
com.zbhgis.object.Student@15aeb7ab
com.zbhgis.object.Student@7b23ec81

对象的注意点

1.类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如Student, Car

2.类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)。

3.成员变量本身存在默认值,定义成员变量时不必赋值

4.一个代码文件中可以写多个class类,但只能一个用public修饰,且用public修饰的类名必须成为代码文件名。

5.对象与对象之间的数据不会相互影响,但是多个变量指向同一个对象就会相互影响

当多个变量指向同一对象,其地址相同,指向堆内存的空间也相同。

img

6.如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象

Java存在自动来及回收机制,会自动清楚掉垃圾对象。

package com.zbhgis.object;public class ObjectDemo2 {public static void main(String[] args) {Student s1 = new Student();// 成员变量存在默认值System.out.println(s1.name);System.out.println(s1.chinese);// 多个变量指向同一对象s1.math = 66;Student s2 = s1;s2.math = 99;System.out.println(s1.math);// 调用垃圾对象会报错s1 = null;System.out.println(s1.chinese);}
}

打印结果

null
0.0
99.0
Exception in thread "main" java.lang.NullPointerException: Cannot read field "chinese" because "s1" is nullat com.zbhgis.object.ObjectDemo2.main(ObjectDemo2.java:18)

this关键字

this就是一个变量,可以用在方法中,获取到当前对象。用于解决变量冲突问题

首先执行Test类,将其加载到方法区中,然后执行main();接下来需要创建学生类,需要调用Student类,因此将Student类加载到方法区中;由于开始创建对象,在栈内存中开始存储变量s1,并在堆内存中开辟新创建的对象的空间,其中存储具体对象的地址,s1存储具体对象的地址,地址指向的堆内存中存有对应的数据以及Student类的地址;此时对象s1.printThis()根据具体对象的地址,找到堆内存中的对象地址及其类地址,通过类地址找到调用到printThis(),即打印本身地址,又从堆内存中找到对象地址进行打印;s2同理。

img

Student.java

package com.zbhgis.object;public class Student {String name;double chinese;double math;public void printTotalScore() {System.out.println(name + "总成绩是" + (chinese + math));}public void printAverageScore() {System.out.println(name + "平均成绩是:" + (chinese + math) / 2);}public void printThis() {System.out.println(this);}public void printPass(double math) {// 解决变量命名冲突if (this.math < math) System.out.println("pass");else System.out.println("failure");}
}

ObjectDemo3.java

package com.zbhgis.object;public class ObjectDemo3 {public static void main(String[] args) {Student s1 = new Student();System.out.println(s1);s1.printThis();s1.math = 59;s1.printPass(60);Student s2 = new Student();System.out.println(s2);s2.printThis();s2.math = 100;s2.printPass(60);}
}

打印结果

com.zbhgis.object.Student@4eec7777
com.zbhgis.object.Student@4eec7777
pass
com.zbhgis.object.Student@3b07d329
com.zbhgis.object.Student@3b07d329
failure

构造器

创建对象时,对象会去调用构造器,完成对对象成员变量(属性)的初始化赋值。

public class 名字{

public 名字(){

...

}

}

类在设计时,如果不写构造器,Java是会为类自动生成一个无参构造器的

一旦定义了有参数构造器,Java就不会帮我们的类自动生成无参构造器了,此时就建议自己手写第一个无参构造器出来。

Teacher.java

package com.zbhgis.object;public class Teacher {String name;int age;public Teacher() {System.out.println("Teacher1");}public Teacher(String name, int age) {this.name = name;this.age = age;System.out.println("Teacher2");}
}

ObjectDemo4.java

package com.zbhgis.object;public class ObjectDemo4 {public static void main(String[] args) {Teacher t1 = new Teacher();System.out.println(t1.name);System.out.println(t1.age);Teacher t2 = new Teacher("明", 60);System.out.println(t2.name);System.out.println(t2.age);}
}

打印结果

Teacher1
null
0
Teacher2
明
60

封装

用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。通过修饰符public和private来控制对象的成员公开,实现合理暴露,合理隐藏。

Teacher.java

package com.zbhgis.object;public class Teacher {String name;int age;public Teacher() {}public Teacher(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void printAll() {System.out.println(this.name + " " + this.age);}
}

ObjectDemo5.java

package com.zbhgis.object;public class ObjectDemo5 {public static void main(String[] args) {Teacher t1 = new Teacher();t1.age = 40;t1.name = "明";t1.printAll();Teacher t2 = new Teacher("柳", 60);t2.setAge(77);t2.setName("花");t2.printAll();}
}

打印结果

明 40
花 77

实体类JavaBean

一种特殊的类,只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。其中,成员变量都要私有,并且要对外提供相应的get,set方法;且类中必须要有一个公共无参的构造器。

Lecture.java

package com.zbhgis.object;public class Lecture {private String name;private long code;public Lecture(){}public Lecture(String name, long code) {this.name = name;this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public long getCode() {return code;}public void setCode(long code) {this.code = code;}
}

LectureOperator.java

package com.zbhgis.object;public class LectureOperator {private Lecture lecture;public LectureOperator(Lecture lecture) {this.lecture = lecture;}public void printAll() {System.out.println(lecture.getName() + " " + lecture.getCode());}
}

ObjectDemo6.java

package com.zbhgis.object;public class ObjectDemo6 {public static void main(String[] args) {Lecture l1 = new Lecture();l1.setName("Geology");l1.setCode(1003499);System.out.println(l1.getName());System.out.println(l1.getCode());LectureOperator lp = new LectureOperator(l1);lp.printAll();}
}

打印结果

Geology
1003499
Geology 1003499

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

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

相关文章

归并分治模板

翻转对 class Solution { public:int findpairs(vector<int> &nums, int l, int r) {int mid = (l + r) >> 1;int i = l, j = mid + 1;int res = 0;for (; i <= mid; ++i) {while (j <= r &…

2025燕窝品牌实力排行榜:艾玛琳商贸以溯源科技领衔,六大高潜力燕窝衍生品与礼品企业深度解析

2025燕窝品牌实力排行榜:艾玛琳商贸以溯源科技领衔,六大高潜力燕窝衍生品与礼品企业深度解析 随着健康消费理念的持续深化与国潮文化的兴起,燕窝及其衍生品市场正经历一场深刻的变革。传统单一的干燕窝消费模式,正…

ABC 435 解题报告

A 略。 B 略。 C 记录当前可以弄倒的最远位置,记得和 \(n\) 取 \(\min\)。 D 考虑建反图,然后从每一个黑点开始 dfs 一遍,遇到黑点就停下(因为之后扩展到的点这个黑点一定也可以扩展到)。每个点至多被访问一次,均…

【创作分享】一个简单易用、功能强大的 AI 图片生成工具:NanoEdit(基于Gemini 3.0 Nano Banana Pro)

【创作分享】一个简单易用、功能强大的 AI 图片生成工具:NanoEdit(基于Gemini 3.0 Nano Banana Pro)最近这段时间,我一直在投入一个自己非常喜欢的小项目——NanoEdit。想做这件事的原因其实很简单: 我平时需要生…

街头徒手健身4高阶引体向上

4 高阶引体向上 我刚踏入健身行业时,修过私人教练课程,还读了不少专业教材,就是为了学习最优质的训练方案和最新的健身理念。我在文献中看到大量关于高位下拉器械的介绍,可关于经典实用的引体向上,内容却寥寥无几…

shell脚本内使用alias

shell脚本内使用aliasshopt -s expand_aliases放在所有alias定义前面。 root@root1:~/sh# cat test.sh #!/bin/bash shopt -s expand_aliases alias k="kubectl -n kube-system " k get pod

告别手动编码:如何用Screenshot-to-code搭建设计稿自动转HTML全流程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ffmpeg移植到arm

一、移植x264 1、进入解压后的路径x264-master,执行以下命令:./configure --enable-shared --prefix=/home/ubuntu/work/ffmpeg/_x264_install/ --host=arm-linux-gnueabihf --disable-asm 2、修改配置文件config.ma…

英语_阅读_songs playlists_待读

In the past, people listened to songs either one at a time or on an album. 过去,人们要么一次听一首歌,要么听一整张专辑。 But now its easy to choose your favourite songs and play them one after another…

Hello,World!

让我想想,这篇周记该从哪里开始写呢? NOIP?好像在自己的游记里已经写得很清楚了,重新读一遍自己的游记,看着自己写的最后一句话:我才高一,这是很多人新生活才刚开始的时候,我为什么却要想着放弃,时间还长,机…

JavaScript 转换(转译)工具———babel

通过 CDN/UNPKG 获取 —— 例如: https://unpkg.com/@babel/standalone@7.28.5/babel.min.js

JavaScript 转换(转译)工具———babel

通过 CDN/UNPKG 获取 —— 例如: https://unpkg.com/@babel/standalone@7.28.5/babel.min.js

完整教程:特斯拉 Tesla 面试经验分享|流程全解析 + 技术细节 + 面试感受

完整教程:特斯拉 Tesla 面试经验分享|流程全解析 + 技术细节 + 面试感受2025-12-07 14:22 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: …

12.1~12.7

装饰器原理与应用 无参数装饰器带参数装饰器保留原函数元信息我觉得oop就是以“对象”为核心的编程范式,通过类的抽象、继承、多态三大特性,实现代码复用、降低耦合度,让程序更易维护和扩展 封装 将属性和方法封装在…

深入解析:HTML `<fieldset>` 标签 `form` 属性深度解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

go net/http 学习笔记

概述 在使用 Go 开发时几乎都会用到 net/http 标准库。但是,对库的内部实现不了解,仅限于会用。遇到问题容易懵,比如:长连接和短连接有什么区别?具体什么实现原理? net/http 如何处理并发请求? net/http 有用到…

手搓LSTM网络——谷歌公司股票价格预测

无需多言,边打草稿边手搓 import numpy as np import pandas as pd import torch as t import torch.nn as nn import warnings# 实在是不想改这些错误了 warnings.filterwarnings(ignore, category=FutureWarning) w…

详细介绍:Java面向对象三大特性详解:封装、继承、多态与接口

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025.12.7日14:10-die down逐渐变弱,逐渐消失

ai智能发布助手当前Linux当前项目已使用内存MB是46 南京5℃ 霾 Listen to your inner voice and intuition; they will guide you in the right direction. 倾听自己内心的声音和直觉,它们会指引你正确的方向。 今日…

物联网AI模组:连接与智能的融合 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …