JavaSE基础 --- 类与对象

news2025/1/12 0:56:26

1.类与对象的定义

类是一种抽象的数据类型,它描述了一类对象的行为和状态。例如,我们可以定义一个名为“Dog”的类,它描述了狗这类动物的一般特性,如颜色、品种等状态,以及跑、叫等行为。

对象则是类的实例,也即具体化,代表了类定义的实体。比如,一条具体的狗可以被看作是“Dog”这个类的一个对象。它拥有该类中定义的各种属性(如颜色、名字、品种等)和方法(如跑、叫等)。因此,可以说对象是类的实现,而类则是对象的定义。

2.类与类的实例化(对象)

语法:

// 创建类
class <class_name>{
field;//成员属性
method;//成员方法
}
// 实例化对象
<class_name> <对象名> = new <class_name>();

其中class为类的关键字,classname是类名,{}中的就是方法主体,类中变量称之为类的成员变量,方法称之为成员方法

举例

class Person {
    public int age;//成员属性 实例变量
    public String name;
    public String sex;
    public void eat() {//成员方法
    System.out.println("吃饭!");
    }
public void sleep() {
    System.out.println("睡觉!");
    }
}

类的实例化

public class Main{
    public static void main(String[] args) {
        Person person = new Person();//通过new实例化对象
        person.eat();//成员方法调用需要通过对象的引用调用
        person.sleep();
        //产生对象 实例化对象
        Person person2 = new Person();
        Person person3 = new Person();
    }
}

输出结果为

吃饭!

睡觉!

 3.类的成员

类的成员可以包含以下:字段、方法、代码块、内部类和接口等,本篇为基础篇,介绍前三个.

3.1字段/属性/成员变量(用来描述一个类中有哪些数据)

举例:

class Person {
    public String name; // 字段
    public int age;
}
class Test {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);
        System.out.println(person.age);
    }
}

// 执行结果
null
0

由于name和age是全局变量,所以打印出初始值

注:

使用 . 访问对象的字段.
"访问" 既包含读, 也包含写.
对于一个对象的字段如果没有显式设置初始值, 那么会被设置一个默认的初值

默认值规则
对于各种数字类型, 默认值为 0.
对于 boolean 类型, 默认值为 false.
对于引用类型(String, Array, 以及自定制类), 默认值为 null

我们不用默认值,也可以就地初始化,此时实例化对象时就有一个初值.

class Person {
    public String name = "张三";
    public int age = 18;
}

 3.2 方法(描述一个对象的行为)

举例如下:

class Person {
    public int age = 18;
    public String name = "张三";
    public void show() {
    System.out.println("我叫" + name + ", 今年" + age + "岁");
    }
}
class Test {
    public static void main(String[] args) {
        Person person = new Person();
    person.show();
    }
}

//结果
我叫张三, 今年18岁

3.3 static 关键字

可以用来

1.修饰属性
2.修饰方法
3.代码块

4.修饰类(暂时不谈)

1.修饰属性


修饰属性就是同一个类的不同实例共用同一个静态属性.就是我多个对象操作的是一个属性.

举例:

class TestDemo{
    public int a;
    public static int count;
}
public class Main{
    public static void main(String[] args) {
        TestDemo t1 = new TestDemo();
        t1.a++;
        TestDemo.count++;
        System.out.println(t1.a);
        System.out.println(TestDemo.count);
        System.out.println("============");
        TestDemo t2 = new TestDemo();
        t2.a++;
        TestDemo.count++;
        System.out.println(t2.a);
        System.out.println(TestDemo.count);
    }
}

输出结果
1 
1
============
1
2

内存结构

2.修饰方法

静态方法属于类,而不属于类的对象。
可以直接调用静态方法,而无需创建类的实例。
静态方法可以访问静态数据成员,并可以更改静态数据成员的值

注:随着类的加载而加载
举例:

class TestDemo{
    public int a;
    public static int count;
    public static void change() {
        count = 100;
        //a = 10; error 不可以访问非静态数据成员
    }
}
    public class Main{
        public static void main(String[] args) {
            TestDemo.change();//无需创建实例对象 就可以调用
            System.out.println(TestDemo.count);
    }    
}

注:this和super不能在静态方法中使用,因为静态方法跟随类的加载而加载,this和super作用于对象,产生时间晚于static方法的加载.

 4.封装

