Java类和对象详解

article/2025/7/21 19:26:07

文章目录

    • 1.初步认识
    • 2.类的定义与实例化
      • 2.1 类的定义
      • 2.2 类的实例化与使用
    • 3.this关键字
    • 4.对象的构造和初始化
      • 4.1 默认初始化
      • 4.2 就地初始化
      • 4.3 构造方法初始化
    • 5.对象的打印
    • 6.包的理解
      • 6.1 导入包中的类
      • 6.2 自定义包
      • 6.3 包访问权限
    • 7.封装
      • 7.1 访问限定符详解
    • 8.static关键字
      • 8.1 修饰成员变量
      • 8.2 修饰成员方法
    • 9.代码块
      • 9.1 构造代码块
      • 9.2 静态代码块
      • 9.3 代码块的执行顺序


1.初步认识

C语言是面向过程的,关注的是过程,分析出解决问题的步骤。而Java是面向对象的,关注的是对象,将事件拆分为多个对象,对象间相互完成一件事件

2.类的定义与实例化

2.1 类的定义

class ClassName{variate;    //成员变量method;     //成员方法
}

Java中使用class来定义类,ClassName为类名,{}内部为类的主体部分,里面一般包含 成员变量和成员函数

public class MobilePhone {public int price;     //成员变量public void call(){  //成员函数;}
}

注意事项:

  • 一个文件中最好只定义一个类
  • public修饰的类必须和文件名相同

2.2 类的实例化与使用

类是一种自定义类型,其与int,double类似。我们使用int,double来创建变量,而使用类来创建对象,该过程也叫做类的实例化的过程。Java中一般配合new关键字来进行对象的实例化。

public class Dog {public String name;public String kind;public void print(){;}public static void main(String[] args) {Dog dog1=new Dog();   //通过new进行实例化对象Dog dog2=new Dog();dog1.name="小黑";    //访问类的成员dog2.name="小白";dog1.kind="藏獒";dog2.kind="杜宾";dog1.print();dog2.print();}
}

类与内置类型非常相似,其只有在实例化出对象后,对应的对象才会占用实际的地址空间

在这里插入图片描述

注意点:

  • 使用 . 来访问类中的成员变量或者成员方法
  • 同一个类可以创建多个实例
  • 实例化出的对象存储的是成员变量,成员方法在方法区中存储。
  • 类是一种引用类型,因此每次实例化对象,都会在堆上的开辟一份空间。

3.this关键字

首先我们定义一个日期类:

public class Date {public int _year;public int _month;public int _day;public void init(int year,int month,int day){_year=year;_month=month;_day=day;}public void print(){System.out.println(_year+"-"+_month+"-"+_day);}public static void main(String[] args) {Date d1=new Date();Date d2=new Date();d1.init(2025,1,1);d2.init(2025,10,1);d1.print();d2.print();}
}

对于上述类,有一个问题是:

Date类中有init和print成员函数,但函数的实现中并未对不同对象进行区分,那么d1调用init函数时,该函数是如何知道应该设置的对象是d1,而不是d2 ?

Java中使用this关键字来处理该问题。 Java中==所有非静态的成员函数(未被static修饰)==均有一个隐含的this引用。

谁调用类中的方法,this就指向谁,函数体内成员变量的访问都是通过this引用进行。

假设Data的成员变量分别为: year,month,day,则

public void init(int year,int month,int day){year=year;month=month;day=day;
}
// 由于局部变量优先,因此此处相当于形参给自己赋值,无法完成初始化。public void init(int year,int month,int day){this.year=year;this.month=month;this.day=day;
}
// 使用this可以很好的解决。

因此,在设计成员函数时,使用成员变量最好加上this

4.对象的构造和初始化

4.1 默认初始化

定义时不设置初值,此时会成员变量为其类型的默认值。

就地初始化: 定义的时候直接给出初始值。

public class TestDemo {// 默认初始化public int x;     //0public String s1; //nullpublic void print(){System.out.println("x="+ x+" s1="+s1);}public static void main(String[] args) {TestDemo t=new TestDemo();t.print();
}

4.2 就地初始化

声明的同时给出初始值。

public class TestDemo {// 就地初始化public int y=1;        //1public String s2="1";  //1public void print(){System.out.println("y="+ y+" s2="+s2);}public static void main(String[] args) {TestDemo t=new TestDemo();t.print();
}

4.3 构造方法初始化

构造方法是一种特殊的成员方法,其在对象的整个声明周期只会被调用一次且在创建对象时由编译器自动调用,主要用来初始化对象。

其特征为:

  • 方法名与类名相同
  • 无返回值
  • 构造方法可以重载
  • 实例化时由编译器自动调用
