JAVA中的类

2023-11-11

一、什么是类

概念:类就是某些具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象,在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。

类可以理解为一个模板,它描述一类对象的行为和状态。

举个例子:例如一本书就可以看成一个类,那么书这个类包含了标题、标价、作者等这些属性

1.为什么有类这个概念

类的三大部件:构造器、成员变量、方法

类是面向对象语言的程序设计中的概念,是面向对象编程的基础,类可以看成是创建Java对象的模板

类是对现实生活中一类具有共同特征的事物的抽象。如果一个程序中提供的数据类型和与应用中的概念有直接的对应,这个程序就会更容易理解,也更容易修改。

类的实质是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本的数据类型,不同的是它是一种复杂的数据类型,因为它的本质是数据类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。

一组经过很好选择的用户定义的类会使程序更加简洁,此外,它还能使各种形式的代码分析更容易进行,特别地,它还会使编译器有可能检查对象的非法使用。

二、类的声明

1.类在使用前必须先声明然后才可以声明变量,创建对象

类声明语法如下:

[标识符] [修饰符] class 类名 {
    //类的属性
    //类的方法
}

1.1标识符(访问符)

标识符:访问用于指明类、属性或者方法的访问权限,也称为访问符。

首先每个类都有访问权限,指明这些类可以被哪些类访问,JAVA在通过类声明时,指定修饰符来约定访问权限,在Java中有四种修饰符,分别是public、private、protected、default(缺省值)。

对于顶级类(外部类)来说,只有两种修饰符public和default,因为外部类的上一层单元是包,所以外部类只有两个作用域:同包,任意位置。因此只需要两种控制权限,包控制权限和公开访问权限,也就对应两种控制修饰符:public和default

对于他们所指定的访问权限如下

public:

public: 修饰顶层类和成员类,表明该类是一个公共类,可以被任意类访问(注意:同一个java源文件只能有一个公共类)

private:

private:修饰成员类(内部类),表明是一个私有类,只能被顶层的类访问,顶层类就是最外层这个类

private修饰的类和方法无法被继承

class Bank {  //大括号内都属于内部

    //private修饰的私有类变量
    private String passWord;
}
public class PrivateTest{
    //main主函数在Bank的外部,无法取到private修饰的私有的成员变量
    public static void main(String[] args){
    Bank bank = New Bank();
    bank.cardNum = 123; //错误,无法取到私有的成员变量

}

}
class Bank {

    //private修饰的私有成员变量
    private int cardNum;

}
class Bank{

    private int cardNum;

    public classPrivateTest {

    public static void main (String[] args) {
    
        //main函数所在的类位于Bank类的内部,所以可以访问到Bank类下的私有成员变量
        Bank bank = New Bank();
        bank.card = 123;


}


}


}

protected:

protected一般不修饰类,修饰类中的成员变量,子类可以修饰父类protected修饰的变量,控制继承关系的父子之间的可见性。

protected相当于家里的银行卡,但是设置了银行卡密码,子类是儿子,可以使用家里设置了银行卡密码的银行卡

当子类和父类在同一个包中时:被声明为protected的变量能被同一个包中的任何类访问

当子类和父类不在同一个包中时:在子类中,子类实例可以访问从父类集成的protected方法,而父类实例不能访问protected方法

public class A1 {


    protected void test() {
    

}
}

default(缺省)

使用缺省定义的成员类或者成员变量、成员函数,只有同一个包和本类可以访问

包就是相当同一个地区,如果此时在本类中设定四种修饰符的变量,那么能访问的状况如下

 三、类成员的声明和定义

1.类成员变量

类所需要的最基本的要素:(静态)属性、(动态)方法

类的三大部件:构造器、成员变量、方法

在java中,成员变量是指在类体中,类中的方法体之外定义的变量,也称为属性,如一本书作为一个类,价格、作者、封面颜色等都是书这个类的属性。

public class Person {

    //成员变量
    [修饰符] 数据类型 成员变量1;