4.1 private实现封装

被 public 修饰的成员变量或者成员方法, 可以直接被类的调用者使用.
被 private 修饰的成员变量或者成员方法, 不能被类的调用者使用

假如我在类中使用private修饰一个成员变量,此时外界创建实例不能对此变量进行获取和修改,这就实现了封装,我不想将这一条属性让外界知道.

后面假如我又想修改或者查看了,这里我们就引出了getter()和setter()方法

class Person {
    private String name = "张三";
    private int age = 18;
    public void show() {
        System.out.println("我叫" + name + ", 今年" + age + "岁");
    }
}
class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.age = 20;
        person.show();
    }
}
// 编译出错
Test.java:13: 错误: age不可以在Person中访问private
person.age = 20;
^
1 个错误


下面我们给出get和set方法的使用实例

class Person {
    private String name;//实例成员变量
    private int age;
    public void setName(String name){
        //name = name;//不能这样写
        this.name = name;//this引用,表示调用该方法的对象
    }
    public String getName(){
        return name;
    }
    public void show(){
        System.out.println("name: "+name+" age: "+age);
    }
}
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("caocao");
        String name = person.getName();
        System.out.println(name);
        person.show();
}
// 运行结果
caocao
name: caocao age: 0

getName 即为 getter 方法, 表示获取这个成员的值.
setName 即为 setter 方法, 表示设置这个成员的值

快捷键 alt+insert

5.构造方法

下面介绍构造方法(一种特殊的方法).使用关键字new实例化新对象时会被自动调用, 用于完成初始化操作

new 关键字的执行流程

1.为对象分配内存空间
2.调用对象的构造方法


构造方法的语法

1.方法名称必须与类名称相同
2.构造方法没有返回值类型声明
3.每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
注:如果指明了构造方法,编译器将不提供空参的构造方法

this关键字

this表示当前对象引用(注意不是当前对象). 可以借助 this 来访问对象的字段和方法

这里构造方法中可以调用其他的构造方法,但是必须放在构造方法的第一行,原因是先创建对象才能调用方法.

举例:

class Person {
    private String name;//实例成员变量
    private int age;
    private String sex;
    //默认构造函数 构造对象
    public Person() {
        //this调用构造函数
        this("bit", 12, "man");//必须放在第一行进行显示
    }
    //这两个构造函数之间的关系为重载。
    public Person(String name,int age,String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public void show() {
        System.out.println("name: "+name+" age: "+age+" sex: "+sex);
    }
}
public class Main{
    public static void main(String[] args) {
        Person person = new Person();//调用不带参数的构造函数
        person.show();
    }
}


// 执行结果
name: bit age: 12 sex: man


 

