Java基础复习6—初始化

之前讲过了类的一些基础,想必大家都知道了类的定义

什么?你忘了?

下面给你一个例子快速复习

  1. class AClass{
  2. int a;
  3. boolean b;
  4. void getA(){
  5. return this.a;
  6. }
  7. AClass(){
  8. System.out.println("这是构造函数被调用");
  9. }
  10. }

int a是类的属性

getA()是类的方法

统一使用getName()与setName()方法来对对象的属性进行取与设置的操作

AClass()是类的构造函数,名字与类相同,没有返回值

好了好了,别说了,我已经看够了

那现在上主菜,Java中的初始化

1.指定初始化

获取你是有C++基础的开发者,你一定知道初始化的一个禁忌,直接在类中就地初始化。

Java中最简单的初始化——指定初始化

你哪个变量需要初始化,就直接赋值给他就好了嘛。

如下,直接给赋值。

  1. class AClass{
  2. int a=5;
  3. boolean b=true;
  4. void getA(){
  5. return this.a;
  6. }
  7. AClass(){
  8. System.out.println("这是构造函数被调用");
  9. }
  10. }

那对于非基本类型的对象,怎么办?

简单,对于基础类型,初始化的方法是赋值,对于类?

你已经知道了,使用new关键字

如下

  1. class AClass{
  2. int a=5;
  3. boolean b=true;
  4. AnotherClass c = new AnotherClass();
  5. void getA(){
  6. return this.a;
  7. }
  8. AClass(){
  9. System.out.println("这是构造函数被调用");
  10. }
  11. }

总结一下,指定初始化的方式允许程序员直接给类的成员设置初始值,如果是对象,设置初始值的方式是new

2.构造器初始化

顾名思义,之前我们不是说过有一个构造方法嘛:快速回顾什么是构造方法?

哇,兄弟你又忘了?

我们再来看一波概念:

构造方法解决的问题是:在调用一个类之前,都需要调用initialize()方法。通过调用initialize()方法,我们可以搭建一个构造器,保证所有的对象都会得到初始化。

就是说,new对象会使用对应的构造方法,置于是哪个方法,看你的参数了

那可以初始化一个类,我们顺便把类的属性一起初始化了就行了嘛

直接上例子

  1. class AClass{
  2. int a=5;
  3. boolean b=true;
  4. AnotherClass c = new AnotherClass();
  5. void getA(){
  6. return this.a;
  7. }
  8. //不删除他的原因是为了不给参数也能生成对象
  9. AClass(){
  10. System.out.println("这是构造函数被调用");
  11. }
  12. //个人习惯使用this,如果你的参数没有与属性名字冲突,可以不用this,
  13. //个人认为使用这种方式更能体现他是个“构造器初始化”
  14. AClass(int a,boolean b,AnotherClass c){
  15. this.a=a;
  16. this.b=b;
  17. //注意这里的对象赋值是引用,实际上没有新建对象,想新建对象就new
  18. this.c=c;
  19. }
  20. }

再在这里提醒一遍:引用与对象是不同的,这里构造器是把引用指向了另一个对象,并没有新建对象

不过不需要担心这个对象死去导致空指针异常,你已经是一个成熟的Java人了滑稽。

因为Java不允许用户自行回收内存,而这里的引用相当于两个对象直接有了联系,所以AClass对象消失之前,内部对象是不会消失滴!不懂?看之前的文章嘛《让你第一次认识到Java的内存管理》

3.静态数据的初始化

静态,静态,静态是什么意思?

你可以幻想自己在Java的虚拟机之中,每个对象都有自己的空间,存了属于对象自己的数据,这叫动态

静态呢?刚好相反,静态的是数据是类共享的,只占用了一份存储区域。

静态是指共享,一份,而并不是最终,所以我们仍可以修改静态参数,但是这是很不推荐的行为,毕竟是公家的数据,你一个对象修改了,别不就遭了,同时也有大佬遇到了利用静态的原理反而翻车的情况——分布式。