    //成员方法
    public void printNumber() {
        //方法中的代码
    }
}

 成员变量又分为:实例变量和类变量(static静态变量)

  • 类的静态成员变量只加载一次且只有一份,静态成员变量是跟类的生命周期是同步的,静态变量位于方法区,被所有类的实例共享,静态变量可以直接通过类名来访问,其生命周期取决于类的声明周期
  • 实例变量取决于类的实例,每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中
public class Person {

    //成员变量
    float x; //x为实例变量
    static int age;//只要有关键字static,age为类变量

    //成员方法
    public void printNumber() {
        //方法中的代码
    }
}

成员变量可被类中的方法,构造方法,及特定语句访问

声明成员变量的语法如下

[public] [protected] [private] [static] [finally] <type> <variable_name>

  • public、protected、private:用于表示成员变量的访问权限
  • static:表示该成员变量为类变量,也成为静态变量
  • finally:表示将该成员变量声明为常量,其值无法更改
  • type:表示变量的类型
  • variable_name:表示变量的名称

在Java类的成员变量定义了类的属性,例如学生类中一般需要姓名、性别、年龄属性

定义成员变量的示例如下:

public class Student {

    
    //类成员变量
    public String name;  //姓名
    final int sex = 0; //性别,0表示女孩,1表示男孩
    private int age; //年龄


    //类中的方法体
    public void printNum(){
        
    }

}

上面的示例中定义了三个成员变量:

  1. String类型的name,访问修饰符为public,初始化没有设置值,所以值为null;
  2. int类型的sex,访问修饰符为default,初始化值为0,表示性别为女,由于被final修饰,所以无法修改;
  3. int类型的age,访问修饰符为private,初始化没有设置值,所以值为null;

举例说明成员变量的初始值,代码如下

public class Student {

    //静态成员变量(类变量)
   static int sum;

   public static void main(String[] args) {
       System.out.println(sum);
   }


}
  • sum是被static修饰的静态变量,也称为类变量,类型为int,初始化没有赋值,所以在下面的main方法中打印输出为sum的值为0。

2.类成员函数(方法)

类所需要的最基本的要素:(静态)属性、(动态)方法

类成员函数位于类中,位于类成员变量的下面,类成员变量代表的是类的属性的话,那么类成员函数就是执行某些特定功能的方法体了,属于一种行为,例如:加速,停止等,也称为成员方法

 定义成员方法的语法如下:

[修饰符] 方法的返回值数据类型 方法名(形参列表){

                方法体语句;

                return 返回值类型相同的值;

}

  • 修饰符:可以省略,也可以是public protected private static final abstract其中一个,其中public protected private只能出现一个
  • 方法的返回值数据类型:可以是数据类型,也可以是void,如果返回值一开始不是使用的void,那么就需要在return后面跟随该类型的值或者对象
  • 方法名:一般首字母小写,也适用于驼峰名命名规则,一般动词在前,名词在后,不宜过长
  • 形参列表:定义方法可以接受的参数,由0-N个[数据类型,参数名]中间由[ ,]连接而成,一旦指定了形参,那么在调用该方法时就必须传入实际参数

方法分类:

  • 无参数无返回值
  1. 在本类中调用:同一级别,直接调用,方法名();
  2. 在其他类中调用:对象名.方法名
  • 无参数有返回值
  1. 在本类中调用:变量 = 方法名();(这个变量用于接收返回值)
  2. 在其他类中调用:变量 = 对象.方法名();(这个变量用于接收返回值)
  3. 在其他类中调用:System.out.println(对象名.方法名());
  • 有参数无返回值
  1. 在本类中调用:方法名(实参列表);
  2. 在其他类中调用:对象.方法名(实参列表);
  • 有参数有返回值
  1. 在本类中调用:变量 = 方法名(实参列表);
  2. 在其他类中调用:变量 =  对象.方法名(实参列表);
  3. 在其他类中调用:在其他类中调用:System.out.println(对象名.方法名(实参列表));

变量的作用是当遇到有返回值的方法时,接收调用方法的返回值

如果被调用的方法的返回值类型是void,那么不要用变量接收,也不用打印方法调用,只能单独一个调用语句

public class Method {

    public void aMethod() {
        System.out.println("无参数无返回值的方法");
    }

    public int bMethod() {
        System.out.println("无参数有返回值的方法");
        return 10; //return后面填与返回值类型相同的值或者对象
    }

