Java构造方法与创建对象

您所在的位置:网站首页 怎么调用构造方法 Java构造方法与创建对象

Java构造方法与创建对象

2024-03-08 00:12| 来源: 网络整理| 查看: 265

上一篇文章:Java之面向对象编程

本篇目录 构造方法与创建对象创建对象的时候系统都做了什么对象 下一篇文章

构造方法与创建对象 构造方法是class类中特殊的方法使用类创建对象时,需要用到它的构造方法class类中构造方法的名字必须和class类的名字保持一致构造方法和普通的方法相比,构造方法没有类型,没有类型也就意味着构造方法不能有返回值一个class类中,如果没有自定义构造方法,那么该类会有一个默认的构造方法;如果用户自定义了构造方法,那么就不会有默认的构造方法默认的构造方法中没有任何参数,方法体中没有任何语句一个class类中可以有多个构造方法,但是每个构造方法的参数和参数类型应当有差别,以此来辨别不同的构造方法创建对象时,先声明对象,然后用new运算符和类的构造方法为声明的对象分配变量。类中没有自定义的构造方法时,使用默认的构造方法;有一个或多个构造方法时,使用指定的构造方法

默认的构造方法:

import java.util.Scanner; class Factorial { long factorial(int n){ //这是一个普通的求阶乘的方法 long fact = 1; for(int i = 1; i public static void main(String args[]){ Scanner input; //声明一个Scanner类的对象input input = new Scanner(System.in); //为input分配变量,使用new和构造方法 Factorial a = new Factorial(); //声明Factorial类的对象a,并使用new运算符和默认构造方法Factorial()分配变量 int n = input.nextInt(); System.out.println(a.factorial(n)); } }

自定义构造方法:

class Area { int a, b, area; int x, y; Area(){ //自定义的构造方法 area = a * b; } Area(int a, int b){ //自定义的构造方法,同一个类里的不同构造方法参数应当有所差异 x = a; y = b; } } //类中有了自定义的构造方法,则不会再有默认的构造方法 public class Example { public static void main(String args[]){ Area a1, a2; //声明两个Area类的对象 a1 = new Area(); //为 a1 分配变量 a2 = new Area(3, 4); //为 a2 分配变量 使用new 和类中的构造方法 } } 创建对象的时候系统都做了什么

首先是声明变量,声明变量的时候因为并没有对其进行初始化,所以这个对象是一个空对象,Area a1, a2;这里声明了两个a1、a2,是两个空对象(null)。当系统碰到new Area();语句 和 new Area(3, 4);语句时,就会以Area类中的成员变量为模板分配相应的内存,即成员变量a、b、area、x、y都会被分配内存空间,且分配了两份内存空间,因为是a1、a2两个对象,并为成员变量赋初值,如果是整型就赋值0;如果是浮点型就赋初值0.0;如果是boolean型,就赋初值false;如果是引用型,就赋初值null(Java中没有指针,所谓引用就相当于C语言的指针)。为成员变量分配内存空间并赋初值,计算两个十六进制的引用值,将两个引用值分别赋给a1和a2,这时a1、a2都会拥有一组自己的成员变量,这里的成员变量a、b、area、x、y被称为a1和a2各自的实体。当这一系列操作都完成之后,才会执行相应构造方法体中的语句。为了简洁起见,声明变量和初始化一般写在一起Area a1 = new Area();、Area a2 = new Area(3,4);。 在这里插入图片描述 补充:new是一个运算符,它只能和类的构造方法放在一起,运算的结果是一个引用,即new Area()这个表达式整体值是一个引用。new运算符在得到这个引用之前会为类中的成员变量分配内存空间,计算得到引用并将其赋值给对象时,对象才算是创建成功。new这个关键字在Java中往往都与开辟内存空间有关,类的实体存放在堆heap中,引用存放在栈stack中,堆和栈都是RAM(Random-Access Memory)中的,这个就稍微涉及一点硬件领域,我觉得如果说对计算机非常感兴趣的话,不仅仅要会软件,硬件也要稍微懂一些。静态数据一般存储在固定的内存位置,就像C语言中的字符串常量就是静态数据;动态数据往往存放在堆中,就像C语言中的动态数组。C语言中局部数据对象、函数的参数以及调用函数和被调用函数的联系放在称为栈的内存池中。在C语言中都是程序员我们自己调用相关动态存储分配函数来使用堆内存的;在Java中,Java会自动管理栈和堆,程序员不能直接地设置堆或栈,栈的优势是存取速度快,缺点是存在栈中的数据大小与生存周期必须是确定的,缺乏灵活性,堆的优势是可以动态地分配内存大小,生存周期也不必事先告诉编译器,Java的垃圾收集器会自动收走不再使用的数据,缺点是由于要在运行时动态分配内存,存取速度较慢。Java的内核和JVM虚拟机应该都是用C或C++写的,Java的这些功能都是设定好的。

对象 创建的对象就像一个主语,生活中一件事情、一个动作往往都是有主语的,即由谁去执行这个动作或事情,对象.变量,对象.方法就是对象的使用。而Java中的类具有封装性,体现的就是将数据和对数据的操作封装在一起,作为一个模板,以这个模板就可以创建同一类的对象即一个个主体,这些由同一个模板创建的对象具有共同的属性,是属于同一类的对象的引用:就像上面的那个图中的,对象的引用都指向该对象的实体匿名对象:new Area()本身计算得到的结果就是一个对象的引用,这个引用是指向其对应的实体的,这个引用就是一个匿名的对象,因为它只有一个引用,并没有把这个引用赋值给一个具体的对象变量名,下图就是直接输出一个匿名对象当中的实体数值new Area().pi: 在这里插入图片描述在实际的编程中应当避免使用匿名对象和没有初始化的空对象同一类的对象可以相互赋值,因为同一类的对象它们所拥有的实体的类型是一样的。假如对象a1和a2是同一类的对象,它们有着不同的引用,即它们指向各自不同的实体,当我使用赋值语句a1 = a2;时,其实是将a2的引用赋值给了a1,这样a1和a2就指向共同的实体数据,而原来的a1的实体的内存空间并没有被立即释放,因为Java是有一个垃圾回收机制的,已经不用的实体数据会被回收,进行周期性的检测,如果一段时间内没有对象再次引用这些实体数据,那么它们的内存空间将会被释放;如果一段时间内再次有对象引用这些实体数据,那么该对象的引用会指向这些实体数据,可以再次利用。和C语言相比这就是一个优势,因为C语言没有垃圾回收机制,不用的内存空间需要程序员手动释放,如果没有及时释放,可能还会导致内存空间被占满导致死机的状况。我们程序员可以使用System.gc()提醒Java虚拟机进行垃圾回收,我看了一些地方和书籍上的说法是立即回收,但也是不一定的,这个还有待我日后具体的操作考证,很多博主也说了这个问题,具体怎样还是要自行扩展与实践才能知道 下一篇文章

Java程序的构成



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3