Javase06|类和对象

news2024/11/29 20:58:06

Javase06|类和对象

文章目录

  • Javase06|类和对象
    • 1.面向对象的初步认识
    • 2.类的定义
    • 3.类的实例化
    • 4.this引用
    • 5.对象的构造及初始化
    • 6.封装
    • 7.static成员
    • 8.代码块

1.面向对象的初步认识

1.1对象的概念

Java是一门面向对象的语言,面向对象主要依靠对象之间的交互完成一件事情。

2.类的定义

class ClassName{
    field;
    method;
}

注意:

  • 类名采用大驼峰定义

3.类的实例化

3.1实例化示例

public class Main{
public static void main(String[] args) { 
PetDog dogh = new PetDog(); //通过new实例化对象
dogh.name = "阿黄";
dogh.color = "黑黄";
dogh.barks();
dogh.wag();
PetDog dogs = new PetDog();
dogs.name = "阿黄";
dogs.color = "黑黄";
dogs.barks();
dogs.wag();
 }
}

注意:

  • new关键字用于创建一个对象的实例

  • 使用.来访问对象中的属性和方法

  • 同一个类可以创建多个实例

  • 当一个引用赋值为null的时候,代表:这个引用不指向任何对象 PetDog dogh = null;

  • 引用不能指向引用person1 = person2;//\这个代表person1这个引用指向了person2这个引用指向的对象

  • 一个引用不能同时指向多个对象

    Person person1 = new Person();

    person1 = new Person();

    person1 = new Person();

    其实最后person1只指向了这最后一个对象

3.2类和对象的说明

  1. 类就像一个模型,,限定了类有哪些成员
  2. 一个类可以实例化多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
  3. 形象化的类比喻:类实例化出对象就像建房子,类是设计图,实例化出的对象就是实体化的房子,占据物理空间,对象才能实际存储数据

4.this引用

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

this引用的特性:

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

5.对象的构造及初始化

在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败

5.1构造方法

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

public class Date {
public int year;
public int month;
public int day;
    // 构造方法: 
    // 名字与类名相同,没有返回值类型,设置为void也不行 
    // 一般情况下使用public修饰 
    // 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
public Date(int year, int month, int day){
    this.year = year;
    this.month = month;
    this.day = day; 
    System.out.println("Date(int,int,int)方法被调用了");
}
public void printDate(){ 
    System.out.println(year + "-" + month + "-" + day); 
}
public static void main(String[] args) { 
    // 此处创建了一个Date类型的对象,并没有显式调用构造方法 
    Date d = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了
    d.printDate(); 
}
}

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

特性:

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public class Date {
public int year;
public int month;
public int day; // 无参构造方法
public Date(){
    this.year = 1900;
    this.month = 1; 
    this.day = 1; 
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) { 
    this.year = year; 
    this.month = month;
    this.day = day; 
}
public void printDate(){
    System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
    Date d = new Date(); 
    d.printDate(); 
}
}
  1. 上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载

  2. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。

**注意:**一旦用户定义,编译器则不再生成默认的构造方法。

5.2构造方法中,可以通过this调用其他构造方法来简化代码

如下:

public class Date {
public int year;
public int month;
public int day; 
    // 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复 
    // 此处可以在无参构造方法中通过this调用带有三个参数的构造方法       // 但是this(1900,1,1);必须是构造方法中第一条语句
public Date(){ 
    //System.out.println(year);注释取消掉,编译会失败       
    this(1900, 1, 1); 
    //this.year = 1900; 
    //this.month = 1;
    //this.day = 1;
}
    // 带有三个参数的构造方法
public Date(int year, int month, int day) {
    this.year = year;
    this.month = month;
    this.day = day; 
  }
}

注意:this(…)必须是构造方法中第一条语句

绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)

5.3默认初始化

局部变量使用时必须初始化,因为没有默认值。成员变量不用,有默认初始值。

直接类里面就是成员变量,方法类就是局部变量

注意:

变量生命周期

  1. 成员变量:对象创建出生,对象对象销毁结束

  2. 局部变量:进入方法创建,出方法结束

5.3.1初始化所分配的空间

即:对象空间被申请之后,对象中包含的成员已经设置好了初始值。

数据类型默认值
byte0
char‘\u0000’
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull

5.4就地初始化

在声明成员变量时,就直接给出了初始值。

public class Date {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date(){ }
public Date(int year, int month, int day) { 
}
public static void main(String[] args) {
    Date d1 = new Date(2021,6,9); 
    Date d2 = new Date(); 
   }
}

6.封装

概念:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互

6.1访问限定符

为何有访问限定符的?拿来干啥的?

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用

有哪些访问限定符呢?
在这里插入图片描述

说明:

protected:主要用在继承中

default:什么都不写时的默认权限

6.2封装扩展之包

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

6.2.1导包

​ 概念:import语句导包,例如:import java.util.*导入java.util中的其他类,随用随取(要用到哪个包就导入该包,不是直接全部导入)。但是更建议显式的指定要导入的类名,否则可能会出现冲突的情况

6.2.2可以使用import static导入包中静态的方法和字段

import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
double x = 30;
double y = 40; // 静态导入的方式写起来更方便一些. // double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
double result = sqrt(pow(x, 2) + pow(y, 2)); System.out.println(result);
} }

7.static成员

概念:在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的

7.1static修饰成员变量

【静态成员变量特性】

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 类变量存储在方法区当中(静态的存储在方法区,非静态成员变量存储在堆中)
  4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
public class Student{
public String name;
public String gender;
public int age;
public double score;
public static String classRoom = "Bit306";
    // ...
public static void main(String[] args) { 
    // 静态成员变量可以直接通过类名访问     
    System.out.println(Student.classRoom); 
    Student s1 = new Student("Li leilei", "男", 18, 3.8);
    Student s2 = new Student("Han MeiMei", "女", 19, 4.0); 
    Student s3 = new Student("Jim", "男", 18, 2.6); 
    // 也可以通过对象访问:但是classRoom是三个对象共享的 
    System.out.println(s1.classRoom);                     System.out.println(s2.classRoom);                     System.out.println(s3.classRoom);

static属性应该如何访问?

Java中,static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。

public class Student{ 
    // ...
private static String classRoom = "Bit306"; 
    // ...
public static String getClassRoom(){ 
    return classRoom; 
}
}
public class TestStudent {
public static void main(String[] args) { System.out.println(Student.getClassRoom());
       } 
}

【静态方法特性】

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
  3. 不能在静态方法中访问任何非静态成员变量
  4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用(因为静态方法不属于任何对象,不能使用this)。只要是非静态的成员,都需要通过对象的引用才能调用
  5. 静态方法无法重写,不能用来实现多态
  6. 获取静态的成员变量或者是设置静态的成员变量,此时最好的方法是设置静态的方法,否则要是非静态的,还得实例化对象,多此一举。

7.2static成员变量初始化

注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性

7.2.1就地初始化

在定义时直接给出初始值

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

7.2.2静态代码块初始化

看后面的代码块一节

8.代码块

8.1概念以及分类

概念:使用 {} 定义的一段代码称为代码块

根据代码定义的位置以及关键字,又分为以下四种:

  • 普通代码块
  • 构造块
  • 静态块
  • 同步代码块(后续讲解多线程部分再谈)

8.2普通代码块

普通代码块:定义在方法中的代码块。这种用法较少见

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

8.3构造代码块

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

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 = "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) { 
    Student stu = new Student(); 
    stu.show(); } }
// 运行结果 
    //I am instance init()!
   // I am Student init()! 
   // name: bit age: 12 sex: man

//可以看出实例代码块优先与构造代码块执行

8.4静态代码块

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

public class Student{
private String name;
private String gender;
private int age;
private double score;
private static String classRoom;
    
