什么是类,对象?
类(class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。
类的更严格的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被称为该类的实例。类有接口和结构。接口描述了如何通过方法与类及其实例互操作,而结构描述了一个实例中数据如何划分为多个属性。类是与某个层[1]的对象的最具体的类型。类还可以有运行时表示形式(元对象),它为操作与类相关的元数据提供了运行时支持。
支持类的编程语言在支持与类相关的各种特性方面都多多少少有一些微妙的差异。大多数都支持不同形式的类继承。许多语言还支持提供封装性的特性,比如访问修饰符。类的出现,为面向对象编程的三个最重要的特性(封装性,继承性,多态性),提供了实现的手段。
类中的成分
- 成员变量
- 构造器
- 方法
- 代码块
- 内部类/枚举/接口
类的定义
[访问修饰符] class 类名
{
零到多个构造器定义
零到多个Field定义
零到多个方法
}
1.什么是构造器?
1.使用构造器目的是为了创建一个类的实例。这个过程也可以在创建一个对象的时候用到:Person p1 = new Person();
2.构造器可以用来在初始化对象时初始化数据成员,一个类可以有多个构造器。一个类的构造器的名称必须与该类的名称一致。要退出构
造,可以使用返回语句“return;”。
2.怎么定义Field?
1.field的意思是“字段”,这里可以理解成变量
定义Field语法如下
[修饰符] Field类型 Field名 [=默认值];
3.怎么定义方法?
[修饰符] 方法返回值 方法名 (形参列表)
{
//可执行语句
}
class Person//默认为 private
{
String name;
int age;//默认protected
private int numbers;
private int stucode;
public void say(String content)
{
System.out.println(content);
}
}
Java内存分配
1.图示
2.详解:
(以下为部分引用文章,原链接点此)
Java内存管理涉及到一下部分
◆寄存器:我们在程序中无法控制
◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
◆堆:存放用new产生的数据
◆静态域:存放在对象中用static定义的静态成员
◆常量池:存放常量
◆非RAM存储:硬盘等永久存储空间
Java内存分配中的堆
堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是 为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。
引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。
实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!
常量池 (constant pool)
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:
虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。
对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引 用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。
在程序执行的时候,常量池 会储存在Method Area,而不是堆中。
堆与栈
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、 anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存 大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态 分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是 确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和对象句柄(引用)。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令 a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响 到b的值。
要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
示例
1.创建对象时候栈中的变量如何指向堆的空间
//测试创建对象时候,指定堆中的空间
class A
{
private int age;
private String name;
public void setab(int a,String b)//设置ab的值
{
age=a;
name=b;
System.out.println("赋值成功");
}
public void show()//输出接口
{
System.out.print("age= "+age);
System.out.print("name= "+name);
System.out.println();
}
}
public class ConstTest
{
public static void main(String[] agrs)
{
A one=new A();
one.setab(100,"YaoMing");
one.show();//
A two=one;//把one中存储的(堆中)对象的空间地址赋予two,所以两个都指向同一个空间
two.show();
}
/*输出:
赋值成功
age= 100name= YaoMing//这个是one指向的空间
age= 100name= YaoMing//这个是two指向的空间,都是同一个空间
*/
}
分享到:
相关推荐
### Java基础知识笔记详细版-菜鸟翻阅必备 #### 一、Java概述 1. **Java语言发展史**: - Java由Sun Microsystems公司于1995年推出。 - 最初由James Gosling领导的设计团队开发,目标是用于家用电器的编程。 - ...
类是Java面向对象编程的基础,它定义了对象的属性和行为。对象是类的实例,通过创建对象来使用类的功能。 接着,深入学习Java的面向对象特性,如封装、继承和多态。封装是将数据和操作数据的方法打包在一起,以保护...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。它的设计目标是简洁、通用,并且能够适应互联网环境。本教程非常适合初学者,旨在帮助你从零开始掌握Java编程...
- **定义:** Python是一种支持面向对象的解释型高级编程语言,由Guido van Rossum在1991年首次发布。 - **特性:** - **简单而强大**:Python因其简洁的语法和强大的功能而受到广泛好评。 - **跨平台性**:Python...
Java是一种面向对象的、高性能的编程语言,由Sun Microsystems(现为Oracle公司)开发,其设计目标是“一次编写,到处运行”。Java的特点包括平台独立性(通过Java虚拟机JVM实现)、严格的类型检查和垃圾回收机制。...
3. **6、JavaSE:面向对象.pdf**:这是关于Java面向对象编程的章节,涵盖类、对象、继承、多态、封装等核心概念。 4. **18、前端:JavaScript、jQuery.pdf**:虽然主要讨论Java,但这个部分也涉及到了前端开发,...
2. **类与对象**:Java是一种面向对象的语言,理解类的定义、对象的创建与销毁、封装、继承、多态等概念至关重要。 3. **集合框架**:如ArrayList、LinkedList、HashSet、HashMap等,它们提供了存储和管理数据的...
在Java中,类是面向对象编程的基本单位,它定义了对象的属性和行为。一个类可以包含多个方法和字段,通过实例化类来创建对象。以下是对类的基本操作的解析: **编写并运行第一个Java程序** 在给定内容中,提供了一...
Java是一种广泛使用的面向对象编程语言,它因“一次编写,到处运行”的特性而闻名。Java语言的核心概念包括面向对象的设计、语法结构、运行环境以及标准类库。本教程旨在为初学者提供全面的Java基础知识,让学习者...
【Python简介】 Python是一种高级编程语言,以其简洁明了的语法和...对于初学者来说,这些概念构成了Python编程的基础,为进一步学习Python的高级特性,如面向对象编程、异常处理、文件操作、函数式编程等奠定了基础。
Mapper接口的实现由MyBatis动态生成,提供了一种面向对象的方式来操作数据库。 4. **基本的增删改查操作**:MyBatis提供了简单的API来支持常见的CRUD操作,如`insert()`, `update()`, `delete()`, `select()`,并能...
Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能闻名。这份笔记涵盖了Spring的核心概念和技术,包括IOC(Inverse of Control,控制反转)、DI(Dependency Injection...