JavaSE基础 --- 类与对象

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.mzph.cn/news/129327.shtml

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

相关文章

shell之lsof的用法

shell之lsof的用法 1&#xff09;列出所有打开的文件&#xff1a;lsof。 2&#xff09;查看谁正在使用某个文件&#xff1a;lsof /filepath/file。 3&#xff09;递归查看某个目录的文件信息&#xff1a;lsof D /filepath/filepath2/。 4&#xff09;遍历查看某个目录的所有文件…

Java——接口类和抽象类的方法声明不需要加{}

在Java中&#xff0c;接口类和抽象类的方法声明是不需要加{}的。具体来说&#xff1a; 1. 接口类&#xff08;Interface&#xff09;&#xff1a;接口类定义了一组方法的规范&#xff0c;没有具体的方法实现。在接口中&#xff0c;方法声明只包含方法名、参数列表和返回类型&a…

两分钟搞定MySQL安装——极速mysql5.7安装教程

一、下载mysql mysql官网传送带&#xff1a; MySQL :: Download MySQL Community Server 选择好版本后直接下载即可&#xff0c;版本格式为zip格式。 二、安装mysql 1、解压zip安装包 ps&#xff1a;解压缩的路径里面不要出现中文哦&#xff01; 2、设置配置文件 新建data…

dubbo没有找到生产者

1、没有找到生产者 com.alibaba.dubbo.rpc.RpcException: No provider available from registry 127.0.0.1:2181 for service .... , please check status of providers(disabled, not registered or in blacklist)2、 查看是不是 对应的providers 没有 注册上去 找到 zk 对应…

CSRF攻击(2), 绕过Referer防御

CSRF攻击(2), 绕过Referer防御 一. 场景: 攻击服务器: 192.168.112.202 目标服务器: 192.168.112.200说明: 1. 前端页面的功能是修改密码. 2. 将恶意页面放到202服务器上, 在目标200服务器上访问恶意页面, 目的是绕过200服务器上对CSRF的防御, 修改密码. 二. 后端防御代码: …

解决爬虫在重定向(Redirect)情况下,URL没有变化的方法

重定向是一种网络服务&#xff0c;它可以实现从一个网页跳转到另一个网页的功能。它把用户请求的网页重定向到一个新的位置&#xff0c;而这个位置可以是更新的网页&#xff0c;或最初请求的网页的不同版本。另外&#xff0c;它还可以用来改变用户流量&#xff0c;当用户请求某…

内网穿透Windows下快速搭建个人WEB项目无需服务器

&#x1f4d1;前言 本文主要是windows下内网穿透文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

HTML、CSS和JavaScript,实现换肤效果的原理

这篇涉及到HTML DOM的节点类型、节点层级关系、DOM对象的继承关系、操作DOM节点和HTML元素 还用到HTML5的本地存储技术。 换肤效果的原理&#xff1a;是在选择某种皮肤样式之后&#xff0c;通过JavaScript脚本来加载选中的样式&#xff0c;再通过localStorage存储。 先来回忆…

MYSQL 8.0 配置CDC(binlog)

CDC&#xff08;Change Data Capture&#xff09;即数据变更抓取&#xff0c;通过源端数据源开启CDC&#xff0c;ROMA Connect 可实现数据源的实时数据同步以及物理表的物理删除同步。这里介绍通过开启Binlog模式CDC功能。 注意&#xff1a;1、使用MYSQL8.0及以上版本。 2、不…

剑指JUC原理-9.Java无锁模型

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

docker 存储目录迁移

参考&#xff1a;【Docker专题】WSL镜像包盘符迁移详细笔记 - 掘金 docker迁移 一 默认目录 Windows版本&#xff08;Windows 10 wsl 2&#xff09;docker 默认程序安装到c盘&#xff0c;数据存放于 C:\Users\当前用户名\AppData\Local\Docker\wsl\data\ext4.vhdx 这样会导致…

延时摄影视频制作工具 LRTimelapse mac中文版特点介绍

lrTimelapse mac是一款适用于 Windows 和 macOS 系统的延时摄影视频制作软件&#xff0c;可以帮助用户创建高质量的延时摄影视频。该软件提供了直观的界面和丰富的功能&#xff0c;支持多种时间轴摄影工具和文件格式&#xff0c;并具有高度的可定制性和扩展性。 lrTimelapse ma…

牛客项目(五)-使用kafka实现发送系统通知

kafka入门以及与spring整合 Message.java import java.util.Date;public class Message {private int id;private int fromId;private int toId;private String conversationId;private String content;private int status;private Date createTime;public int getId() {retur…

Python数据分析实战-筛选出DataFrame中指定列都不包含缺失值的记录(附源码和实现效果)

实现功能 筛选出DataFrame中指定列都不包含缺失值的记录 实现代码 import pandas as pd# 创建示例DataFrame data {A: [1, 2, 3, None, 5],B: [1, None, 3, 4, 5],C: [1, 2, 3, 4, 5] } df pd.DataFrame(data)# 筛选出指定列都不包含缺失值的记录 columns_to_check [A, B…

Prometheus+Node_exporter+Grafana实现监控主机

PrometheusNode_exporterGrafana实现监控主机 如果没有安装相关的配置&#xff0c;首先要进行安装配置&#xff0c;环境是基于Linux&#xff0c;虚拟机的相关环境配置在文末给出&#xff0c;现在先讲解PrometheusNode_exporterGrafana的安装和使用。 一.Prometheus安装 虽然…

Spring Boot 2.x.x 升级至 Spring Boot 3.x.x

小伙伴们&#xff0c;你们好呀&#xff0c;好久不见&#xff0c;我是老寇&#xff0c;跟我一起升级Spring Boot版本 一、JDK 版本 JDK8 需要升级至 JDK17 二、Spring Boot 版本 Spring Boot 2.x.x 升级至 Spring Boot 3.x.x 三、Java Api 变更 javax 变更成 jakarta 四、…

家用洗地机什么牌子最好?家用洗地机排行榜

对于现在的年轻人来说&#xff0c;打扫家里的卫生一直是非常头疼的问题&#xff0c;上班一天已经很累了&#xff0c;回家还需要花费很长时间吸地、拖地真的很闹心。特别是对于有小孩子的家庭&#xff0c;地面弄上一些油污、饭菜简直就是家常便饭&#xff0c;每次打扫起来非常费…

NFC芯片MS520:非接触式读卡器 IC

MS520 是一款应用于 13.56MHz 非接触式通信中的高集成 度读写卡芯片。它集成了 13.56MHz 下所有类型的被动非接触 式通信方式和协议&#xff0c;支持 ISO14443A 的多层应用。 主要特点 ◼ 高度集成的解调和解码模拟电路 ◼ 采用少量外部器件&#xff0c;即可将输…

X号是否可以接入OKCC

答案当然是可以。 但是有个前提&#xff0c;需要借助X号平台&#xff0c;也就是我们常说的小号平台。 X号只是号码资源&#xff0c;没有载体&#xff0c;要将X号接入OKCC&#xff0c;需要通过小号平台&#xff0c;类似号码池一样的平台&#xff0c;以API的方式接入OKCC。 所以很…

Redis集群

目录 一, 集群及分片算法 1.1 什么是集群 1.2 数据分片算法 1. 哈希求余 2. 一致性哈希算 3. 哈希槽分区算法(Redis使用) 二, 集群的故障处理 2.1 故障判定 2.2 故障迁移 三, 集群扩容 四, 集群缩容 一, 集群及分片算法 1.1 什么是集群 我们在Redis哨兵中学习了,哨…