    // 静态代码块 
    static {
        classRoom = "bit306"; 
        System.out.println("I am static init()!");
    }
public Student(){ 
    System.out.println("I am Student init()!");
}
    //实例代码块 
    { 
        this.name = "bit"; 
        this.age = 12;
        this.gender = "man"; 
        System.out.println("I am instance init()!"); 
    }
public static void main(String[] args) {
    Student s1 = new Student(); 
    System.out.println("==================");
    Student s2 = new Student(); 
}
}
//运行结果如下:
//I am static init()!
//I am instance init()!
//I am Student init()!
==================
//I am instance init()!
//I am Student init()!

    
    //可以看出,static只执行了一次并且第一个执行,实例代码块优先构造代码块执行。
    //总结类中代码块优先顺序:static代码块>实例代码块>构造代码块  注意:为啥没有普通代码块,因为普通代码块是写在方法中的

注意:

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

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

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

相关文章

审稿意见相互矛盾的11种可能情况及修改建议

遇到相互矛盾的审稿意见,作者很难不纠结,毕竟哪个审稿人都不想得罪,到底该怎么办呢? 虽然有些审稿意见乍一看上去相互矛盾,但深思之后,也能发现其中的共性或者根本问题。明确了这一点,就比较清楚…

<六> objectARX开发:创建、插入、删除图块

1、介绍 所有的实体都保存在块表记录中,而块表记录则存储在块表中。实际上,用户在AutoCAD中定义块相当于增加了一个块表记录,块表记录的名称就是块定义的名称。打开任意dwg文件,然后创建两个从图中可以看出,当前图形的块表中包含了五个记录: *Model_Space、 Paper_Space、…

Qt--基于TCP客户端与服务器的聊天程序(半双工通信)

目录 任务:实现一个基于TCP的聊天程序,需要使用的类有: QTcpServer ​编辑 QTcpSocket ​编辑 QTextStream 服务端:server(QTcpServer) 步骤: 代码: dialog.h dialog.cpp 客户端&am…

论文笔记:基于手机位置信息的地图匹配算法

2015计算机应用 整体思路和论文笔记:Hidden Markov Map MatchingThrough Noise and Sparseness_UQI-LIUWJ的博客-CSDN博客 很像,也是应用HMM进行地图匹配 HMMM本文 状态转移矩阵 观测概率矩阵 正态分布均值都是0,唯一不同的是S…

统计学习方法第五章——决策树

x.1 决策树前言 decision tree决策树是一种分类和回归的方法,本章只考虑在分类领域的使用。决策树使用了归纳法划分特征空间,以此来达到分类的目的。决策树不同于KNN中的kd树,它是多叉树,不是二叉树。决策树是一种概率模型。 决…

毕业2年,月薪25k,有时候人与人的差距比人和狗还大···

想起两年前交流过的一个应届生,当时他刚毕业技术水平不高,进了一个小公司做测试实习工作。最近联系上了,不问不知道,一问吓一跳,他现在已经进了某一线大厂,月薪25K。这位朋友其实也没比别人强多少&#xff…

原神服务端架构搭建工具+环境配置资料