 6.代码块

代码块分为四种

普通代码块
构造块
静态块
同步代码块(暂时不谈)

1.普通代码块(很少用)不影响代码的执行

public class Main{
    public static void main(String[] args) {
        { //直接使用{}定义,普通方法块
            int x = 10 ;
            System.out.println("x1 = " +x);
        }
        int x = 100 ;
        System.out.println("x2 = " +x);
    }
}

// 执行结果
x1 = 10
x2 = 100

2.构造代码块

构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量

举例:

class Person{
    private String name;//实例成员变量
    private int age;
    private String sex;
    public Person() {
        System.out.println("I am Person init()!");
    }
    //实例代码块
    {
        this.name = "bit";
        this.age = 12;
        this.sex = "man";
        System.out.println("I am instance init()!");
    }
    public void show(){
        System.out.println("name: "+name+" age: "+age+" sex: "+sex);
    }
}

public class Main {
    public static void main(String[] args) {
    Person p1 = new Person();
    p1.show();
    }
}
// 运行结果
I am instance init()!
I am Person init()!
name: bit age: 12 sex: man

直接显示初始化和用实例代码块初始化的区别?

一个是造出来这个对象的默认值,一个则是初始化之后用这个对象进行赋值的.

3.静态代码块


随着类的加载而执行(先于构造方法),只能访问静态成员,一般用于给静态成员初始化
举例如下

class Person{
    private String name;//实例成员变量
    private int age;
    private String sex;
    private static int count = 0;//静态成员变量 由类共享数据 方法区
    public Person(){
        System.out.println("I am Person init()!");
    }
    //实例代码块
    {
        this.name = "bit";
        this.age = 12;
        this.sex = "man";
        System.out.println("I am instance init()!");
    }
    //静态代码块
    static {
        count = 10;//只能访问静态数据成员
        System.out.println("I am static init()!");
    }
    public void show(){
        System.out.println("name: "+name+" age: "+age+" sex: "+sex);
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();//静态代码块是否还会被执行?会
    }
}

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

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

相关文章

【金TECH频道】企业架构转型组合拳来袭,助力金融机构一臂之力

当前&#xff0c;数字化转型已经成为时代共性课题 在政策和技术的双重指引下 金融机构逐渐走向差异化竞争的格局 面对转型阵痛 以契合、明晰的战略规划及 企业架构调整来辅助业务变革 成为助力企业数字化转型的有效路径 金融机构也纷纷开始探索 企业架构转型的新思路、…

SQL Server2000mdf升级SQL Server2005数据库还原

SQL Server2000数据库还原sqlserver 2000mdf升级 sqlserver 2008数据库还原SQL Server2005数据库脚本 sqlserver数据库低版本升级成高版本 sqlserver数据库版本升级 数据库版本还原 如果本机安装了sqlserver2012或者sqlserver2019等高版本 怎么样才能运行sqlserver2000的数据库…

2003-2022年地级市-财政收支明细数据(企业、个人所得税、科学、教育、医疗等)

2003-2022年地级市-财政收支明细数据&#xff08;企业、个人所得税、科学、教育、医疗等&#xff09; 1、时间&#xff1a;2003-2022年 2、指标&#xff1a;行政区划代码、年份、地区、一般公共预算收入、一般公共预算-税收收入、一般公共预算-税收收入-增值税收入、一般公共…

软件测试面试题及答案2024

1、你们的缺陷等级如何划分的&#xff1f;☆☆☆☆☆ 我们的缺陷一般分为四个等级&#xff0c;致命级&#xff0c;严重级&#xff0c;一般级和轻微级。致命级指能够导致软件程序无法使用的缺陷&#xff0c;比如宕机&#xff0c;崩溃&#xff0c;手机APP的闪退&#xff0c;数据…

【AUTOSAR CANTP】深入理解CAN传输层:N-SDU数据接收与缓冲处理

1. 前言 CanTp是PDU路由器和CAN接口模块之间的那个模块。它的主要作用就是对超过8字节或者CAN FD情况下超过64字节的CAN I-PDU进行分段和重组啦。PDU路由器会把AUTOSAR COM和DCM I-PDU放到不同的通信协议上去,具体是用哪个网络系统类型(比如CAN、LIN和FlexRay)来路由,就看…

python图像处理 ——几种图像增强技术

图像处理 ——几种图像增强技术 前言一、几种图像增强技术1.直方图均衡化2.直方图适应均衡化3.灰度变换4.同态滤波5.对比拉伸6.对数变换7.幂律变换&#xff08;伽马变换&#xff09; 前言 图像增强是指通过各种算法和技术&#xff0c;改善或提高数字图像的质量、清晰度、对比度…

半阵法单脉冲测角

半阵法单脉冲测角 单脉冲测角的类型确知波束形成导向矢量半阵测向原理半阵测向仿真 单脉冲测角的类型 传统的单脉冲测向方法主要有3种&#xff0c;分别是半阵法、加权法和和差比幅法。在了解单脉冲测向之前&#xff0c;首先要知道确知波束形成&#xff0c;确知波束形成就是设计…

python GUI tkinter实战

筛选出列长度不为指定长度的列 from os import path from tkinter import (BOTH, BROWSE, EXTENDED, INSERT, Button, Frame, Label,Text, Tk, filedialog, mainloop, messagebox) import matplotlib.pyplot as plt import pandas as pd from PIL import Image, ImageTk from …

P3398 仓鼠找 sugar

Portal. LCA。 询问树上两条路径是否有交点。 画图发现无非两种情况&#xff1a; 发现一条路径的起点和终点的 LCA 经过另一条路径&#xff0c;是两路径相交的充要条件。 考虑如何判断这个 LCA 在不在路径上。若 d ( s , LCA ) d ( LCA , t ) d ( s , t ) d(s,\text{LCA…

ArmSom---SPI开发指南

1. 简介 RK3588从入门到精通本⽂主要介绍在Rockchip平台配置spi接口并且使用的方法开发板&#xff1a;ArmSoM-W3Kernel&#xff1a;5.10.160OS&#xff1a;Debian11 2. SPI接口概述 SPI&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;即串行外围设备接口&…

2023年辽宁省数学建模竞赛B题思路详细分析

摘要略&#xff0c;2023年辽宁省数学建模竞赛B题代码和论文已经完成&#xff0c;代码为全部3问代码&#xff0c;论文包括摘要、问题重述、问题分享、模型假设、符号说明、模型的建立和求解&#xff08;问题1无监督聚类模型的建立和求解&#xff0c;问题二有监督分类预测模型的建…

基础课18——智能客服系统架构

1.基础设施层 基础设施主要包括以下几点&#xff1a; 1. 硬件设施&#xff1a;包括服务器、存储设备、网络设备等&#xff0c;这是整个系统运行的物理基础。 2. 软件设施&#xff1a;包括操作系统、数据库管理系统、自然语言处理(NLP)工具和机器学习算法等&#xff0c;这些是…

QT在线安装5.15之前的版本(下载速度飞快)

使用最新的QT在线安装器&#xff0c;安装QT版本时只能安装5.15以及之后的版本&#xff0c;安装QT5.15之前的版本只能通过离线安装的方式&#xff0c;离线安装后还要自己去配置QT&#xff0c;离线安装还有个问题的&#xff0c;后续维护比较麻烦&#xff0c;QT的维护工具还要自己…

美联储再度暂停升息:“比特币突破35,000美元!“

今天凌晨举行FOMC 利率会议的结果并不引起意外在意料之中&#xff0c;再次”暂停升息”&#xff0c;基准利率仍然在 5.25% 至 5.5% 区间。 市场反应出对于美联储暂停升息松了一口气&#xff0c;意味着当前的利率基本上是美联储的最高利率&#xff0c;要再继续加息的概率不大。 …

高浓度化工废水处理工艺是怎样的

高浓度化工废水处理工艺主要包括以下步骤&#xff1a; 预处理&#xff1a;通过物理、化学和生物等方法对废水进行预处理&#xff0c;以去除其中的悬浮物、油污、重金属等有害物质。常用的预处理方法包括沉淀、过滤、吸附、氧化等。化学氧化&#xff1a;利用氧化剂&#xff08;…

体验SOLIDWORKS旋转反侧切除增强 硕迪科技

大家在设计中经常使用的旋转切除命令在solidworks2024版本中迎来了新的增强&#xff0c;添加了旋转反侧切除选项。在设计过程中不必修改复杂的草图即可切除掉我们不需要的部分。使设计工作更加方便快捷。 打开零部件后&#xff0c;点击键盘上的S键并输入旋转切除以搜索该命令&a…

C语言--输出1-100以内的素数

首先要有1-100以内的数字 for(int i1;i<100;i) 素数&#xff1a; 素数是指只能被1和自身整除的正整数。换句话说&#xff0c;素数是大于1的数&#xff0c;它除了1和它本身之外没有其他因数。例如&#xff0c;2、3、5、7、11、13等都是素数。然而&#xff0c;4、6、8、9等不…

浅述边缘计算场景下的云边端协同融合架构的应用场景示例

云计算正在向一种更加全局化的分布式节点组合形态进阶&#xff0c;而边缘计算是云计算能力向边缘侧分布式拓展的新触角。随着城市建设进程加快&#xff0c;海量设备产生的数据&#xff0c;若上传到云端进行处理&#xff0c;会对云端造成巨大压力。如果利用边缘计算来让云端的能…

多模态论文阅读之BLIP

BLIP泛读 TitleMotivationContributionModel Title BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation Motivation 模型角度&#xff1a;clip albef等要么采用encoder-base model 要么采用encoder-decoder model.…

Proteus仿真--1602LCD显示电话拨号键盘按键实验(仿真文件+程序)

本文主要介绍基于51单片机的LCD1602显示电话拨号键盘按键实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中右下方12个按键模拟仿真手机键盘&#xff0c;使用方法同手机键一样&#xff0c;拨打手机号码则在液晶显示屏上显示对应的号码 仿真运行…