public class Date {public int year;public int month;public int day;public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public void print(){System.out.println(year+"-"+month+"-"+day);}public static void main(String[] args) {//Date d1=new Date();   报错//d1.print();Date d2=new Date(2025,5,29);d2.print();   //打印2025-5-29} 
}

如上注释部分为什么会报错呢?

如果类中未显示的定义给出构造方法,则编译器会自动生成一个无参的默认构造方法,一旦用户显示定义编译器就不会再生成构造方法

IDEA可以快速的定义构造方法:
在这里插入图片描述

构造函数中,可以使用其他构造函数来简化代码:

public class Date {public int year;public int month;public int day;public Date(){this(2025,5,29);}public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}
}

5.对象的打印

如何实现默认打印对象中的属性? 重写toString方法

public String toString() {return "Date{" +"year=" + year +", month=" + month +", day=" + day +'}';}

IDEA可以快速实现toString方法的重写:

在这里插入图片描述

6.包的理解

包简单来说就是一个文件夹,文件夹里面有许多类,我们写代码时如果使用了某个类的方法,就需要导入这个包中的对应类。因此,可以说包是一种类的组织方式,提升了可读性以及防止类名冲突。

6.1 导入包中的类

//1. 直接导入指定的包下的类(java,util均为文件夹,Scanner为类)
import java.util.Scanner;
//2. 该导入含义: 用到哪个类就导入哪个类,不是讲util下所有类均导入
import java.util.*;
public class Test {public static void main(String[] args) {//3. 使用时直接导入,但太麻烦,平时写不推荐java.util.Date date=new java.util.Date();}
}

并不推荐像方法2式的导入,因为可能会引进冲突。例如: 在util和sql包下均有Date类,那么用Date类时,就不知道该匹配哪个包下的Date类。

使用 import static 可以导入一些静态的方法。

import static java.lang.Math.*;
public class Test {public static void main(String[] args) {//java.util.Date data=new java.util.Date();int x=8,y=16;//静态导入有时更加方便些。//double result=Math.sqrt(Math.pow(x,2)+Math.pow(y,2));double result=sqrt(pow(x,2)+pow(y,2));}
}

6.2 自定义包

规则:

  • 包名采用小写
  • 在文件最上方写package语句来指明该文件是哪个包下的,如果未写,则会会放到默认包下。

使用IDEA创建包:

1.右击src -> new -> package

在这里插入图片描述

2.创建Package后,可以选择指定的包,右击 -> new -> calss
在这里插入图片描述

分别在不同级别的包bit,demo1创建类TestBit,TestDemo1,结果:

在这里插入图片描述

6.3 包访问权限

不同于C++,Java的访问权限有四种: public protected private 包访问权限

在定义一个类时,如果成员变量/方法未指定访问权限,则默认为包访问权限。

private: 只允许在类中访问成员,不可以在类外访问。

包访问权限: 必须在一个包下,不同类才能相互访问,如果不同的包,则需要import导入需要的类。

//bit.demo1下的类Computer
package bit.demo1;
public class Computer {private String cpu;private String menory;public String screen;String brand;    //未指明访问权限,默认包权限
}
//bit下的类TestBit
package bit;
import bit.demo1.Computer;  //不同包要使用所需的类,需要import指定包下的类
public class TestBit {//包访问权限: 只能在同一个包下访问Computer cp=new Computer();//报错,private: 只允许在类中访问//cp.cpu//cp.menory
}

:类的访问权限 要么是public 要么不加

7.封装

面向对象程序的三大特性: 封装,继承,多态

封装: 将对象的属性和实现细节隐藏起来,仅通过外部接口来与对象进行交互。

7.1 访问限定符详解

在这里插入图片描述

public修饰: 基本都可以访问

protected修饰: 主要用于继承。

private修饰: 同一个包的同一个类内才能访问。

包访问权限: 同一个包内的才能访问,否则,import导入指定类。

8.static关键字

成员变量分为: 1.静态成员变量 2.非静态成员变量

成员方法分为: 1.静态成员方法 2.非静态成员方法

8.1 修饰成员变量

public class Student {private String name;private int age;public static String classRoom;public Student(String name, int age) {this.name = name;this.age = age;}public static void main(String[] args) {Student s1=new Student("张三",18);Student s2=new Student("李四",19);}
}

在这里插入图片描述

如上,我们可以发现,被static修饰的成员变量不在对象中了。

实际上, 被static修饰的成员变量也叫做类变量,其不属于某个类,而是被所有类对象共享,存放在方法区,且只有一份

其访问方式为:

// 1.正确方式: 类名.类变量
Student.classRoom="c1";// 2.可以但不恰当的访问方式: 对象.类变量
// 这种方式会报警告
s1.classRoom="c1";
s2.classRoom="c1";

静态变量的核心特征是其不依赖于对象,不需要实例化对象

8.2 修饰成员方法

与静态成员变量类似,静态成员方法不依赖于对象。其访问方式与类变量基本一致。

public class Student {private String name;private int age;public static String classRoom;public static void print(){System.out.println("静态方法");}public static void main(String[] args) {Student s1=new Student();//方法一: 对象.静态方法//这种写法可以但不恰当,会发生警告,但非常不推荐s1.print();Student s2=new Student();s2.print();//方法二: 类名.静态方法//这是正确访问方法Student.print();}
}

静态方法是不依赖于对象的,而非静态是依赖于对象的,因此可以推出相关结论:

