【Java】类和对象,封装

news2024/11/25 15:35:33

目录

1.类和对象的定义 

2.关键字new

3.this引用

4.对象的构造及初始化

5.封装

//包的概念

//如何访问

6.static成员

7.代码块

8.对象的打印


1.类和对象的定义 

对象:Java中一切皆对象。

类:一般情况下一个Java文件一个类,每一个类对应一个字节码文件(*.class)

       1)字段 / 属性 / 成员变量:定义在类中,方法的外面;2)方法

类似于C语言的结构体。

成员变量未初始化时都有一个默认值:引用类型默认值为null;int类型默认值为0;float类型默认值为0.0f;char类型默认值为'\u0000';boolean类型默认值为false 

class WashMachine{//类
    //字段/属性/成员变量
    public String brand;
    public String type;
    public double weight;
    public double length;
    public double height;
    public String color;
    //成员方法
    public void washClothes(){
        System.out.println("洗衣功能");
    }
    public void dryClothes(){
        System.out.println("脱水功能");
    }
    public void setTime(){
        System.out.println("定时功能");
    }
}

注意:

1> idea中如何打开当前类所在文件夹:*. java + 右键 +Open in +  Explorer;

2>  当类由public修饰时,类名必须和文件名一致;

3> 不要轻易去修改public修饰的类的名称,若要修改:文件名 + 右键 + Refactor + Rename;

4> 类中的方法不需要static修饰。

2.关键字new

public static void main(String[] args) {
    WashMachine washmachine1 = new WashMachine();
    WashMachine washmachine2 = new WashMachine();

    //赋值
    washmachine1.brand = "海尔";
    washmachine2.brand = "小天鹅";

    //washmachine:引用变量,存了对象的地址——>实例化对象
    System.out.println(washmachine1.brand);
    System.out.println(washmachine2.brand);

    washmachine1.washClothes();
    washmachine2.washClothes();
}

注意:

1> 可以使用关键字new实例化多个对象;

2> 同一个类可以创建多个实例;

3> 使用 . 来访问对象中的属性和方法。

3.this引用

public class TestDate {
    public int year;
    public int month;
    public int day;
    public void setDate(int y,int m,int d){
        //谁调用了setDate,this就是谁
        this.year = y;
        this.month = m;
        this.day = d;
    }
    public void printDate(){
        //要习惯加上this
        System.out.println(this.year+"年"+this.month+"月"+this.day+"日");
    }

    public static void main(String[] args) {//main方法可以定义在类当中
        //定义
        TestDate testDate1 = new TestDate();
        TestDate testDate2 = new TestDate();
        TestDate testDate3 = new TestDate();
        //赋值
        testDate1.setDate(2000,2,28);
        testDate2.setDate(2022,12,21);
        testDate3.setDate(2023,3,12);
        //打印
        testDate1.printDate();
        testDate2.printDate();
        testDate3.printDate();
    }
}

注意:

1> this对应类型引用,哪个对象调用就是哪个对象的引用类型;

2> this只能在普通成员方法中使用,静态成员方法(static修饰)中不能使用

3> 在成员方法中,this只能引用当前对象,不能再引用其他对象;

4> this时成员方法第一个隐藏的参数,编译器会自动传递。

4.对象的构造及初始化

普通方法:返回值+方法名+(参数列表)+ {方法体}

构造方法:没有返回值且方法名必须和类名保持一致

//注意方法名与类名一致!!!
public TestDate(){
    System.out.println("没有参数的构造方法");
}
public TestDate(int year,int month,int day){ //两个方法构成了重载
    this.year = year;
    this.month = month;
    this.day = day;
    System.out.println("有3个参数的构造方法");
}

注意:

1> 构造方法可以重载(方法名均为类名);

2> 构造方法一个都没写的情况下,编译器会帮你默认生成一个不带参数的构造方法;但当你写了其中任意一种构造方法,其它构造方法编译器不会帮你生成;

3> 构造方法一定会被调用,具体调用哪个构造方法得看有没有相应的参数;

3> 一个对象的产生至少有以下2步:为对象分配内存,调用合适的构造方法;

4> idea自动生成构造方法:右键 + Generate + Constructor + 自选

5> 可在构造方法中使用this()来调用另一个构造方法且必须放在第一行,但是不能自己调用自己 。

class Student{
    public String name;
    public int age;
    public Student(){ //此为没有参数的构造方法
        this("wangwu",20);//this()必须放在第一行
        System.out.println("调用第一个");
        this.print();//利用this调用其他成员方法,可以不放在第一行
    }
    public Student(String name,int age){//此为有两个参数的构造方法
        this.name = name;
        this.age = age;
        System.out.println("调用第二个");
    }
    public void print(){
        System.out.println("姓名:"+this.name+"年龄:"+this.age);
        //注意这里不加this输出 姓名:null年龄:0
    }
}
public class Test {
    public static void main(String[] args) {
        Student student1 = new Student();//调用上面第一个构造函数
        student1.name = "zhangsan";
        student1.age = 18;
        Student student2 = new Student("lisi",19);//调用上面第二个构造函数
        student2.print();
    }
}