    public void cMethod(int c) {
        System.out.println("有参数无返回值的方法");
    }

    public int dMethod(int d) {
        System.out.println("有参数有返回值的方法");
        return d; //return后面填与返回值类型相同的值或者对象
    }


    public static void main(String[] args) {
        //定义变量ret
        int ret;
        //将Method类进行实例化
        Method method = new Method();
        //通过实例化对象调用aMethod()
        method.aMethod();
        //通过实例化对象调用aMethod()
        ret = method.bMethod();
        //通过实例化对象调用cMethod(),并传入具体的实参
        method.cMethod(11);
        ret = method.dMethod(12);

        //打印输出ret为12,即最后一次赋值
        System.out.println(ret);

    }
}
  • 方法可以没有参数,也可以有多个参数
  • 方法的中定义的参数是局部变量

2.构造器

构造器特点:

  1. 函数名必须和类名相同
  2. 也称构造方法,构造函数,作用是构造出来一个类的实例,确保对象得到初始化
  3. 没有返回值,连void都没有
  4. 根据有无参数,可分为有参构造和无参构造
  5. 使用new关键字,本质是在调用构造器
  6. 一旦出现了有参构造,无参构造就必须定义
  7. 构造器格式: [修饰符] 类名 (有参/无参){ }

实例如下:

public class Demo {

    String name;

    //无参构造一般情况可以省略,但是如果出现了有参构造,无参构造就必须要定义
    public Demo() {

    }

    public Demo(String name) {
        this.name = name; //通过this来调用类中的属性String name中的name, = name中的name则是(String name)中的name

    }
}

在测试类的主方法中调用构造器(new的过程就是调用了构造器)

public class DemoApplication {

    public static void main(String[] args) {

        //new一个对象的过程就是的调用了构造器,这里调用了无参构造
        Demo demo = new Demo();
        //new一个对象的过程就是的调用了构造器,这里调用了有参构造,括号内需要传入参数
        Demo demo1 = new Demo("张");

        //输出结果为null
        System.out.println(demo.name);
        //输出结果为张
        System.out.println(demo1.name);



    }
}

demo.name调用的是无参构造,默认值为null,故输出为null,

demo1.name调用的是有参构造,在new的过程中传入了参数name,故打印输出的值为“张”

2.1构造器快捷键

  1. 在类中设置好属性之后,例如这里在Demo这个类中设置了String name这个属性,点击右键选择Generate

  

     2.选择Constructor

     3.有参构造选择ok即可(按住Shift可全选,如果有多个的话)

 

     4.无参构造选择Select_None

         

      5.构造的效果是一样的

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA中的类 的相关文章

  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了