  • 非静态方法中可以直接调用静态方法,因为静态方法不依赖于对象。
  • 静态方法中不可以直接调用非静态方法,因为非静态依赖于对象,必须先new一个对象才能调用。
  • 静态方法中不能使用this,因为this是哪个对象调用就指向谁,但静态方法不依赖对象,因此不知道指向。
  • 静态方法中无法直接访问非静态的成员变量,因为其是依赖于对象的,因此想调用,必须先new对象。

理解如上结论的关键就是知道: 静态方法是不依赖于对象的,而非静态成员是依赖于对象的

9.代码块

代码块主要有: 1.静态代码块 2.构造/实例化代码块 3.普通代码块 4.同步代码块

9.1 构造代码块

一般用来初始化实例化的成员变量。

public class Computer {private String cpu;private String screen;private static int price;{cpu="Intel";screen="OLED";System.out.println("构造代码块");}
}

9.2 静态代码块

使用static定义的代码块,一般用于初始化静态成员变量

public class Computer {private String cpu;private String screen;private static int price;static{price=7599;System.out.println("静态代码块");}
}

9.3 代码块的执行顺序

大体上来说: 静态代码块>实例代码块>构造方法 ,如果是相同级别的代码块,按序执行。

public class Computer {private String cpu;private String screen;private static int price;{cpu="Intel";screen="OLED";System.out.println("构造代码块");}static{price=7599;System.out.println("静态代码块");}public Computer(){System.out.println("不带参数的构造方法");}public static void main(String[] args) {Computer cp=new Computer();}
}//结果:
静态代码块
构造代码块
不带参数的构造方法

注意点:

  • 静态代码块无论生成多少个对象,都只执行一次。
  • 实例代码块在创建类对象时才被执行

http://www.hkcw.cn/article/sjIwIArIfJ.shtml

相关文章

【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)

引言 Fyne 是一个使用 Go 语言编写的、易于使用的跨平台 GUI 工具包和应用程序 API。它旨在通过单一代码库构建在桌面和移动设备上运行的应用程序。本文档面向有一定 Go 语言开发经验的开发者,将详细介绍 Fyne 最新版的核心功能,包括基础组件、布局系统…

1. pytorch手写数字预测

1. pytorch手写数字预测 1.背景2.准备数据集2.定义模型3.dataloader和训练4.训练模型5.测试模型6.保存模型 1.背景 因为自身的研究方向是多模态目标跟踪,突然对其他的视觉方向产生了兴趣,所以心血来潮的回到最经典的视觉任务手写数字预测上来&#xff0…

武警智能兵器室系统架构设计与关键技术解析

在现代化武警部队建设中,武器弹药的安全管理与快速响应能力直接影响部队战斗力。本文基于某实战化智能兵器室建设案例,深入解析其系统架构设计、关键技术实现及创新管理机制,为安防领域提供可借鉴的解决方案。 整体拓扑结构 系统采用分层分布…

HTML5 列表、表格与媒体元素、页面结构分析

1. 列表 无序列表 有序列表 定义列表 列表对比 2. 表格 跨列 跨行 跨行和跨列 3. HTML5的媒体元素 视频元素 注意:autoplay现在很多浏览器不支持了! 音频元素 4. 页面结构分析 5. 总结

中文文本分析及词云生成

一、代码解析(按执行顺序) 1. 库导入 import jieba # 中文分词工具 from wordcloud import WordCloud # 词云生成器 from collections import Counter # 词频统计 import matplotlib.pyplot as plt # 可视化 import numpy as np # 图像矩阵处理 f…

芯片手册解读

一: 1.这是一款差分转单端的芯片: 2.给出了逻辑高低的识别门限:并不是大于100mv和小于-100mv就识别不到了——而是大于100mv和小于-100mv都可以识别到,手册的意思仅仅代表门限节点而已,完全可以在进入门限后的其他电…

LangChain-Tool和Agent结合智谱AI大模型应用实例2

1.Tool(工具) 定义与功能 单一功能模块:Tool是完成特定任务的独立工具,每个工具专注于一项具体的操作,例如:搜索、计算、API调用等 无决策能力:工具本身不决定何时被调用,仅在被触发时执行预设操作 输入输出明确:每个工具需明确定义输入、输出参数及格式 2.Agent(…

专业级图片分割解决方案

在日常处理图片的过程中,我们常常会遇到需要将一张图分割成多个小图的情况。这一款高效又实用的图片分割工具——它操作简单、功能强大,关键是完全免费开源,适合所有有图像处理需求的朋友! 在使用之前,先花几分钟把它…

Re--题

一.[NSSCTF 2022 Spring Recruit]easy C 直接看for循环,异或 写代码 就得到了flag easy_Re 二.[SWPUCTF 2021 新生赛]非常简单的逻辑题 先对这段代码进行分析 flag xxxxxxxxxxxxxxxxxxxxx s wesyvbniazxchjko1973652048$-&*&l…

iOS 集成网易云信IM

云信官方文档在这 看官方文档的时候&#xff0c;版本选择最新的V10。 1、CocoPods集成 pod NIMSDK_LITE 2、AppDelegate.m添加头文件 #import <NIMSDK/NIMSDK.h> 3、初始化 NIMSDKOption *mrnn_option [NIMSDKOption optionWithAppKey:"6f6568e354026d2d658a…

边缘计算网关支撑医院供暖系统高效运维的本地化计算与边缘决策

一、项目背景 医院作为人员密集的特殊场所&#xff0c;对供暖系统的稳定性和高效性有着极高的要求。其供暖换热站传统的人工现场监控方式存在诸多弊端&#xff0c;如人员值守成本高、数据记录不及时不准确、故障发现和处理滞后、能耗难以有效监测和控制等&#xff0c;难以满足…

Google Earth Pro 7.3 中文绿色版 - 谷歌地球专业版(精准定位,清晰查看您家位置)

谷歌卫星高清地图 下载链接&#xff1a;https://pan.quark.cn/s/c6069864c9f3 Google Earth Pro-7.3.6.9796-x64 Google Earth WinMac安装版 GoogleEarthProPortable googleearthpromac-intel-7.3.6.10155 GoogleEarthProWin-7.3.6.10155 GoogleEarthProWin-x64-7.3.6.10…

【工作笔记】 WSL开启报错

【工作笔记】 WSL开启报错 时间&#xff1a;2025年5月30日16:50:42 1.现象 Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x80370114 Error: 0x80370114 ??????????????????Press any key to continue...

《TCP/IP 详解 卷1:协议》第3章:链路层

以太网和IEEE802局域网/城域网标准 IEEE802局域网/城域网标准 IEEE 802 是一组由 IEEE&#xff08;电气与电子工程师协会&#xff09;定义的局域网和城域网通信标准系列&#xff0c;涵盖了从物理层到链路层的多个网络技术。其中&#xff1a; IEEE 802.3 定义的是传统的以太网…

【定昌linux开发板】设置密码的有效时间

查看密码策略命令 sudo chage -l 用户名 先查询下默认情况下&#xff0c;密码策略 结果&#xff1a; 可以看出&#xff0c;密码没什么策略 那么我要设置30天后过期&#xff0c;并且七天前要进行提醒 sudo chage -M 30 用户名 再进行查询&#xff0c;结果如下 显示密码的有…

Vue-数据监听

数据监听 基础信息 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>数据监听</title><!-- 引入Vue --><script type"text/javascript" src"../js/vue.js&qu…

Java 注解式限流教程(使用 Redis + AOP)

Java 注解式限流教程&#xff08;使用 Redis AOP&#xff09; 在上一节中&#xff0c;我们已经实现了基于 Redis 的请求频率控制。现在我们将进一步升级功能&#xff0c;使用 Spring AOP 自定义注解 实现一个更优雅、可复用的限流方式 —— 即通过 RateLimiter 注解&#xf…

C++学习-入门到精通【10】面向对象编程:多态性

C学习-入门到精通【10】面向对象编程&#xff1a;多态性 目录 C学习-入门到精通【10】面向对象编程&#xff1a;多态性一、多态性介绍&#xff1a;多态电子游戏二、类继承层次中对象之间的关系1.从派生类对象调用基类函数2.将派生类指针指向基类对象3.通过基类指针调用派生类的…

基于springboot的医护人员排班系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

1、python代码实现与大模型的问答交互

一、基础知识 1.1导入库 torch 是一个深度学习框架&#xff0c;用于处理张量和神经网络。modelscope是由阿里巴巴达摩院推出的开源模型库。 AutoTokenizer 是ModelScope 库的类&#xff0c;分词器应用场景包括自然语言处理&#xff08;NLP&#xff09;中的文本分类、信息抽取…