5.封装

面向对象程序三大特性:封装、继承、多态。这里先介绍封装的概念。

定义:将类的实现细节进行隐藏,类外看不见数据,实现了类的安全性。

注意:defaule是什么都不写时的默认权限

访问限定符
No范围privatedefaultprotectedpublic
1同一包中的同一类
2同一包中的不同类×
3不同包中的子类××
4不同包中的非子类×××

//包的概念

定义:多个类收集在一起成为一组,称为软件包,类似于目录。

导入:可以让编译器自动导入,也可以手动导入。

通配符*:可以充当任何类。如util.* 不是导入util下的所有类,而是用到哪个类就用哪个类。

但是当使用的类在多个包中都有时,需要手动导入。非必要不用*。

自定义包:在文件最上方加上一个package语句指定改代码在哪个包中。

//如何访问

前面我们说了用private修饰之后,类外就不能使用类内的变量了,那无法访问有什么意义呢?别急,强大的idea可以帮我们用另一种方法访问:

class Student{
    private String name;//私有,无法在类外访问
    private int 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 class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("wangwu");//利用setName和getName访问
        System.out.println(student.getName());
        student.setAge(20);
        System.out.println(student.getAge());
    }
}

6.static成员

特点:1)修饰成员变量或方法,称为类变量/静态成员变量或类方法,不能修饰局部变量;

           2)不依赖对象,不需要new对象,所有对象共用一份

           3)静态方法内部不能调用非静态方法,不能使用this,无法重写;

           4)存储在方法区当中,生命周期伴随类的一生。

访问方式:虽然可以但是不建议通过对象来引用访问,而是通过类名访问

class Student{
    private String name;//普通成员变量,每个对象都有一份
    private int age;//普通成员变量
    public static String classroom = "301";//被static修饰,称为类变量/静态成员变量,所有对象共用一份

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public static void func() {
        System.out.println("func……");
    }
}
public class Test {
    public static void main(String[] args) {
        Student student1 = new Student("zhangsan",20);
        Student student2 = new Student("lisi",21);
        Student student3 = new Student("wangwu",22);//这些对象都可以不new,不影响类变量和类方法的调用
        /*System.out.println("教室是"+student1.classroom);//结果是一样的
        System.out.println("教室是"+student2.classroom);
        System.out.println("教室是"+student3.classroom);*///虽然可以但是不建议通过对象来引用访问
        System.out.println("教室是"+Student.classroom);//而是通过类名直接访问;
        Student.func();
    }
}

7.代码块

分类:静态代码块实例代码块,同步代码块,普通代码块

注意:

1)顺序:静态代码块 > 构造代码块 > 构造方法 ;

2)静态代码块不管生成多少个对象,都只执行一次

3)如果一个类中包含多个静态代码块,编译器会按照顺序依次执行。

class Student {
    private String name = "lisi";
    private int age;
    {
        this.name = "zhangsan";//按顺序执行这一行代码,名字为zhangsan
        System.out.println("构造块!");
    }
    static {
        classroom = "201";
        System.out.println("静态代码块!");
    }
    public static String classroom = "208";//按顺序执行这一行代码,班级为208

    public Student() {
        System.out.println("调用不带参数的构造方法!");
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("调用带两个参数的构造方法!");
    }

    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 class Test {
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(Student.classroom);//208
        System.out.println(student.getName());//zhangsan
    }
}

 

8.对象的打印

编译器自己生成(方法重写):右键 + Generate + toString() + 自选

class Student {
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override//方法重写,重写了toString方法
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public void print() {
        System.out.println("姓名:"+this.name+" 年龄:"+this.age);
    }
}
public class Test {
    public static void main(String[] args) {
        Student student = new Student("zhangsan",20);
        System.out.println(student);//没重写时,打印student的地址
        student.print();//正常调用上面的成员方法
    }
}

 


Over!继承和多态见!!

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

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

相关文章

深度学习的定义和未来发展趋势

深度学习的定义和未来发展趋势 什么是深度学习数学和编程的基础知识深度学习的应用领域深度学习的常见算法和模型训练深度学习模型深度学习的未来 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Python领域新星创作者&#…

Linux [常见指令 (1)]

Linux常见指令 ⑴ 1. 操作系统1.1什么事操作系统1.2选择指令的原因 2.使用工具3.Linux的指令操作3.1mkdir指令描述:用法:例子 mkdir 目录名例子 mkdir -p 目录1/ 目录2/ 目录3 3.2 touch指令描述:用法:例子 touch 文件 3.2pwd指令描述:用法:例子 pwd 3.4cd指令描述:用法:例子 c…

SQL语句截取字段某指定字符的前半段/后半段内容

最近项目中遇到一个小问题: 需要从数据库中取出对应数据,并根据某个字段中的前半段内容进行排序,搜索资料后得以解决,现将解决方法记录如下: 最初的查询SQL: SELECT file_name,sort FROM base_annexesfil…

Linux守护进程(Daemon Process)

