Java中的类和对象(Java系列4)

news2024/12/22 22:19:03

目录

前言:

1.什么是面向对象

2.类的定义和使用

3.this引用

3.1this引用的概念

3.2this引用的特性

3.3this的使用

4.构造方法

4.1构造方法概念

4.2构造方法的特性

5.默认初始化

6.就地初始化

7.封装

8.封装扩展之包

8.1为什么对提出包的概念呢?

8.2包的概念

8.3包的作用

8.4导入包中的类

8.5常见的包

8.6自定义的包

9.static成员

10.static成员变量初始化

10.1初识化方法的介绍

10.2代码块

10.2.1普通代码块

10.2.2构造代码块

10.2.3静态代码块

结束语:


前言:

在之前我们学习了Java的一些基础知识点了也接触到了Java和C语言的不同之处,那么今天我们就来讲讲Java中是怎么面向对象的。

1.什么是面向对象

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。

2.类的定义和使用

  • 类名注意使用大驼峰定义。
  • 成员前写完统一为public。
  • 此处写的方法不带static关键字。

格式:

class 类名 {

        属性 / 成员属性 / 成员变量

        行为 / 成员方法

}

类是用来对一个实体(对象)来进行描述的。定义了一个类,就相当于在计算机中定义了一种新的类型。

实例化:用类类型来创建对象的过程,称为类的实例化。

  • new关键字用于创建一个对象的实例
  • 使用·来访问对象中的属性和方法。
  • 同一个类可以创建多个实例。
  • 每个对象都有自己的成员。

代码如下所示:

class Student {
    //属性
    public String name;
    public String gender;
    public int age;

    //行为
    public void Exam() {
        System.out.println("考试");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Student student = new Student();//创建一个对象
        student.age = 10;
        student.name = "张三";
        student.gender = "三年级";
        student.Exam();
    }
}


结果如下所示:

对类的简单理解: 

  • 类只是一个模型一样的东西,用来对一个实体类进行描述,限定了类有哪些成员。
  • 类是一种自定义的类型,可以用来定义变量。
  • 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
  • 做个比方,类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。 

代码如下所示:

class Student {
    //属性
    public String name;
    public String gender;
    public int age;

    //行为
    public void Exam() {
        System.out.println("考试");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Student student1 = new Student();//创建出第一个对象
        Student student2 = new Student();//创建出第二个对象
        Student student3 = new Student();//创建出第三个对象
    }
}

但是在上述代码中还有一些要注意的事项:

1.引用不能指向引用。

2.一个引用不能同时指向多个对象。

3.当一个引用被赋值为null时表示这个引用不指向任何一个对象。

 Person person = null;

上面代码中的person不指向任何对象。

3.this引用

3.1this引用的概念

 this引用指向当前对象(成员方法运行时调用该方法的对象),在成员方法中所有成员变量的操作,都是通过该引用方法去访问,只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

代码如下所示:

