java创建两个foo方法_Java类实例化原理 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...

Java对象的创建过程包括类初始化(类实例化两个阶段。

一、Java对象创建时机

(1)使用new关键字创建对象

(2)反射创建对象

使用Class类的newInstance方法

Student student2 = (Student)Class.forName("Student类全限定名").newInstance();

使用Constructor类的newInstance方法

Constructor constructor = Student.class.getConstructor(Integer.class);

Student stu3 = constructor.newInstance(123);

(3)使用Clone方法创建对象(实现Cloneable接口)

无论何时我们调用一个对象的clone方法,JVM都会帮我们创建一个新的、一样的对象,特别需要说明的是,用clone方法创建对象的过程中并不会调用任何构造函数。

(4)使用(反)序列化机制创建对象(实现Serializable接口)

当我们反序列化一个对象时,JVM会给我们创建一个单独的对象,在此过程中,JVM并不会调用任何构造函数。

二. Java 对象的创建过程

当一个对象被创建时,虚拟机就会为其分配内存来存放对象自己的实例变量及其从父类继承过来的实例变量(即使这些从超类继承过来的实例变量有可能被隐藏也会被分配空间)。

在为这些实例变量分配内存的同时,这些实例变量也会被赋予默认值(零值)。

主要涉及三种执行对象初始化的结构,分别是实例变量初始化、实例代码块初始化、构造函数初始化。

编译器构造类的构造函数()(按顺序执行):

父类构造器

实例变量初始化和实例代码块初始化相关代码

本身构造函数

1、实例变量初始化和实例代码块初始化按照编程顺序来执行,不允许顺序靠前的实例代码块访问其后面定义的实例变量,但是可以赋值。

//编译错误:代码块不可以访问其后定义的实例变量

public classInstanceInitializer {

{

j=i;

}private int i = 1;private intj;

}//没问题:代码块可以赋值其后定义的实例变量

public classInstanceInitializer {

{

j= 1;

}private int i = 1;private intj;

}

2、每一个Java中的对象都至少会有一个构造函数,如果我们没有显式定义构造函数,那么它将会有一个默认无参的构造函数。

Java强制要求所有对象(Object是Java的顶层对象,没有超类)构造函数的第一条语句必须是超类构造函数的调用语句或者是类中定义的其他的构造函数(super()/this()必须在第一句,且不能同时出现)。如果我们既没有调用其他的构造函数,也没有显式调用超类的构造函数,那么编译器会为我们自动生成一个对超类构造函数的调用

3、实例化一个类的对象的过程是一个典型的递归过程。

首先实例化Object类,再依次对以下各类进行实例化,直到完成对目标类的实例化。

三、综合实例

//父类

classFoo {int i = 1;

Foo() {

System.out.println(i);//-----------(1)

int x =getValue();

System.out.println(x);//-----------(2)

}

{

i= 2;

}protected intgetValue() {returni;

}

}//子类

class Bar extendsFoo {int j = 1;

Bar() {

j= 2;

}

{

j= 3;

}

@Overrideprotected intgetValue() {returnj;

}

}public classConstructorExample {public static voidmain(String... args) {

Bar bar= newBar();

System.out.println(bar.getValue());//-----------(3)

}

}/** Output: 2 0 2*/

//Foo类构造函数的等价变换:

Foo() {

i= 1;

i= 2;

System.out.println(i);int x = getValue();// 在执行Foo的构造函数的过程中,由于Bar重载了Foo中的getValue方法,所以其调用的是Bar的getValue方法

System.out.println(x);

}//Bar类构造函数的等价变换

Bar() {

Foo();

j= 1;

j= 3;

j= 2}

参考资料:

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

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

相关文章

java学习(136):带泛型的类

SuppressWarnings("all") public class GJClass<T> {public String getClassName(T t){return t.getClass().getName();} } 测试类 public class test76 {public static void main(String[] args){GJClass gjClassnew GJClass();String classNamegjClass.get…

如何往eclipse中导入maven项目

现在公司中大部分项目可能都是使用maven来构建&#xff0c;假如现在摆在你面前有一个maven的项目&#xff0c;如果你要学习它&#xff0c;如何将它导入到像eclipse这样的集成开发工具中呢&#xff0c;以项目public_class_1为例&#xff1a; 1.在eclipse的工作界面的最左侧&…

[Leetcode][JAVA][第912题][排序算法]

【问题描述】 给你一个整数数组 nums&#xff0c;将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]【解答思路】 1.插入排序&#xff08;熟悉&#xff09; 每次将一个数字插入一个有序的数组里&#xff0c;成为一个长度更…

java 调用r语言包传参数_Java与R语言的配置,调用

我是最近才接触到了R语言&#xff0c;所以用起来有很多的问题&#xff0c;之前只是想单纯想用java调用到R语言中的一些东西&#xff0c;没有想到这个事情并不是想象的那么简单的。好了&#xff0c;闲话不多说&#xff0c;下面我来说说我在运用R的时候遇上的问题吧。第一步&…

玩转oracle 11g(42):增加表空间

--查询表空间 select t.tablespace_name, d.file_name, d.autoextensible, d.maxbytes, d.status from dba_tablespaces t, dba_data_files d where t.tablespace_name d.tablespace_name order by tablespace_name.file_name; --增加表空间 AL…

php下载文件添加header响应头

header(Content-type:application/octet-stream);header(Content-Disposition:attachment;filename".basename($file).");header(Content-Length:.filesize($file));readfile($file);转载于:https://www.cnblogs.com/jielin/p/10203140.html

[Leetcode][JAVA][第1111题][栈思想]

【问题描述】 有效括号字符串 定义&#xff1a;对于每个左括号&#xff0c;都能找到与之对应的右括号&#xff0c;反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度 depth 定义&#xff1a;即有效括号字符串嵌套的层数&#xff0c;depth(A) 表示有效括号字符串 A 的嵌…

玩转oracle 11g(43):oracle导出空表

因为11G数据库在CREATE表后数据库不会立刻给该表分配物理存储空间&#xff0c;所以导出数据库的时候自然而然不会导出该表。 解决方案&#xff1a;在导出表服务器上找出所有数据为空的表&#xff0c;批处理的给没有数据行的数据表分配存储空间。 方法1.此为分步骤执行&#x…

分类器交叉验证java_使用交叉验证的KNN分类器

首先&#xff0c;您需要准确定义您的任务 . F.ex给出R ^(MxN)中的图像I&#xff0c;我们希望将I分类为包含面部的图像或没有面部的图像 .我经常使用像素分类器&#xff0c;其任务类似于&#xff1a;对于图像&#xff0c;我决定每个像素是面像素还是非面像素 .定义任务的一个重要…

Python——assert(断言函数)

一、断言函数的作用 python assert断言是声明其布尔值必须为真的判定&#xff0c;如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not&#xff0c;用来测试表示式&#xff0c;其返回值为假&#xff0c;就会触发异常。 二、常用格式 assert 11  assert 222*…

[Leetcode][JAVA][第20题][Stack][Map]

【问题描述】 20. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可…

java学习(137):java异常初识

//java异常初识 public class test78 {public static void main(String[] args) {countArraylength( -1 );}public static int countArraylength(int length) {int[] nums new int[length];return nums.length;} } 运行结果

Java如何随机出石头剪刀布_JAVA编程实现石头剪刀布

我不是焊工import java.util.Scanner;public class Jsb {public static void main(String[] args) {while (true) {result(input(), random());System.out.println("");}}public static int input() {System.out.println("请输入&#xff1a;1-剪刀&#xff0c;…

java学习(138):异常处理

//异常 public class test79 {//定义方法声明定义异常&#xff0c;在满足条件时抛出异常对象&#xff0c;程序转向异常处理public double count(double n,double m)throws Exception {if (m 0) {//如果除数等于0.则抛出异常实例throw new Exception("对不起。除数不能等…

[Java]中[this][super]用法总结

this this是自身的一个对象&#xff0c;代表对象本身&#xff0c;可以理解为&#xff1a;指向对象本身的一个指针。 this的用法在java中大体可以分为3种&#xff1a; 1.普通的直接引用 这种就不用讲了&#xff0c;this相当于是指向当前对象本身。 2.形参与成员名字重名&am…

java泛型参数约束_Java泛型方法如何约束方法类型参数?

我一直在阅读有关泛型方法的文章,以为我理解了泛型类型参数如何约束方法参数类型,但是当我用实际代码测试了一些想法时,我得到了意外的结果.这是我不理解的简单通用方法&#xff1a;private static void foo(T[] t1, T[] t2){t2[0] t1[0];}...String[] stringArray new Strin…

Leetcode 950. Reveal Cards In Increasing Order

题目 链接&#xff1a;https://leetcode.com/problems/reveal-cards-in-increasing-order/ Level: Medium Discription: In a deck of cards, every card has a unique integer. You can order the deck in any order you want. Initially, all the cards start face down (un…

java学习(139):多个catch块

import java.sql.Connection;import java.io.IOException; import java.sql.SQLException;//java异常处理 //异常 public class test82 {//定义方法声明定义异常&#xff0c;在满足条件时抛出异常对象&#xff0c;程序转向异常处理public double count(double n, double m, Con…

[Leedcode][JAVA][第289题][生命游戏]

【问题描述】 根据 百度百科 &#xff0c;生命游戏&#xff0c;简称为生命&#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a;1 即为活细…

MySQL报错113_mysql 2003 (113)

1. 问题描述远程访问192.168.2.200主机的mysql数据库时, 出现以下错误:[plain] view plain copy # mysql -host192.168.2.200 -uroot -p Enter password: ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘192.168.2.200‘ (113)2. 解决方法首先确保mysql开启了远程…