Java 类和对象简介
类是对象的抽象,是一组具有相同特性(属性,事物的状态信息)和行为(事物能做什么)的事物的集合,可以看做一类事物的模板。
对象是类的实例化,是具体的事物。
比如:人类和具体的人、厨师类和具体的厨师。
类的定义
/*** 类定义*/
权限修饰符 其他修饰符 class 类名 {成员变量;初始化代码块;构造方法;成员方法;
}
权限修饰符 :public
、protected
(内部类时)、默认缺省、private
(内部类时)。
其他修饰符:final
(最终类,不可继承)、abstract
(抽象类)、static
(内部类)。
成员变量
- 类变量 / 静态变量
使用 static
关键字修饰,类本身具有的属性,不依赖具体的实例对象,有默认值(参考数组)。
类的内部可以直接访问,外部可以通过类名访问(<类名>.<类变量名>)。
类变量在类加载时进行初始化,只有一份数据,即类的所有实例对象共享类变量。
public class Test1 {public static void main(String[] args) {System.out.println(Human.POPULATION); // 默认值 0}
}class Human {public static int POPULATION;
}
- 实例变量
实例对象具有的属性,依赖具体的实例,有默认值(参考数组)。
在类的内部可以直接访问,和局部变量存在命名冲突时,适用就近原则,此时可以通过 this.实例变量名
访问,外部可以通过实例对象访问(<实例名>.<实例变量名>)。
实例变量在创建实例对象时进行初始化,每个对象都有自己的实例数据。
this
:指代当前实例对象,可以通过 this 访问属性、成员方法、构造方法,还能作为参数传递给其他方法。
public class Test1 {public static void main(String[] args) {System.out.println(Human.POPULATION); // 默认值 0Human human = new Human();System.out.println(human.POPULATION); // 实际会转为通过类 Human 访问System.out.println(human.age); // 默认值 0}
}class Human {public static int POPULATION;public int age;
}
- 成员变量和局部变量
成员变量定义在类上,局部变量定义在方法或代码块中。
默认值:成员变量有默认值,局部变量没有默认值。
作用域:成员变量的作用域是类,局部变量的作用域是定义的方法或代码块内部。
初始化代码块
- 静态初始化代码块
用于静态变量的初始化,类加载时执行。
public static int POPULATION;static {POPULATION = 100;
}
- 实例初始化代码块
创建实例对象时执行的代码块,主要用于实例变量的初始化,在构造方法之前执行。
public int age;{age = 20;
}
成员方法
- 类方法 / 静态方法
使用 static
关键字修饰,类本身具有的行为,不依赖具体的实例,可以通过类名调用((<类名>.<类方法名>)),不能访问实例成员,只能访问静态成员。
public class Human {public static int POPULATION;public int age;public static void test1(){System.out.println(POPULATION); // 不能直接访问实例变量 age}
}
- 实例方法
实例对象具有的行为,依赖具体的实例,只能通过实例对象调用(<实例名>.<实例方法名>),可以访问静态成员和实例成员,对静态成员的访问实际会转为通过类访问。
实例方法中有一个隐含的参数,就是 this
,指向当前调用方法的对象实例。
public class Human {public static int POPULATION;public int age;public static void test1(){System.out.println(POPULATION); // 不能直接访问实例变量 age}public void test2(){System.out.println(POPULATION);}
}
构造方法
修饰符 类名作构造方法名(){// 无参构造方法
}修饰符 类名作构造方法名(参数列表){this.属性名 = 参数;
}
构造方法用于创建对象时初始化实例对象属性,调用构造方法不代表会生成对象。
构造方法名与类名相同,没有返回值类型声明,可重载。
构造方法中可以使用 this(...)
调用其他的构造方法,但必须在第一行调用,这是为了避免误操作,先调别的,然后根据情况自己再做调整。
- 无参构造方法
默认构造方法,如果类没有显式声明构造方法,编译时会自动生成一个无参的构造方法,如果有显式声明,则不会自动生成无参构造方法。
- 有参构造方法
// 无参构造方法
public Human(){this(null,0); // 可以通过 this 调用其他构造方法
}// 有参构造方法
public Human(String name,int age){this.name = name; // 此处 this 指代当前对象this.age = age;
}
⭐对象创建
通过关键字 new
调用类的构造方法创建对象。
public static void main(String[] args){Human human = new Human("王炸",25);
}
类加载过程
类的加载是指 JVM 将类的相关信息加载到方法区内存,为这个类分配一块空间,存储类的定义、成员变量和方法信息,并对静态变量赋初始值。
在 Java 中,类是动态加载的,当第一次通过 new 创建一个类的对象时,或者第一次直接通过类名访问类变量或类方法时,才会加载该类,加载一个类时会查看其父类是否已加载,如果没有,则还会加载其父类。
类加载进内存后,一般不会释放,直到程序结束,所以静态变量在内存中只有一份。
1)分配内存(方法区内存)保存类的信息(成员变量、成员方法、初始化代码、父类信息引用);
2)给类变量赋默认值;
3)加载父类,设置父子关系;
4)执行类初始化代码,先初始化父类部分。
对象创建过程
当通过 new 创建一个对象的时候,对象产生,在堆内存中,会存储这个对象的实例值,每做一次 new 操作,就会产生一个对象。
每个对象除了保存实例变量的值外,还保存着对应类型即类的地址,这样,通过对象就能知道它的类,访问到类的信息。
1)分配内存保存对象信息(堆内存);
2)对所有实例变量赋默认值;
3)执行实例初始化代码,先初始化父类部分。
对象内存分析
human 在内存中大概如图所示,new 出来的对象实际在堆内存中,栈内存中的变量 human 存储的是对象在堆内存中的 地址。
当没有变量引用 0x1234 指向的对象时,该对象将等待垃圾回收机制处理,具体释放时间由 JVM 决定。
参考:《Java 编程的逻辑》 马俊昌
Java 类和对象简介相关推荐
- java类与对象_Java类与对象
类与对象 1,面向对象编程简介 Java语言最大的特点在于面向对象的编程设计,并且面向对象的编程设计也在由于Java自身的发展而不断发展.面向过程编程(C语言).函数式编程(Scala).面向对象编程 ...
- 【Java类和对象】
Java类和对象 在Java简介中就有介绍到,Java是一门面向对象的编程语言,在面向对象的编程语言中,肯定离不开对象这个概念,而对象则是类的实例,所以也肯定离不开类这个概念.简单的来说就是,在Jav ...
- 解析 Java 类和对象的初始化过程
跳转到主要内容 中国 [ 选择 ] dW 全部内容-------------- AIX and UNIX Info Mgmt Lotus Rational WebSphere-------- ...
- Java 类与对象以及接口
最近博主学习了Java中的基础内容:类.对象以及继承,今天我们来谈谈这方面内容. 导航 Java--面向对象的语言 一.类与对象简介 1.什么是对象?什么是类? 2.Java中的类与对象 ·定义类 · ...
- java类与对象实验_JAVA类与对象实验报告
<JAVA类与对象实验报告>由会员分享,可在线阅读,更多相关<JAVA类与对象实验报告(6页珍藏版)>请在人人文库网上搜索. 1.面向对象程序设计实验报告实验三.类与对象(1) ...
- 杨校老师课堂之Java类与对象、封装、构造方法
杨校老师课堂之Java类与对象.封装.构造方法 本篇文章内容如下: 面向对象 类与对象 三大特征--封装 构造方法 教学目标 能够理解面向对象的思想 能够明确类与对象关系 能够掌握类的定义格式 能够掌 ...
- 从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?
转载自 从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的? 先回顾一下Java程序执行的过程: Java程序执行时,第一步系统创建虚拟机进程,然后虚拟器用类加载器Class Loade ...
- java类和对象程序_Java类与对象程序设计基础
Java类与对象程序设计基础 一.实验目的: 通过编制一个独立应用程序,使得学生掌握Java的系统所提供类的引用方法:通过编制一个完整的应用程序,使得学生对Java的应用程序的基本构成和基本算法熟练掌 ...
- java类与对象 演练 查找并修改姓名
java类与对象 演练 查找并修改姓名 视频 https://www.ixigua.com/i6870489659168784903/ 思路 先定义一个类 类中有一个名字数组 提前给这个数组一些默认值 ...
最新文章
- 一举打败16个同类模型,视频超分比赛冠军算法入选CVPR 2022,来自商汤南洋理工大学...
- 配置Bean的作用域对象
- python中类变量的访问方式_在Python中,如何访问类方法中的“静态”类变量
- 【转】 JMeter学习(二十四)linux启动jmeter,执行./jmeter.sh报错解决方法
- 想做数据化转型,为什么必须要上企业级BI?
- dll修改和EXCOPE
- VB6(Fast Report Studio 4.6.80)
- Andorid音频工具tinymix,tinyplay,tinycap使用
- 从极客到 CEO,开发者应该如何提升技术领导力?
- uc浏览器hd for android pad,UC浏览器hd
- 连接服务器报错No supported authentication methods available
- 相机对焦和调焦距的区别是什么 ?
- 【iOS】越狱入门梳理
- 程序员撩妹专用~~~好看的H5立方体创意相册,资源免费!!!程序员送给女孩子的礼物,非常适合送给小姐姐!
- Word2019中Visio对象图片插入题注时自动删除标签与编号前的空格,编号后添加空格
- php 图片生成视频,PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法
- 【DSP】CCS3.3安装教程
- NLP自然语言处理之情感分析分析讲解、知识构建
- 四旋翼飞行器控制pid学习笔记
- scala获取字符串首字符和尾字符
热门文章
- 主动式防火墙fail2ban
- 单板计算机Beaglebone-Black首发上手体验
- 1533. N叉树的层序遍历
- 《单身狗重复文件清理软件v1》使用说明 和 软件下载
- Matplotlib科研画图.cmap颜色反转
- 大数据必学Java基础(四十):面向对象三大特性之一继承(Inheritance)
- 【独行秀才】macOS Big Sur 11.2.2 (20D80))原版CDR镜像
- 小学如何开展创客的教育
- 从一碗面条到一碗浆糊,再到哪里?
- 图神经网络17-DGL实战:节点分类/回归