class Date {
    public int year;
    public int month;
    public int day;
    public void setDay(int year,int month,int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

3.2this引用的特性

  • this的类型:对应类类型引用,即是哪个对象调用就是哪个对象的引用类型。
  • this只能在“成员方法”中使用。
  • 在“成员方法”中,this只能引用当前对象,不能再引用其他对象。
  • this是“成员方法”中第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给成员方法,this负责来接收。

3.3this的使用

this.date:访问当前对象的成员变量。

this.func():访问当前对象的成员方法。

this不能调用静态的成员方法和属性。

this():必须放在构造方法中的第一条,不能成环。

4.构造方法

4.1构造方法概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

代码如下所示:

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

    //无参的构造方法:
    public Date() {
    }

    //有参的构造方法:
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    @Override
    public String toString() {
        return "Date{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }
}
public class Test4 {
    public static void main(String[] args) {
        Date date = new Date(2022,11,21);
        System.out.println(date.toString());
    }
}


结果如下所示:

4.2构造方法的特性

  • 名字必须与类名相同。
  • 没有返回类型,设置为void也不行。
  • 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次。
  • 构造方法可以重载(用户根据自己的需求提供不同的参数的构造方法)。
  • 如果你没有写任何的构造方法,此时Java中会帮我们提供一个默认的,不带参数构造方法。
  • 如果自己写了,就会在创建对象的时候调用自己的构造方法,不管你写的是啥,Java中都不会给你提供不带参数的构造方法了。

5.默认初始化

在局部变量在使用时必须要初始化,而成员变量可以不用初始化。

下来我们看一下JVM所做的事:
1.检测对象对应的类是否加载了,如果没有加载则加载。

2.为对象分配内存空间。

3.处理并发安全问题。

4.初始化所分配的空间。(对象在申请好空间之后,对象中包含的成员已经设置好了初始值)

5.设置对象头信息。

6.调用构造方法,给对象中各个成员赋值。

6.就地初始化

所谓就地初始化就是在声明成员变量时,就直接给了初始值。

如下所示:

public class Date {
   //就地初始化
    public int year = 1000;
    public int month = 3;
    public int day = 4;

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

注意:代码在编译完后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。

7.封装

概念:

封装是面向对象程序的三大特性之一,在类和对象阶段,主要研究的就是封装的特性,那么简单来说就是套壳屏蔽内部细节。官方说法就是将数据和操作数据的方法进行有机结合,隐蔽对象的属性和实现细节,仅对外公开接口来和对象进行交互。

那么在Java中提供了四种访问修饰限定符:private、default(默认)、protected、public。

下面我来具体介绍一下四个访问限定符的使用范围:

范围privatedefaultprotectedpublic
1同一包中的同一类

✔ 

✔ ✔ ✔ 
2同一包中的不同类✔ ✔ ✔ 
3不同包中的子类✔ ✔ 
4不同包中的非子类✔ 

其中封装就是通过private来实现的。 一般情况下成员变量设置为private,成员方法设置为public。

8.封装扩展之包

8.1为什么对提出包的概念呢?

为了更好的管理类,把多个类收集在一起成为一组,称为软件包,有点类似于目录。

8.2包的概念

为了更好的管理类,把多个类收集在一起成一个组,称为软件包,包是对类,接口等的封装机制的体现,是一种对类或者接口等很好的组织方式。

8.3包的作用

  • 使得一个包中的类可以不被其他包中的类所引用。
  • 在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。

8.4导入包中的类

一般是使用import语句来导入包,如:import java.until.Date,如果需要使用java.until中的其他类,可以使用import java.until.*这种是隐式导入一般还是建议显示的指定要导入包的类名,否则还是容易出现冲突的情况。

8.5常见的包

  •  java.lang:系统常用于基础类(String、Object),此包从JDK1.1后自动导入。
  • java.lang.reflect:java反射编程包。
  • java.net:进行网络编程开发包。
  • java.sal:进行数据开发的支持包。
  • java.until:是java提供的工具程序包。
  • java.io:I/O编程开发包。

8.6自定义的包

 下面小编演示一下如何在idea中自己定义一个包。

在弹出框中写上包的名字:

 

在侧边栏中若是看到类似于文件夹一样的一个包就表示已经建好了。

 

接下来我们就可以在包中新建一个类了

在弹窗中写上类名 

 

然后这样我们就在一个包中建好一个类了

  

同时我们看到在代码的第一行中有一个package语句来指明这个类具体在哪一个包中。

9.static成员

由static修饰的成员变量称为静态成员变量。

特性:

  • 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。
  • 既可以通过对象访问,也可以通过类名访问,但是一般都是通过类名来访问的。也可以通过静态方法名(…)方式调用,但是一般不推荐后者。
  • 变量存储在方法区当中。
  • 生命周期伴随着类的一生(即:随类的加载而创建,随着类的卸载而销毁)。
  • 不能在静态方法中访问任何非静态的成员变量。
  • 静态方法中不能调用任何非静态方法,因为非静态方法中有this参数,在静态方法中调用时候无法传递this引用。
  • 静态方法不能重写,不能用来实现多态。 

建议:

获取静态的成员变量或者是设置静态的成员变量,此时的方法最好是静态的,否则你要是非静态的,你还得实例化对象。 

代码如下所示:

package demo1;

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    public static String classRoom = "Bit306";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public static void main(String[] args) {
        //静态成员变量可以直接通过类名来访问
        System.out.println(Student.classRoom);

        //其他非静态成员变量要先实例化对象
        Student s1 = new Student();
        Student s2 = new Student();
        s1.name = "张三";
        s1.gender = "男";
        s1.age = 20;
        s1.score = 90.1;
        System.out.println(s1.getName() + " " + s1.getGender() + " " + s1.getAge() + " " + s1.getScore());
        //也可以通过对象访问,但是两个对象的classRoom是共享的
        System.out.println(s1.classRoom);
        System.out.println(s2.classRoom);
    }
}


结果如下所示:

 

10.static成员变量初始化

10.1初识化方法的介绍

static成员变量初始化分为两种:

  • 就地初识化
  • 静态代码块初始化 

就地初始化:是指在定义的时候直接给出初始值,如上述代码中的classRoom。

所谓静态代码块初始化,那么你得先了解什么是代码块。那么跟着小编继续往下看。

10.2代码块

使用{}定义的一段代码就称为代码块,根据代码块的位置以及关键字,又可以分为一下四种:

  • 普通代码块
  • 构造代码块
  • 静态代码块
  • 同步代码块

下面我们来着重了解前三个。

10.2.1普通代码块

就是定义在方法中的代码块

代码如下所示:
 

package demo1;

public class Test {
    public static void main(String[] args) {
        //普通代码块
        {
            int y = 10;
            System.out.println(y);
        }
    }
}

10.2.2构造代码块

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

代码如下所示:

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    public Student() {
        System.out.println("I am Student init()");
    }
    //实例化代码块
    {
        this.name = "张三";
        this.gender = "男";
        this.age = 20;
        this.score = 90.0;
        System.out.println("I am instance init()");
    }
    public void show() {
        System.out.println("name:" + name + " gender:" + gender + " age:" + age + " score:" + score);
    }

    public static void main(String[] args) {
        Student s1 = new Student();
        s1.show();
    }
}


结果如下所示: 

 

由上述代码的执行结果可知在实例化完对象时先会执行实例化代码块中的内容,然后再执行构造函数中的内容,最后执行的调用的函数。

10.2.3静态代码块

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

代码如下所示:

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    private static String classRoom;
    public Student() {
        System.out.println("I am Student init()");
    }
    //实例化代码块
    {
        this.name = "张三";
        this.gender = "男";
        this.age = 20;
        this.score = 90.0;
        System.out.println("I am instance init()");
    }
    //静态代码块
    static {
        classRoom = "207";
        System.out.println("I am static init()");
    }
    public void show() {
        System.out.println("name:" + name + " gender:" + gender + " age:" + age + " score:" + score);
    }