1. 守护进程概念: 独立于终端控制并周期性地执行处理某些任务的后台进程。 2. 守护进程创建步骤: 核心:让进程脱离控制终端→创建新会话。 (1)创建子进程,父进程退出(必须)&#x…

LVS +Keepalived 高可用群集部署

一、LVSKeepalived 高可用群集 在这个高度信息化的 IT 时代,企业的生产系统、业务运营、销售和支持,以及日常管理等环节越来越依赖于计算机信息和服务,对高可用(HA)技术的应用需求不断提高,以便提供持续的…

【数据结构】二叉树(链式)

😛作者:日出等日落 📘 专栏:数据结构 抱怨是一件最没意义的事情。如果实在难以忍受周围的环境,那就暗自努力练好本领,然后跳出那个圈子。 目录 🎄二叉树 ✔二叉树的结构: ✔BuyNode…

Linux 基础操作

Linux学习教程,Linux入门教程(超详细) chown (change owner) : 修改所属用户与组。chmod (change mode) : 修改用户的权限。 要查看文件或目录的属性,可以使用ls命令,加上-l选项。例如&#xff…

ctfshow之_萌新web1至web7

一、访问在线靶场ctfshow ctf.showhttps://ctf.show/challenges如下图所示,进入_萌新赛的web1问题: 如上图所示,页面代码提示id1000时,可以查询到flag,进行如下尝试: 如下图所示,传入参数id1时…

3.1 存储系统概述

学习目标: 以下是一个关于存储系统概述的具体学习目标: 理解计算机存储器的基本概念,包括存储器的分类、存储单元、存储器容量等基本概念。 掌握存储器的存取原理,包括地址结构、存取周期、存取速度等相关概念。 熟悉常见的存储…

在flutter中使用NFC(超全)

文章前景:目前公司主要的业务方向是sass平台,我们的admin系统是基于qiankun搭建的主基座和子模块,app是flutterh5。我主要负责的是 1、qiankun基座的搭建 2、flutter基座和通信jsbridge的搭建 3、app内h5的书写 4、模块开发规范的书写 5、… …

Winform从入门到精通(33)——OpenFileDialog(史上最全)更新中

一、属性 1、AddExtension 该属性用于SaveFileDialog保存文件时,如果没有为文件添加后缀,则自动为保存的文件添加一个后缀,这个后缀是由DefaultExt属性决定的,比如DefaultExt的,所以在OpenFileDialog中这个属性没什么作用,在SaveFileDialog中我再详细介绍该属性 2、AutoU…

第二章 集合

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

极客之眼 Nmap:窥探世界的第一步

文章目录 参考描述Nmap极客之眼Nmap 与黑客的缠绵往事CIDRNmap 的获取检测 Nmap 是否已经安装下载并安装 NmapLinuxMacOS 与 WIndows 区域扫描基本扫描扫描结果解析域名解析服务 区域扫描CIDR列表扫描正向 DNS 查询与反向 DNS 查询列表扫描拒绝反向 DNS 查询 主机名与 CIDRIP 地…

vs2019+vtk开发环境搭建

1.安装vs2019 Enterprise,visual assist x,cmake Microsoft Visual Studio Enterprise 2019 sn: BF8Y8-GN2QH-T84XB-QVY3B-RC4DF 2.下载vtkhttps://www.vtk.org/files/release/9.2/VTK-9.2.6.tar.gz 3.cmake编译配置选中Example,可编译官方…

【Java】『蓝桥杯』10道编程题及答案(五)

系列文章 【Java】『蓝桥杯』10道编程题及答案(一) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/130223115 【Java】『蓝桥杯』10道编程题及答案(二) 本文链接:https://blog.csdn.net/y…

深度学习之神经网络量化理解

深度学习系列文章目录 文章目录 深度学习系列文章目录前言一、什么是量化量化现状GoogleTensorRTTVM量化基本知识基于线性量化的对称量化和非对称量化 总结 前言 刚开始接触神经网络,对量化是2年前那会,用NCNN和TVM在树莓派上部署一个简单的SSD网络。那…

知识点滴 - 世界化工企业百强

2022年7月25日,美国《化学与工程新闻》(C&EN)发布2022年全球化工企业50强名单。 2022-09-21日附近,国际石化市场信息服务商安迅思ICIS发布了最新世界化工企业100强排行榜(Top 100 Chemical Companies)&…

基于微信小程序的垃圾分类系统的研究与实现(附源码和教程)

1. 简介 本文介绍的事基于微信小程序的垃圾分类系统,主要实现的功能有登录、注册、垃圾分类查询、垃圾预约回收、垃圾分类功能。 2.系统设计与实现 本章节是论文的重点,基于上一章介绍的总体设计框架的搭建,详细对小程序的页面布局、流程设…

Mask2Former来了!用于通用图像分割的 Masked-attention Mask Transformer

原理https://blog.csdn.net/bikahuli/article/details/121991697 源码解析 论文地址:http://arxiv.org/abs/2112.01527 项目地址:https://bowenc0221.github.io/mask2former Mask2Former的整体架构由三个组件组成: 主干特征提取器&#xff…