静态数据初始化没什么特殊的,与非静态相同。

  1. class AClass{
  2. static int a=5;
  3. boolean b=true;
  4. static AnotherClass c = new AnotherClass();
  5. void getA(){
  6. return this.a;
  7. }
  8. AClass(){
  9. System.out.println("这是构造函数被调用");
  10. }
  11. }

哇,每次都要写static,好累啊

恭喜你,Java还真的有解决这个的方案

用一个例子,直接说明,这叫显示静态初始化

  1. class AClass{
  2. boolean b=true;
  3. static{
  4. int a=5;
  5. AnotherClass c = new AnotherClass();
  6. }
  7. void getA(){
  8. return this.a;
  9. }
  10. AClass(){
  11. System.out.println("这是构造函数被调用");
  12. }
  13. }

这非静态的就不服了,你们静态可以,我们非静态也可以,诶确实,真的可以

这就是实例初始化

  1. class AClass{
  2. boolean b=true;
  3. {
  4. int a=5;
  5. AnotherClass c = new AnotherClass();
  6. }
  7. void getA(){
  8. return this.a;
  9. }
  10. AClass(){
  11. System.out.println("这是构造函数被调用");
  12. }
  13. }

4.那初始化的顺序呢?

综合上面的讲述,我们有构造器初始化,静态,直接初始化这三种情况

讲顺序之前,请先回顾一下静态属性的位置

哦,你应该知道了,静态属性的只有一个,归属于类。

那肯定静态是排第一嘛!

老二是谁嘞,我们思考一下,构造方法有多种,所以会不会用到全部初始化的构造方法还不一定,那一定会用到的是谁嘞,直接初始化!

好的直接初始化排老二!

最后就是构造方法喽

所以综上,再加点调料,顺序如下:

  1. 在类被载入时,有关静态初始化的操作会执行(静态初始化只在Class对象首次加载使进行一次),值的一提的是,静态成员只有在使用到的时候才会被初始化(类.名字进行访问&初始化对象)
  2. 在堆上为对象分配空间
  3. 存储空间清零,所有数据为默认(安全)
  4. 执行在字段处定义的初始化操作
  5. 执行构造器

外传:数组初始化

为什么要单独写数组呢

主要是忘了写

开玩笑开玩笑,数组并不能算一种新的初始化方法(个人认为),他的初始化模式与之前的相似。

在介绍之前,还是先看看什么是数组:

数组:相同类型元素紧密排列。提炼出来差不多就是这样。

比如这个烤羊肉串(我没有诱惑你),羊肉串是类型相同的,然后一个一个排列在一起。

Java怎么实现一个数组?

两种形式

  1. type[] name; //Java 新增的方式
  2. type name[];//传统C语言风格

那总要一种推荐的嘛

本人选择type[] name;原因是更有类型的意味,数组在Java中可以算一个特殊的对象了。

如何初始化?

两种

第一个,直接初始化

(有什么奥秘嘛,直接用{}就能初始化)

例子给你了

  1. int[] a1={1,2,3,4};

这里必须要提到,这种方式并没有直接表明数组的长度,个人还是喜欢第二种,不过某些场景还是这种方便

数组越界的问题

C和C++中是默认“允许”数组越界的,程序不会报错,反而能正常运行,不过结果可想而知

Java中,数组越界则会出现RuntimeError(运行时异常),保护程序

第二种,使用new关键字

是不是有类的味道了呢?

  1. int[] a1= new int[5];

另外对于对象数组,必须再次了解一点:引用≠对象

所以当下次你再创建了一个下面的对象数组

  1. ClassName[] b= new ClassName[15];

还没有给对象数组中的引用赋值报错了

就再强调一遍,Java初始化对象的办法只有new,所以其他各种莫名其妙的都没有初始化哦,要用其他语言当我没说。

声明了一个对象数组,还需要初始化才能有实际的内容,

小心使得万年船哦。

万水千山都是情,求个赞儿行不行!