    public static void main(String[] args) {
        Student s1 = new Student();
        s1.show();
    }
}


结果如下所示:

由上述代码执行结果可以看出它们的执行顺序静态代码块是最先执行的。

注意:

  • 静态代码块不管生成多少个对象,其只会执行一次。
  • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的。
  • 如果一个类包含多个静态代码块,在编译的时候编译器会按照定义的先后顺序执行。
  • 实例化代码只有在创建对象的时候才会执行。 

 

结束语:

好啦这次小编就给大家分享到这里啦!希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!) 

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

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

相关文章

前端开发需要会什么?先掌握这三大核心关键技术

前端工程师,如何创造/制作一个网站应用呢? 为了更好的让你理解,我们简单地做一个类比:动画制作者在创造人物的时候,需要从构图、着色和动画效果上入手,让人物有骨、有血,灵性生动。 而如果将一…

长安链共识模块优化中的“精益求精”

长安链在v2.3.0版本中对共识模块进行了优化,主要包括优化TBFT消息机制并将异步发送信息功能进行了拆分,独立设计了一致性引擎模块。优化后共识模块整体逻辑更清晰、共识更高效。 TBFT消息机制优化背景 在长安链的V2.3.0版本的TBFT共识算法中&#xff0…

W易NEWS login逆向分析

内容仅供参考学习 欢迎朋友们V一起交流: zcxl7_7 目标 网址:案例地址 分析 首先进行一次登录,获取流程 在这个流程中可以看到dl/zj/mail/l这个接口返回了新的cookie,可以猜测这个是登录核心;dl/zj/mail…

通达信接口公式怎样进行破解?

如果我们想对通达信接口的公式进行破解该怎么做呢?今天我们来风险一下方法,但是有两个前提: 1:不是使用winhex,而是使用ollydbg来破解; 2:只是用户公式修改密码有效。对于导入密码无效。对于系统公式密码无效&#xff…

c语言:关键字(一)

关键字一.古老的关键字—auto1.全局变量与局部变量2.auto的使用二.最快的关键字—register一.古老的关键字—auto 1.全局变量与局部变量 在花括号里定义的变量就是局部变量,反之就是全局变量 这里举个例子 这时我们在进行编译时会报错告诉我们y没定义 这其实就是…

