Java day7

1.面向对象

  • 面向过程:自下而上
  • 面向对象:自上而下

对象有什么?

属性:成员变量来描述,直接写在类中的变量

方法:定义在类中的函数也叫成员方法

new 关键字创建一个方法,new的过程叫做创建对象

  • java分为两种数据类型:

    • 基本数据类型
    • 引用数据类型(String和所有创建的类)
  • 非static修饰的方法必须通过对象或者引用去调用

  • 对象中如果有属性大部分都相同可以先设置一个默认值

2.this

在调用方法的时候,java会自动把当前对象传递给方法,也就是this引用(隐式声明的一个引用)

  • 变量的查找顺序,一个方法内的局部变量,如果在类中有定义它会自己使用this访问本方法的属性,但是如果传递的形参和属性一样那它就会使用改形参。就近原则

this表示当前类的对象

this可以访问成员属性

this可以区分局部和成员变量

3.构造方法

语法

public 类名(参数{

};

  • 没有返回值;

  • 执行new中会调用构造方法;

  • java会自动给每一个类一个无参数的构造方法,但如果你定义了这个就不存在了。

构造方法会在创建对象的时候,给对象设置属性的信息;

  • 构造方法也是方法,也可以进行重载。能有更多的方法创建对象
  • 如果一个类的两种构造方法十分类似

this可以调用当前类中的其他构造方法,使代码变得更简洁。

//这是一个类的两个不同的构造方法

public a(int a,int b){

​ this.a = a;

​ this.b = b;

}

public a(int a,int b, int c){

​ //实用this调用第一个构造方法减少代码量使其更加简洁明了

this(a ,b);

this.c = c;

}

4.static

  • static修饰的变量,在类中是单独独立的一块内存单元,所有类所创建的对象包括类本身都指向这块内存。
    • 数据共享
    • 优先于对象产生(在类加载还未创建的时候)
    • 注意用类来访问静态变量提高可读性

java创建对象的过程主要分为一下五个步骤:
(1)类加载检查
Java虚拟机(jvm)在读取一条new指令时候,首先检查能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化。如果没有,则会先执行相应的类加载过程。

(2)内存分配
在通过(1)后,则开始为新生的对象分配内存。该对象所需的内存大小在类加载完成后便可确定,因此为每个对象分配的内存大小是确定的。而分配方式主要有两种,分别为:

1.指针碰撞

应用场合:堆内存规整(通俗的说就是用过的内存被整齐充分的利用,用过的内存放在一边,没有用过的放在另外一边,而中间利用一个分界值指针对这两边的内存进行分界,从而掌握内存分配情况)。

即在开辟内存空间时候,将分界值指针往没用过的内存方向移动向应大小位置即可)。

将堆内存这样划分的代表的GC收集器算法有:Serial,ParNew

2.空闲列表

应用场合;堆内存不规整(虚拟机维护一个可以记录内存块是否可以用的列表来了解内存分配情况)

即在开辟内存空间时候,找到一块足够大的内存块分配给该对象即可,同时更新记录列表。

将堆内存这样划分的代表的GC收集器算法有:CMS

(3)初始化默认值
第(2)步完成后,紧接着,虚拟机需要将分配到的内存空间都进行初始化(即给一些默认值),这将做是为了保证对象实例的字段在Java代码中可以在不赋初值的情况下使用。程序可以访问到这些字段对用数据类型的默认值。

(4)设置对象头
初始化(3)完成后,虚拟机对对象进行一些简单设置,如标记该对象是哪个类的实例,这个对象的hash码,该对象所处的年龄段等等(这些可以理解为对象实例的基本信息)。这些信息被写在对象头中。jvm根据当前的运行状态,会给出不同的设置方式。

(5)执行初始化方法
在(4)完成后,最后执行由开发人员编写的对象的初始化方法,把对象按照开发人员的设计进行初始化,一个对象便创建出来了。

拓展

Java构造器调用顺序

静态代码块 static修饰

构造代码块 无关键词修饰的代码块 { }

构造器 构造方法

普通代码块 类中的各类方法

  • 无继承的情况下的执行顺序静态代码块:只在程序启动后执行一次,优先级最高构造代码块:任何一个构造器被调用的时候,都会先执行构造代码块,优先级低于静态代码块构造器:优先级低于构造代码块总结一下优先级:静态代码块 > 构造代码块 > 构造器

  • 有继承的情况下的执行顺序:父类静态代码块:只在程序启动后执行一次优先级最高 子类静态代码块:只在程序启动后执行一次优先级低于父类静态代码块 父类构造代码块:父类任何一个构造器被调用的时候,都会执行一次,优先级低于子类静态代码块父类构造器:优先级低于父类构造代码子类构造代码块:子类任何一个构造器被调用的时候,都会执行一次,优先级低于父类构造器子类构造器:优先级低于子类构造代码块总结一下优先级:父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造器 > 子类构造代码块 > 子类构造器

  • 如果有多个静态代码块则按编写顺序执行

  • 普通代码块,就是成员方法在创建类实例的时候出现

    • 5.普通代码块介绍

      普通代码块又叫局部代码块是放在方法体中,在所有代码块之后执行并只有调用该方法的时候才会执行。主要是存一些局部变量,因为他会随着方法体的退出而消失,所以他能够减少变量的生命周期,提高内存的使用效率。

       比如一些只有在某个方法才会用到的属性,计算房屋面积的方法中的一些单位等。
      
  • 总结

    执行顺序:

    静态代码块》构造代码块》构造方法》普通代码块

    继承关系

    父类静态代码块>子类静态代码块>父类构造代码块>构造方法>子类构造代码块> 子类构造器

    生命周期

    静态代码块》构造代码块=构造方法》普通代码块

    代码块的作用主要是把一些程序运行中通用固定的操作给抽出来放在一起执行,具体业务场景选择性的使用各种代码块。

  • 静态方法中不能使用或者访问this(对象),因为实例对象还未创建但静态方法已经存在,由此可见在静态方法中不能使用非静态变量以及对象中 的方法(但静态方法可以访问其他静态方法)

  • Java中 包 类似于windows 文件夹 方便管理 和 使用

    包名尽量使用翻转域名。

    com.baidu.tieba

    上述相当于一个三层文件夹com>baidu>tieba

    栗子:

image-20221028231038812

使用包中类

要加入packag **; //在什么路径下 包的声明

image-20221028231203309

不同路径下使用其文件的类

improt **.Student; //导入包 导入Student类

总结

  • package 声明 必须在执行代码前面 第一行

  • import 导入 *可以导入当前路径下所有

  • 自己包内不需导包

  • Java.lang包中不需要导入

    • String System等包系统内置的