java初阶---类和对象

2023-11-15

一、类和类的实例化
1.类就是一类对象的统称。对象就是这一类具体化的一个实例。一个类可以实例化无数个对象。
2.声明一个类就是创建一个新的数据类型,而类在java中属于引用类型,java使用关键字class来声明类。
3.基本语法

//创建类
class <class_name>{
    field;//成员属性
    method;//成员方法
}
//实例化对象
<class_name> <对象名> =new <class_name>();

代码示例:

class Person{
    public int age;//成员属性  实例变量
    public String name;
    public static int a;//静态成员变量
    public void eat(){//实例成员方法
        System.out.println("吃饭!");
    }
    public void sleep(){
        System.out.println("睡觉!");
    }
    public static void func(){
        System.out.println("静态成员方法func()");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person=new Person();//通过new实例化对象,person是一个引用
        System.out.println(person.name);
        System.out.println(person.age);
        //若访问静态的成员属性,对于静态的属性和方法是不依赖于对象的
        System.out.println(Person.a);
        person.eat();//成员方法调用需要通过对象的引用调用
        person.sleep();
        Person.func();//静态访问
        //产生对象          实例化对象
        Person person1=new Person();
        Person person2=new Person();
    }
}

结果:null 0 0 吃饭! 睡觉! 静态成员方法func()
如果成员变量没有初始化,那么值是默认的值。
如果是引用类型(String,Array,以及自定制类),那么值就是null,如果是简单类型,那么值就是这种类型所对应的默认值
简单类型有:byte—0 short—0 int—0 long—0L float —0.0f
double —0.0 char —’\u0000’ boolean—false
4.注意事项:(1)new关键字用于创建一个对象的实例。
(2)使用 . 来访问对象中的属性和方法。
5.字段就地初始化
(1)就地初始化

class Person1{
    public String name="张三";
    public int age=10;
}
public class TestDemo2 {
    public static void main(String[] args) {
        Person1 person1=new Person1();
        System.out.println(person1.name);//张三
        System.out.println(person1.age);//10
    }
}

(2)默认初始化
(3)类外初始化

class Person1{
    public String name;
    public int age;
}
public class TestDemo2 {
    public static void main(String[] args) {
        Person1 person1=new Person1();
        person1.name="张三";
        System.out.println(person1.name);//张三
        person1.age=10;
        System.out.println(person1.age);//10
    }
}

二、static关键字
1.修饰属性:java静态属性和类相关,和具体的实例无关。

class testDemo{
    public int a;
    public static int count;
}
public class TestDemo3 {
    public static void main(String[] args) {
        testDemo t1=new testDemo();
        t1.a++;
        testDemo.count++;
        System.out.println(t1.a);    //输出结果:1
        System.out.println(testDemo.count);     //1
        System.out.println("=============");
        testDemo t2=new testDemo();
        t2.a++;
        testDemo.count++;
        System.out.println(t2.a);     //1
        System.out.println(testDemo.count);     //2
    }
}

2.修饰方法:如果在任何方法上应用static关键字,此方法称为静态方法。
(1)静态方法属于类,而不属于类的对象。(2)可以直接调用静态方法,而无需创建类的实例。(3)静态方法可以访问静态数据成员,并可以更改静态数据成员的值。

class testDemo{
    public int a;
    public static int count;
    public static void change(){
        count=10;
        //a=10; error 不可以访问非静态数据成员
    }
}
public class TestDemo3 {
    public static void main(String[] args) {
        testDemo.change();//静态方法无需创建实例对象就可以调用
        System.out.println(testDemo.count);      //10
    }
}

注意事项1:静态方法和实例无关,而是和类相关。因此导致这两种情况:(1)静态方法不能直接使用非静态数据成员或调用非静态方法(非静态数据成员和方法都是和实例相关的)(2)this和super两个关键字不能在静态上下文中使用(this是当前实例的引用,super是当前实例父类实例的引用,也是和当前实例相关)
注意事项2:(1)我们曾经写的方法为了简单,都统一加上了static。但实际上一个方法具体要不要带static,都需要是情形而定。(2)main方法为static方法。
三、内存布局
1.代码示例:

class Person4{
    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 TestDemo4 {
    public static void main(String[] args) {
        //产生对象        实例化对象
        Person4 person4=new Person4();
        System.out.println(person4.age);
        System.out.println(person4.name);
        System.out.println(Person4.count);
        System.out.println(Person4.COUNT);
        Person4.staticTest();
        person4.eat();
        person4.sleep();
    }
}

2.输出结果:
在这里插入图片描述
3.数据属性的内存布局
在这里插入图片描述
四、封装
1.软件开发的本质就是对程序复杂程度的管理。如果一个软件代码复杂程度太高,那么就无法继续维护。如何管理复杂程度?封装就是最基本的方法。
在我们写代码时经常会涉及两种角色:类的实现者和类的调用者。
封装的本质就是让类的调用者不必太多的了解类的实现者是如何实现类的。
这样就降低了类使用者的学习和使用成本,从而降低了复杂程度。
2.private实现封装
private/public这两个关键字表示“访问权限控制”。
(1)被public修饰的成员变量或者成员方法,可以直接被类的调用者使用
(2)被private修饰的成员变量或者成员方法,不能被类的调用者使用。
3.代码示例:
(1)直接使用public

class Person2{
    public String name="张三";
    public int age=18;
}
public class TestDemo4 {
    public static void main(String[] args) {
        Person2 person2=new Person2();
        System.out.println("我叫"+person2.name+",今年"+person2.age);
    }
}

执行结果:我叫张三,今年18
(a)这样的代码导致类的使用者(main方法的代码)必须要了解Person2类内部的实现,才能使用这个类。
(b)一旦类的实现者修改了代码,那么类的使用者就需要大规模的修改自己的代码,维护成本较高。
(2)使用private封装属性,并提供public方法供类的调用者使用

class Person3{
    private String name="张三";
    private int age=18;
    public void show(){
        System.out.println("我叫"+name+",今年"+age);
    }
}
public class TestDemo4 {
    public static void main(String[] args) {
        Person3 person3=new Person3();
        person3.show();
    }
}

执行结果:我叫张三,今年18
(a)此时字段已经使用了private来修饰,类的调用者(main方法中)不能直接使用,而需要借助show方法。此时类的使用者就不必了解Person3类的实现细节。
(b)同时类的实现者修改了字段的名字,类的调用者不需要做出任何的修改(类的调用者根本访问不到name,age这样的字段)。
(c)private不光能修饰字段,也能修饰方法。
(3)getter和setter方法

class Person3{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;//this引用,表示调用该方法的对象
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void show(){
        System.out.println("name:"+name+" age:"+age);
    }
}
public class TestDemo4 {
    public static void main(String[] args) {
        Person3 person3=new Person3();
        person3.setName("bit");
        String name=person3.getName();
        person3.setAge(18);
        int age=person3.getAge();
        person3.show();
    }
}

运行结果:name:bit age:18
注意事项:(a)getName,getAge即为getter方法,表示获取这个成员的值。
(b)setName,setAge即为setter方法,表示设置这个成员的值。
(c)当set方法的形参名字和类中的成员属性的名字一样时,如果不使用this,相当于自赋值,this表示当前实例的引用。若是静态方法,则不能用this。
五、构造方法
1.构造方法是一种特殊的方法,使用关键字new实例化新对象时会被自动调用,用于完成初始化操作。
2.面试问题:实例化一个对象/创建一个对象分为几步?
new执行过程:(1)为对象分配内存空间(2)调用对象的构造方法
3.语法规则:(1)方法名称必须与类名称相同
(2)构造方法没有返回值类型说明
(3)每一个类中至少存在一个构造方法
4.代码示例:

class Person5{
    private String name;//实例成员变量
    private int age;
    private String sex;
    //默认构造函数      构造对象
    public Person5(){
        this.name="bit";
        this.age=18;
        this.sex="女";
    }
    //带有三个参数的构造函数,通过Shift+箭头选中多个参数
    public Person5(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 TestDemo4 {
        public static void main(String[] args) {
            Person5 p1=new Person5();
            p1.show();
            Person5 p2=new Person5("bitttt",18,"女");
            p2.show();
        }
    }

执行结果:name:bit age:18 sex:女
name:bitttt age:18 sex:女
六、this关键字
1.this表示当前对象引用
2.代码示例:

    //默认构造函数      构造对象
    public Person5(){
        //this调用构造函数
        this("bit",18,"女");//必须放在第一行进行显示
    }
    //这两个构造函数之间的关系为重载
    public Person5(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

七、认识代码块
1.使用{ }定义的一段代码,可分为:普通代码块,构造块,静态块,同步代码块
2.代码示例:

class Person6{
    private String name;//实例成员变量
    private int age;
    private String sex;
    private static int count=0;

    public Person6() {
        System.out.println("I am Person init()!");
    }
    //实例代码块
    {
        this.name="bit";
        this.age=18;
        this.sex="女";
        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 TestDemo4 {
        public static void main(String[] args) {
            //直接使用{}定义,普通代码块
            Person6 person6=new Person6();
        }
    }

执行结果:I am static init()!
I am instance init()!
I am Person init()!
3.注意事项:(1)静态代码块不管生成多少个对象,其只会执行一次
(2)先执行静态代码块,然后执行实例代码块(构造块),再然后是构造函数执行。
4.匿名对象:(1)没有引用的对象(2)只能在创建对象时使用

public static void main(String[] args){
     new Person("bit",18,"女").show();//通过匿名对象调用方法
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java初阶---类和对象 的相关文章

  • Unity之四:辅助脚本

    文章目录 一 朋友的友情帮助 1 1 generate test runner rb 1 2 generate test runner rb接受的选项 1 2 1 includes 1 2 2 suite setup 1 2 3 suite
  • IPV6工作手册

    1 监测当前是否是IPV6网络环境 浏览器访问 http test ipv6 com 2 切换当前电脑到IPV6网络 Mac电脑 3 监测目标网站是否支持IPV6 可使用 国家IPV6发展监测平台 的检测工具 https www china
  • python爬虫学习笔记-SQL学习

    Sql概述 先来看一个例子 小王第一次使用数据库 然后跟数据库来了个隔空对话 其实 我们想一想 mysql是一个软件 它有它自己一套的管理规则 我们想要跟它打交道 就必须遵守它的规则 如果我想获取数据 它自己有一套规则 这个规则就是SQL
  • 【预测 - 00】概述:时间序列、特征设计+回归模型(持续更新...)

    前言 预测 一个很神秘的词语 根据历史信息并按照一定的方法对未来进行测算 时间序列 特征设计 回归 等是预测领域的常用方法 我是预测领域的一名新手 6月份因实习需求 刚接触领域领域 以 边学边实践 的方式推动着进度 8月底实习期结束 返校后
  • 【JAVA】 String 方法附件

    个人主页 个人主页 系列专栏 初识JAVA 文章目录 String 方法 String 方法 char charAt int index 返回指定索引处的 char 值 int compareTo Object o 把这个字符串和另一个对象
  • 详解ReentrantLock---可重入锁(小白易懂)

    详解ReentrantLock 小白易懂 初识ReentrantLock ReentrantLock是可重入的互斥锁 虽然具有与synchronized相同功能 但是会比synchronized更加灵活 具有更多的方法 ReentrantL
  • linux网卡bond模式检查,linux 查看bond状态

    SCC 超级计算集群 简介 SCC概述 超级计算集群 Super Computing Cluster SCC 使用高速RDMA网络互联的CPU以及GPU等异构加速设备 面向高性能计算 人工智能 机器学习 科学 工程计算 数据分析 音视频处理
  • Keil MDK5勾选Reset and Run下载固件仍然不自动运行的解决办法

    解决方法 把pack里面的ENABLE 取消掉就好了
  • 一个测试工程师的七年感悟——致在一路独行的你(别放弃)

    前言 不知不觉在软件测试行业 摸爬滚打了7年之久 这一路上也留下了许许多多令我难以忘记的故事 有刚入行时的迷茫 有学习技术路上踩过的坑 有做项目连夜敲代码的悲情也有迎来项目成功上线的欢愉 有太多太多值得铭记的瞬间 这一切只源于我走了测试这条
  • Open Judge 1.4 09

    09 判断能否被3 5 7整除 总时间限制 1000ms 内存限制 65536kB 描述 给定一个整数 判断它能否被3 5 7整除 并输出以下信息 1 能同时被3 5 7整除 直接输出3 5 7 每个数中间一个空格 2 只能被其中两个数整除
  • ​金蝶云星空管理中心反序列化RCE漏洞复现 附POC

    文章目录 金蝶云星空管理中心反序列化RCE漏洞复现 0x01 前言 0x02 漏洞描述 0x03 影响范围 0x04 漏洞环境 0x05 漏洞复现 1 访问漏洞环境 2 构造POC 3 复现 4 进行ipconfig命令测试 0x06修复建
  • 一些好的博客或者论坛,可以经常浏览

    1 博客 果冻想 常用一些技术的总结和系列化的学习 http www jellythink com 2 类似博客 mikewootc的分享空间 首页 http www mikewootc com wiki net protocol rtsp
  • UVa 11464 Even Parity 题解

    这是一道白书17页的题目 题目大意 输入一个n n的01矩阵 1
  • java 远程调试 端口_JAVA远程调试

    1 远程端启动必须添加jvm参数 Xdebug Xrunjdwp transport dt socket suspend n server y address debug port 其中debug port为自定义的调试端口 2 本地连接远
  • 短沟道效应 & 窄宽度效应 short channel effects & narrow width effects

    文章目录 1 概念 Narrow Width Effect 窄宽度效应 Short Channel effects 短沟道效应 阈值电压 Threshold voltage 2 阈值电压与沟道长和沟道宽的关系 Narrow channel
  • ATT&CK实战系列——红队实战(一)完整版

    前言 今天有大佬位推荐了这个靶场 然后就去了解了一下非常贴近实战 下载开干 靶场的描述 红队实战系列 主要以真实企业环境为实例搭建一系列靶场 通过练习 视频教程 博客三位一体学习 另外本次实战完全模拟ATT CK攻击链路进行搭建 开成完整闭
  • linux的jstack,jmap命令的正确安装附详细教程

    先执行命令 yum list showduplicate su root yum list showduplicate grep i java yum install java 11 openjdk devel x86 64 y jstac
  • 吃货联盟订餐系统项目----面向对象思路

    吃货联盟订餐系统项目 面向对象思路 思路 首先可以划分出四个类 菜单类 订单类 饭店类 测试类 菜单类中 需要用到菜单编号 菜单名称 菜单价格 点赞数四个属性 并根据这些属性创建一个带参构造以及getter setter方法 订单类中 需要
  • 生命在于折腾——SQL注入的实操(三)less11-15

    一 实操环境 1 操作系统 VMware虚拟机创建的win10系统 内存8GB 硬盘255GB 处理器AMD Ryzen 9 5900HX 2 操作项目 sql lib项目 本篇文章介绍关卡11 15 3 工具版本 phpstudy 8 1
  • 什么是node,node怎么用?

    Node js 是一个基于Chrome V8 引擎的JavaScript运行环境 Node js使用了一个事件驱动 非阻塞式I O的模型 使其轻量又高效 事件驱动 任务执行 发布者 订阅者 事件驱动 on emit 非阻塞 执行某一个任务的

随机推荐

  • 2021斯坦福CS224N课程笔记~3

    3 神经网络学习 手工计算梯度 Lecture 3 Neural net learning Gradients by hand matrix calculus and algorithmically the backpropagation
  • git拉取和推送如何指定远程服务器的ssh端口

    家里弄了个嵌入式服务器 里面安装了git 申请了动态公网ip 上行速度40Mbps 可比国内的服务器带宽大多了 所以要好好利用起来 但是由于是动态公网ip 因此做了端口映射 指定端口9999到嵌入式服务器的22端口 如何让git push
  • 劢领AT

    劢领AT 五分钟 一条指令设置WIFI模块直接连接MQTT服务器或者阿里云物联网平台 超级指令诞生缘由 超级指令详解 一 阿里云物联网套件超级指令 AT SAC 1 指令说明 2 指令示例 二 MQTT服务器超级指令 AT SMC 1 指令
  • Visual C++ 内存泄露检测工具(VLD)

    一 内存泄漏 1 什么是内存泄露 由于疏忽或者错误 异常安全 导致程序未能释放已经不再使用的内存的情况 内存泄露并非是指内存在物理上的消失 而是指程序失去了对该内存的控制 导致的资源浪费 2 内存泄露的分类 a 堆内存泄露 Heap Lea
  • vs静态编译解决找不到msvcp140.dll问题

    问题描述 win10中vs2015编写的程序生成release版本 拷贝到win7中运行 出现找不到msvcp140 dll问题 解决方法 将程序进行静态编译 1 使用release模式编译 2 项目属性中 C C 代码生成 中的运行库改为
  • CSS笔试题整合---不断更新

    第一套 50题 1 那个HTML5元素用于显示已知范围内的标量测量 D A
  • 大数据究竟是什么?一文让你认识并读懂大数据

    2017年 大数据已经从概念走向落地 2019年 中低端IT工程师紧随浪潮加速向大数据转型 企业对大数据人才争夺直接进入白热化阶段 因此 对于想学IT技术的人而言 我建议 直接选择学习大数据技术是符合潮流和就业需求的选择 一 大数据的意义
  • 使用JAVA控制AD域进行基本的操作详解

    前段时间 我接到了一个新任务 使用JAVA控制AD域进行基本的操作 经几天摸索也看来多位博友的代码 现在摸索出了一套较为详细的Java操控AD域的方法 废话不多说 现进入正题 一 安装域控服务器 什么是域控服务器我就不多说了 请各位自行百度
  • python copy()和deepcopy()解释(import copy)

    对于简单的 object 用 shallow copy 和 deep copy 没区别 复杂的 object 如 list 中套着 list 的情况 shallow copy 中的 子list 并未从原 object 真的 独立 出来 也就
  • 英语 面包为什么不可数?

    接下来我就来解释一下 因为首先面包的形态多种多样 不同的人就有不同的做法 有时候依据面包的形态很难界定面包到底是多少 个 其次面包通常不能直接出售 都要有包装的保护 同理 像蛋糕 巧克力 家具等 它们可以由创造者自由塑形 量化 又往往成一定
  • 金融区块链基础设施(浅析)

    想知道更多更多关于区块链技术知识 请百度 链客区块链技术问答社区 链客 有问必答 Optherium Labs是一家全球金融科技公司和区块链即服务提供商 是Linux Hyperledger和Crypto Valley基金会的成员 在欧盟获
  • SpringBoot使用Nacos动态配置数据源

    SpringBoot SpringCloud项目部署运行后 如果使用硬编码方式定义数据源 那么如果需要更换数据库 就只能通过更改源码并重启的方式来达成目的 而SpringCloud生态中有配置中心这一组件 我们可以将数据源连接属性编写在配置
  • centos7修改语言环境($LANG)

    文章目录 1 问题 2 系统环境 3 解决方案 1 问题 安装centos7系统时 我默认选择的是LANG zh CN UTF 8 在执行各种命令后 英文中掺杂的中文显得有点格格不入 于是我想要将语言环境改成全英文的 2 系统环境 root
  • vue(9):自定义指令

    自定义指令 除了默认设置的核心指令 v model 和 v show Vue 也允许注册自定义指令 示例 注册一个全局指令 v focus 该指令的功能是在页面加载时 元素获得焦点 div p 请输入 p div
  • Java8 Stream 之sorted方法 排序讲解

    本文主要讲解 Java 8 Stream之sorted 排序示例 使用java 8 的流式sorted排序List集合 Stream sorted 字段排序 功能说明 以自然序或着自定义Comparator 接口排序规则来排序一个流 功能详
  • Vue组件化开发

    一 组件基础 1 组件介绍 组件 是一个独立显示的视图单元 在构建大型应用时 我们通常会把可复用性强的部分 例如 头部导航 侧边栏等需要在多个页面展示的部分 提取出来 最终组合成一个完整的页面 在vue中 组件是可复用的vue实例 2 组件
  • SVG: draw text

  • 对比学习系列(二)---MoCo 系列

    MoCo 系列 文章目录 MoCo 系列 自监督 MoCo V1 前言 动量对比 Dictionary as a queue Momentum update 代理任务 Shuffling BN 实验 MoCo V2 MoCo V3 参考 自
  • Proteus 8.9原理图转换为PCB图

    Proteus 8 9原理图转换为PCB图 1 点击PCB设计图标 2 定义边界 在Board Edge图层建立矩形 此矩形内放置所有元器件 3 选用自动布局 Auto Placer 勾选所有器件 也可手动布置 没有的元器件封装可以重新选择
  • java初阶---类和对象

    一 类和类的实例化 1 类就是一类对象的统称 对象就是这一类具体化的一个实例 一个类可以实例化无数个对象 2 声明一个类就是创建一个新的数据类型 而类在java中属于引用类型 java使用关键字class来声明类 3 基本语法 创建类 cl