redis常用数据类型以及命令详细介绍

查询redis的命令:http://www.redis.cn/commands.html Redis键(key) keys *查看当前库所有key (匹配:keys *1) exists key判断某个key是否存在 type key 查看你的key是什么类型 del key 删除指定的key数据 unlink key 根据value选择非阻塞删除 仅将keys…

计算机组成原理(二)运算方法和运算器

目录数制与编码字符和字符串的表示方法ASCII码汉字编码定点数和浮点数的表示定点数表示方法浮点数表示方法定点数和浮点数的运算定点数的运算浮点数的运算运算器的组成算数逻辑单元(ALU)算数单元逻辑单元内部总线运算器的基本结构数制与编码 字符和字符…

【动态规划】爬楼梯爬的不仅仅是楼梯

深度思考爬楼梯问题,抽取一般过程,目标是对其变式题也能认出并且求解 一、题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? https://leetcode.cn/problems/climbin…

[附源码]Python计算机毕业设计SSM建筑工程管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

.NET 分页帮助类

一直以来,分页是一个非常常见的需求,以前也用过很多的分页控件,比如AspNetPager,现在自己参照之前用过的,自己写了一个非常简单实用的分页实现方法。 先来看看应用效果: 如图,定义了是前10页&…

论文投稿指南——中文核心期刊推荐(电子、通信技术)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄🎈 核心期刊在国内的应用范围非常广,核心期刊发表很多是国内作者晋升中的硬性要求,在…

springboot基础

目录 一、springboot介绍 1、什么是SpringBoot 二、springboot入门案列 2.1、使用idea自动生成springboot工程 2.1.1、用idea自动生成springboot 2.1.2、spring程序与springboot程序对比 三、springboot启动原理 3.1、parent 3.2、starter 3.3、引导类 3.4、内嵌tomc…

3dmax 单位匹配和基本单位设置

使用3dmax打开模型,出现下图对话框; 打开文件的单位和系统的单位不匹配,文件的单位是米,系统的单位是英寸;有2个选择,重置文件的单位为系统的单位,采用文件自己的单位; 用后一个打开…

C语言第十六课:操作符详解(下)——逗号表达式、下标引用、函数调用、结构成员操作符与操作符属性

目录 前言: 一、逗号表达式(exp1,exp2,exp3,...,expN): 二、下标引用、函数调用和结构成员[ ]、( )、. 、->: 1.下标引用操作符[ ]: 2.函数调用操作符( …

NoSQL之Redis配置与优化

目录 一、redis简介 1、redis的优点 2、redis的缺点 3、redis应用场景 4、redis为什么这么快 5、redis与memcached比较 二、关系数据库与非关系型数据 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库区别 三、redis安装部署 四、redis命令工具…

一套完整的养老院人员定位解决方案包含哪些内容?

养老院人员定位解决方案是建立面向社区及养老组织的传感网系统与信息渠道,并在此基础上提供实时、方便、高效、低成本的、物联化、互联化、智能化的养老服务。 人口老龄化问题早已成为当今社会关注的重要问题之一。在养老院封闭的环境,养老院希望利用智能…

解放程序员双手——ChatGPT安装踩雷之路+使用体验

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊专栏推荐:深度学习网络原理与实战 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍🏼、…

数据之道读书笔记-10未来已来:数据成为企业核心竞争力

数据之道读书笔记-10未来已来:数据成为企业核心竞争力 数字化转型不能一蹴而就,数据治理也不是一朝一夕之功。数字化转型带来机遇的同时,也给整个企业的数据治理带来了新的挑战。 基于对华为公司数字化转型的解读,我们建立了数据…

Win11的两个实用技巧系列之查看所有用户帐户、应用冻结

目录 如何在Win11上查看所有用户帐户?Win11上查看所有用户帐户四种方法 方法一:在 Windows 11 的“设置”中检查所有帐户 方法二:在 Windows 11 的计算机管理中检查所有帐户 方法三:在 Windows 11 上通过命令提示符检查所有帐户 方法四&am…

【微信小程序】商品管理-微信小程序项目开发入门

有个人家开店,店里商品堆积越来越多,多了就不好管理了,那有没有想过需要类似于商品管理的一套小程序呢,这里给大家提供一个容易上手的商品管理微信小程序解决方案,非常适合新手学习入门。 先说明一下这里讲得是一个微信…