轻轻松松了解Java的初始化方法(含对象数组的小问题)的更多相关文章

  1. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  2. Java技巧——将前端的对象数组通过Json字符串传到后端并转换为对象集合

    Java技巧——将前端的对象数组通过Json字符串传到后端并转换为对象集合 摘要:本文主要记录了如何将将前端的对象数组通过Json字符串传到后端,并在后端将Json字符串转换为对象集合. 前端代码 前 ...

  3. (转)Silverlight调用的JS方法返回对象数组的处理方法

    最近在做Silverlight应用,需要用Silverlight调用页面中Javascript方法.这 个JS方法返回一个对象数组给Silverlight.对于这个对象数组怎么在Silverlight ...

  4. java创建自定义类的对象数组

      1 public class Student{ 2 static int number = 0; // 静态变量的访问可以不用创建类的实例就可就可使用< 类名.属性 >的方法访问 3 ...

  5. java中初始化方法

    本文主要是讲从<java编程思想>中看到的东西,是第七章复用类的开头内容,主要是类初始化的几种方法的位置,主要包括 1.在定义对象的地方.这意味着他们总是在构造器被调用前被初始化. 2.在 ...

  6. 【java】实现Interface java.lang.Comparable<T>接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator<T>

    package 对象比较排序; import java.util.Arrays; class A implements Comparable<A>{ private String name ...

  7. 使用reduce的方法实现对象数组去重

    在开发中和面试当中,数组去重问题往往是受宠儿,那用最短的代码解决这个问题会使效率得到更大的提升.普通的数组,我们可以通过filter过滤方法进行去重,详情见本人博客:http://www.cnblog ...

  8. iOS学习之Object-C语言继承和初始化方法

    一.继承 1.面向对象的三大特性:封装,继承,多态.      面向对象提供了继承特性.把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和方法即可.继承既能保证类的完整,又能简化代码. ...

  9. C++(二十六) — 构造函数、析构函数、对象数组、复制构造函数

    1.构造函数 (1)每个类都要定义它自己的构造函数和析构函数,是类的成员函数. 特点:名称与类名相同:没有返回值:一定是共有函数,可以直接访问类内所有成员函数:可以带默认形参,可以重载: class ...

随机推荐

  1. Java实现生产者消费者(一)

    问题描述:生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时 ...

  2. SUCTF checkin

    复现的时候看了源码...... 发现文件上传时会对文件内容以及后缀进行严格的检测 同时还有exif_imagetype   这个就用图片马就行绕过,绕过文件后缀试一下传图片马解析为php 但是常规解析 ...

  3. 《JavaScript 模式》读书笔记(1)— 简介

    哇,看了自己最近的一篇文章,其实那时候刚接触Jest,啥也不会(虽然现在其实也一样不会,嘿嘿),就像记录下工作中遇到的一些问题,其实,后来的一些发现吧,那两篇文章写的其实是有一些问题的.希望不会给大家 ...

  4. JAVAEE学习day02

    1.数据类型的转换 1>自动转换(隐式) // 将取值范围小的数据类型自动提升为取值范围大的类型 // 定义byte类型数据 byte b = 10; // 定义short类型数据 short ...

  5. dos下 批处理 用 pause 可以在最后暂停 查看结果信息 build.bat

    dos下 批处理 用 pause 可以在最后暂停 查看结果信息

  6. Spring 多数据源配置(转)

    转载自:https://www.cnblogs.com/digdeep/p/4512368.html 同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据 ...

  7. git版本控制系统小白教程(上)

    前言:本文主要介绍git版本控制系统的一些基础使用,适合小白入门,因为内容较多,会分为两部分进行分享. Git介绍 ​ Git是目前世界上最先进的分布式版本控制系统.并且它是一个开源的分布式版本控制系 ...

  8. Python3学习之路~10.1 多进程、进程间通信、进程池

    一 多进程multiprocessing multiprocessing is a package that supports spawning processes using an API simi ...

  9. ERP系统功能及部署方式

    ERP是对企业经营过程中的一些事项进行系统化管理的一种软件,所以ERP软件包含企业经营过程中需要用到的多种功能管理模块,并且ERP软件有两种部署方式.下面一起来了解一下相关的知识吧! ERP系统的功能 ...

  10. 利用Docker手动构建WebLogic镜像的步骤

    info 我的Docker环境信息如下: [root@localhost ~]# docker info -f " OSType: {{.OperatingSystem}} {{.Archi ...