原神服务端架构搭建工具环境配置资料 我是艾西,今天给大家分享一份详细的原神服务端结构资料教程,从服务端的获取到端口的使用以及安卓和ios的DAIL签名等一文让你明白怎么架设原神服务端,哪些工具资料又代表着什么意思(保姆级教学…

RFM模型

目录标题 定义指标分析模型分析如何衡量每个客户的RFM指标1. 确定时间范围2. 要定义指标的衡量标准3. 对客户指标进行打分4. 计算平均值5. 用户分类 不同客户不同解决方案 RFM的最大短板RFM的深层问题R:用户离得越久就越有流失风险F:用户频次越高越忠诚M…

SpringBoot 日志文件从入门到实战

文章目录 1. 日志的作用2. 日志怎么用3. 自定义日志打印3.1 程序中得到日志对象3.2 使用日志对象打印日志3.3 日志格式说明 4. 日志级别4.1 日志级别的作用4.2 日志级别的分类与使用4.3 日志级别的设置4.4 综合练习 5. 日志的持久化5.1 配置日志文件的保存路径:5.2 配置日志文件…

MVP发布后,下一步该怎么办

MVP发布后,下一步该怎么办 一、为什么要从发布MVP开始?二、发布MVP后该做什么?1、推广MVP2、收集用户反馈3、进行用户发展访谈4、确定功能的优先次序5、建立一个产品路线图 三、如何衡量一个MVP的成功?1、分析仪表板的重要性2、创…

图解LeetCode——160. 相交链表

一、题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。注意,函数返回…

怎么把jfif改成png格式?这四种方法值得一试

怎么把JFIFf改成PNG格式?众所周知,JFIF是一种JPEG图像格式的子集,可以提供高质量的压缩效果。但是,JFIF格式有一些限制,例如它不支持透明度和多图层等功能,而PNG格式则是一种无损压缩的图像文件格式&#x…

从零开始Vue3+Element Plus后台管理系统(九)——使用API协作平台Mock数据

截止目前,本项目用了2个接口,一个登录,一个获取列表数据。接下来想做的页面和功能,为了看起来更真实,就需要增加更多的模拟数据。 Mock语法写得有些随意,看起来还是很假 😁 Mock数据可以使用M…

认识IPv6---寻址模式与地址类型与格式

本文目录 1、IPv6寻址模式1.1、单播(unicast)1.1、组播(multicast)1.1、任播(Anycast) 2、IPv6地址的类型与格式2.1、IPv6地址的格式2.2、IPv6地址的类型2.2.1、单播地址简介2.2.2、组播地址简介2.2.3、任播地址简介 IPv6的出现,最重要的原因是为了解决IPv4地址不足…

我扛住字节面试了,太干了......

春招进展快 2 个月,今年相比往年我感觉比较卷,很少见到offer收割机的选手。 不管环境如何,持续学习这个是不能放弃的,心态也要稳一稳,坦然面对失败,失败才是常态,成功可能才是偶然的。 好了&a…

LitCTF-web-WP(部分)

前言 CSDN内容合伙人 2023年CSDN新星计划Web安全方向导师。 华为MindSpore截至目前最年轻的优秀开发者 阿里云专家博主、华为网络安全云享专家以及腾讯云自媒体分享计划博主。 吉林师范大学CTF校队——SuD0战队的队长 吉林师范大学网信网安学生负责人 核心粉丝群超过50人 带队…

网址域名查询-域名注册查询工具

域名查找软件 域名查找软件是一种能够帮助用户快速查询域名相关信息的工具。它通常提供了批量域名查询和实时域名查询服务,能够帮助用户查询域名的注册信息、到期时间、所有者信息、域名服务器等多种相关信息。以下是域名查找软件的主要特点: 批量域名查…

roadmap go语言

技术类的Roadmap(路线图)具有许多好处,下面是其中几个主要的好处: 明确目标:Roadmap可以帮助技术团队明确目标和愿景。它提供了一个清晰的计划,使团队成员知道他们正在朝着什么方向前进,并且可…

网络正常但是web、ftp、telnet应用新建连接偶尔卡顿处理方法

目录 问题现象 故障定位 TCP报头 options详解 Opions Kind有哪些 options中的Timestamp详解 TSval & TSecr Timestamp Value的单位是什么 TCP连接的建立与释放 普通三次握手 带时间戳的三次握手 抓包展示带时间戳的tcp会话 WireShark中的时间 VS tcpdump 直接…

KDZD400Q紫外臭氧浓度分析仪

一、产品概述 检测仪用于快速检测多种气体浓度、温湿度测量并超标报 警的场合。采用 2.31 寸高清彩屏实时显示,选用进口品牌的气体传感器,主要检测原理有: 电化学、红外、催化燃烧、热导、PID 光离子等。 可以检测管道中或受限空间、大气环境…