Java入门——类和对象(上)

经读者反映与笔者考虑,近期以及往后内容更新将主要以java为主,望读者周知、见谅。

类与对象是什么?

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。

面向对象注重的是对象,也就是参与过程所涉及到的主体。是通过逻辑将一个个功能实现连接起来。


1.面向对象是思考问题的一种思考方式,是一种思想。

2.类就是一类对象的统称。对象就是这一类具体化的一个实例。

3.面向对象的好处:将复杂的事情变简单了,只要面对一个对象就行。

简而言之

面向对象就是用代码(类)来描述客观世界的事物的一种方式. 一个类主要包含一个事物的属性和行为。

类和类的实例化

类就是一类对象的统称。对象就是这一类具体化的一个实例。

单的例子:我们做月饼的模子就是一个类,而通过这个模子可以做出月饼,那么在这个例子当中,类就是那个模子,而月饼就是那个对象,所以月饼就是一个实体。一个模子可以实例化无数个对象。

总的来说:类相当于一个模板,对象是由模板产生的样本。一个类,可以产生无数的对象。

声明一个类就是创建一个新的数据类型,而类在Java中属于引用类型,Java使用关键字class来声明类。我们来看以下简单的声明一个类。

// 创建类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("睡觉!");      
}
}

类的实例化

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

1. 类只是一个模型一样的东西,限定了类有哪些成员.

2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量.

3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间.

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();    
}
}
  1. new 关键字用于创建一个对象的实例
  2. 使用 . 来访问对象中的属性和方法
  3. 同一个类可以创建多个实例

类的成员

字段/属性/成员变量

在类中, 有在方法外部定义的变量. 这样的变量我们称为 "字段" 或 "属性" 或 "成员变量"(三种称呼都可以, 一般不会严格区分).

用于描述一个类中包含哪些数据。

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);    
}
}

使用

  • 访问对象的字段.
  • "访问" 既包含读, 也包含写.
  • 对于一个对象的字段如果没有显式设置初始值, 那么会被设置一个默认的初值.
  1. 对于各种数字类型, 默认值为 0.
  2. 对于 boolean 类型, 默认值为 false.
  3. 对于引用类型(String, Array, 以及自定制类), 默认值为 null

字段就地初始化

很多时候我们不希望字段使用默认值, 而是需要我们显式设定初值. 可以这样写:

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

方法

用于描述一个对象的行为.

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();    
}
}

此处的 show 方法, 表示 Person 这个对象具有一个 "展示自我" 的行为.

这样的 show 方法是和 person 实例相关联的. 如果创建了其他实例, 那么 show 的行为就会发生变化

static 关键字

修饰属性

class TestDemo{    
public int a;    
public static int count;
}

count被static所修饰,所有类共享。且不属于对象,访问方式为:类名 . 属性。

修饰方法

如果在任何方法上应用static关键字,此方法称为静态方法。

  • 静态方法属于类,而不属于类的对象。
  • 可以直接调用静态方法,而无需创建类的实例。
  • 静态方法可以访问静态数据成员,并可以更改静态数据成员的值。
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是当前实例父类实例的引用, 也是和当前实例相关).

总结复盘

class Person {    
public int age;//实例变量    存放在对象内    
public String name;//实例变量    
public String sex;//实例变量    
public static int count;//类变量也叫静态变量,编译时已经产生,属于类本身,且只有一份。存放在方法区    
public final int SIZE = 10;//被final修饰的叫常量,也属于对象。 被final修饰,后续不可更改    
public static final int  COUNT = 99;//静态的常量,属于类本身,只有一份  被final修饰,后续不可更改    
//实例成员函数    public void eat() {       
int a = 10;//局部变量        
System.out.println("eat()!");      
}    //实例成员函数     
public void sleep() {       
System.out.println("sleep()!");      
}    //静态成员函数     
public static void staticTest(){         
//不能访问非静态成员        
//sex = "man"; error        
System.out.println("StaticTest()");     
}
}
public class Main{    
public static void main(String[] args) {//产生对象 实例化对象        Person person = new Person();//person为对象的引用        System.out.println(person.age);//默认值为0        System.out.println(person.name);//默认值为null        //System.out.println(person.count);//会有警告!        //正确访问方式:        System.out.println(Person.count);        System.out.println(Person.COUNT);         Person.staticTest();        
//总结:所有被static所修饰的方法或者属性,全部不依赖于对象。        person.eat();        person.sleep();    
}
}

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

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

相关文章

c#文心接口应用举例

"文心接口" 通常不是 C# 语言或生态系统中直接的一个术语&#xff0c;但我猜你可能是在提及百度的一个AI平台或API&#xff0c;比如百度的文心一言&#xff08;ERNIE Bot&#xff09;或其他与AI和NLP&#xff08;自然语言处理&#xff09;相关的服务。由于具体的文心…

DDOS攻击实战演示,一次DDOS的成本有多低?

DDoS攻击成本概览 分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其低廉的启动成本和惊人的破坏力著称。攻击者通过黑市轻松获取服务&#xff0c;成本从几十元人民币的小额支出到针对大型目标的数千乃至数万元不等。为了具体理解这一成本结构&#xff0c;我们将通过一个简…

机器学习【如何学习】

如何学习机器学习 机器学习是一门快速发展的学科&#xff0c;学习机器学习需要掌握一定的数据基础和编程能力。但是很多人一听到数学就头大&#xff0c;就退缩&#xff0c;导致想要学习的新已经有两三年了&#xff0c; 但是学习的行动一直在心里&#xff0c;迟迟没有落地&…

常见的TypeScript类型注解符号