随机推荐

  • 【ChatGPT进阶】如何使用ChatGPT做知乎好物?

    如果你想通过知乎赚钱 知乎好物是一个不错的选择 门槛很低 而且是一个可以长期 躺赚 的项目 如果你会ChatGPT的话 可以去卷同行 知乎好物是什么 知乎好物是一种在知乎平台上创作内容或回答问题时 使用 好物推荐 功能在内容中插入商品卡片
  • AI绘画StableDiffusion美女实操教程:斗破苍穹-小医仙-天毒女(附高清图下载)

    小医仙 是天蚕土豆所著玄幻小说 斗破苍穹 1 及其衍生作品中的角色 身负厄难毒体 食毒修炼 万毒不侵 通体毒气 这种会无意识地杀死别人的体质让天性善良的小医仙成为人憎鬼厌的天毒女 在萧炎多次帮助下得以控制 出图效果展示 资源整合 今天我们就
  • springboot集成RabbitMQ-超级详细步骤

    本文对应的代码地址 https github com zhangshilin9527 rabbitmq study 前置工作 1 安装rabbitmq 2 登录 地址 http localhost 15672 账号密码 guest gues
  • mybatis学习(31):修改部分字段(有外键,先查询,再修改)

    目录结构 com geyao mybatis mapper BlogMapper类 package com geyao mybatis mapper import java util List import java util Map im
  • vue利用路由控制实现登录功能

    未使用服务器接口 登录信息保存在cookie中 可以实现登录功能 vue交流群203849104 vue使用cookie首先需要安装cookie npm install js cookie 然后在router下面的index js文件中引入
  • 线程池ThreadPoolExecutor源码解析

    参考视频 首先回顾一下创建线程等的三种方式 第一个是直接继承Thread类 重写run方法 这个其实内部也是继承了Runnable接口重写run方法 比如 public class MyThread extends Thread Overr
  • oracle查看数据文件大小,路径及修改大小

    查看数据文件占用大小使用大小 select b file id 文件ID号 b tablespace name 表空间名 b bytes 1024 1024 M 字节数 b bytes sum nvl a bytes 0 1024 1024
  • json11库的使用

    JSON JavaScript Object Notation 是一种轻量级的文本数据交换格式 易于让人阅读 同时也易于机器解析和生成 尽管JSON是Javascript的一个子集 但JSON是独立于语言的文本格式 并且采用了类似于C语言家
  • echarts图表的label太长解决办法

    如图 这个echarts图标的y轴label文字因为太长显示不全 这时我们可以选择使用formatter换行显示 具体代码如下 yAxis type category data 火灾 洪涝 急救 消防 公安 axisLabel format
  • Angular 下的 function

    angular lowercas 将指定的字符串转换为小写的 Usage 使用方法 angular lowercase string Arguments Param Type Details string string 字符串转换成小写 R
  • c语言二叉树链式存储,二叉树链式存储基本操作(C语言)

    1 二叉链的定义 LinkBinTree h文件 二叉树结点结构 typedef struct binnode int data struct binnode lchild struct binnode rchild BinNode 二叉树
  • Host is not allowed to connect to this MySQL server解决方法

    这个错误 其实就是我们安装的MySQL不允许远程登录 解决方法如下 1 在装有MySQL的机器上登录MySQL mysql u root p密码 执行use mysql select host from user where user ro
  • mongodb的MapReduce幂等性

    习惯用MapReduce来做mongodb的聚合 这一次遇到一点小问题 原数据如下 使用一个简单的MapReduce来验证一下数据 map function emit clientKey this clientKey dtime this
  • IDEA中SpringBoot启动错误无法加载主类

    1 项目里面 idea文件 删除 重启idea mvn claean install
  • MiniGUI 自定义控件教程7

    接着上次的教程继续 这次给大家介绍的是界面美观的进度条控件 它功能上和MiniGUI原有的进度条控件 CTRL PROGRESSBAR 是一样的 其实进度条也就是那些功能 哪还能整出别点什么花样哦 一 功能确定 1 要具有MiniGUI原有
  • ORACLE等待事件类型【Classes of Wait Events】

    每一个等待事件都属于某一类 下面给出了每一类等待事件的描述 Every wait event belongs to a class of wait event The following list describes each of the
  • 深入理解字节对齐

    C语言 字节对齐 基础知识了解 一 操作系统位数 CPU位数 指令集 1 操作系统 32 bit x86 和64 bit x64 1 位数 2 64 bit 2 处理器CPU位数 3 CPU指令集 4 寄存器 5 关系 6 计算机字长 机器
  • 百度智能云X英伟达直播实录超级AI计算机X-MAN技术

    GPU进入数据中心约有8 10年 这些年内 GPU显存的容量 GPU P2P带宽 GPU性能都在不断提升 据不完全统计 每年GPU显存大约有一倍的变化 P2P带宽有1 5倍到2倍的变化 而且性能变化更多 由于性能的变化 会引起GPU功耗的变
  • Android中解决第三方库重复引用的问题

    如果app中引入了一个新的第三方库 并且这个新库中引入了原本已经引入的另一个库 结果导致重复引用 编译就会报错 如何解决呢 方法是使用exclude排除重复的库 举例 假设新引入的第三方库是 com xiboliya mylib netto
  • JAVA中的类

    一 什么是类 概念 类就是某些具备某些共同特征的实体的集合 它是一种抽象的数据类型 它是对所具有相同特征实体的抽象 在面向对象的程序设计语言中 类是对一类 事物 的属性与行为的抽象 类可以理解为一个模板 它描述一类对象的行为和状态 举个例子