1、: 用途: 用于指定类型。放在变量名或函数参数后面&#xff0c;紧接着是类型。 示例: let name: string "Alice";2、string, number, boolean, void, null, undefined 用途: 基本数据类型。分别表示字符串、数字、布尔值、无返回值、空值和未定义。 示例: func…

每日两题 / 226. 翻转二叉树 98. 验证二叉搜索树(LeetCode热题100)

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 以后续遍历的方式交换当前节点的左右指针 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), ri…

机器学习-12-sklearn案例03-flask对外提供服务

整体思路 训练一个模型&#xff0c;把模型保存 写一个基于flask的web服务&#xff0c;在web运行时加载模型&#xff0c;并在对应的接口调用模型进行预测并返回 使用curl进行测试&#xff0c;测试通过 再创建一个html页面&#xff0c;接受参数输入&#xff0c;并返回。 目录结…

Java使用equals和==的区别

对于在范围 -128 到 127 之间的数值&#xff0c;Java 会使用缓存的 Integer 对象。因此&#xff0c;这些数值的 Integer 对象可以使用 进行比较。 对于不在这个范围的数值&#xff0c;Java 每次可能创建一个新的 Integer 对象。这样&#xff0c;即使两个 Integer 对象代表相同…

CSS悬浮动画

<button class"btn">悬浮动画</button>.btn {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);padding: 10px 20px;width: 200px;height: 50px;background-color: transparent;border-radius: 5px;border: 2px solid powderblu…

C++继承深入解析

目录标题 1. 继承的基本概念1.1 为什么使用继承1.2 继承的语法 2. 继承的类型2.1 公共继承&#xff08;Public Inheritance&#xff09;公共继承的特性公共继承的语法公共继承的实际应用 2.2 保护继承&#xff08;Protected Inheritance&#xff09;保护继承的特性保护继承的语…

R2S+ZeroTier+Trilium

软路由使用ZeroTier搭建远程笔记 软路由使用ZeroTier搭建远程笔记 环境部署 安装ZeroTier安装trilium 环境 软路由硬件&#xff1a;友善 Nanopo R2S软路由系统&#xff1a;OpenWrt&#xff0c;使用第三方固件nanopi-openwrt。内网穿透&#xff1a;ZeroTier。远程笔记&…

银河麒麟操作系统 v10 离线安装 Docker v20.10.9

1查看系统版本 [rootweb-0001 ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION"V10 (Tercel)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Advanced Server V10 (Tercel)" ANSI_COLOR"…

pyqt动画效果放大与缩小

pyqt动画效果放大与缩小 QPropertyAnimation介绍放大与缩小效果代码 QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类&#xff0c;它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation&#xff0c;你可以平滑地改变一个对象的属性值&#xff0c;例…

服务器2080ti驱动的卸载与安装

服务器2080ti驱动的卸载与安装 前言1、下载驱动2、驱动卸载与安装2.1 卸载原来驱动2.2 安装新驱动 3、查看安装情况 前言 安装transformers库&#xff0c;运行bert模型时出错&#xff0c;显示torch版本太低&#xff0c;要2.0以上的&#xff0c;所以更新显卡驱动&#xff0c;重…

基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架)全网首发【图像识别-天气分类】

一个能够从给定的环境图像中自动识别并分类天气&#xff08;如晴天、多云、雨天、雪天闪电等&#xff09;的系统。 技术栈&#xff1a; 深度学习框架&#xff1a;PyTorch基础模型&#xff1a;VGG16与EfficientNet任务类型&#xff1a;计算机视觉中的图像分类 模型选择 VGG16 …

1.基于python的单细胞数据预处理-归一化

目录 归一化的引入移位对数皮尔森近似残差两个归一化方法的总结 参考&#xff1a; [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 归一化的引入 在质量控制中&#xff0c;已经从数据集删除了低质…

【网络安全】一次sql注入问题的处理

目录 问题 10.60.100.194&#xff0c;修改之前 修改方案 问题解决 测试过程 问题思考与总结 问题 一次sql注入问题的筛查报告&#xff0c;主要是sql注入的问题资源-CSDN文库 doc-new\20-设计文档\34-Mesh设备管理\100-网络安全 10.60.100.194&#xff0c;修改之前 修改…

Multitouch for Mac:手势自定义,提升工作效率

Multitouch for Mac作为一款触控板手势增强软件&#xff0c;其核心功能在于手势的自定义和与Mac系统的深度整合。通过Multitouch&#xff0c;用户可以轻松设置各种手势&#xff0c;如三指轻点、四指左右滑动等&#xff0c;来执行常见的任务&#xff0c;如打开应用、切换窗口、滚…

ansible部署lamp架构

搭建参考&#xff1a;ansible批量运维管理-CSDN博客 定义ansible主机清单 [rootansible-server ~]# vim /etc/hosts 192.168.200.129 host01 192.168.200.130 host02 [rootansible-server ~]# vim /etc/ansible/hosts [webserver] host01 host02 在ansible端编写index.html…

rk3588 安卓13 暴露相机开关接口

以前不知道有个系统属性可以做&#xff0c;后面的代码我几乎都用系统属性来写&#xff0c;比写个额外的广播接口方便多了。 实现一个相机的开关接口给上层调用&#xff0c;也就是打开后&#xff0c;上层无法再调用相机&#xff0c;关闭后可以正常打开&#xff0c;无需重启&…

为什么Redis6.0引入了多线程

Redis 6.0引入了多线程&#xff0c;主要原因有以下几点&#xff1a; 提高网络I/O的吞吐量&#xff1a;多线程可以更有效地处理大量的并发连接和请求&#xff0c;特别是在多核心服务器上。通过使用多线程来处理读写网络套接字&#xff0c;Redis能够更充分地利用系统资源&#x…