04.类,对象和内部类

面向对象和面向过程

a.都是看待问题的一种思维方式,都能解决问题

b.面向过程着眼于所有的事情按照步骤来实现

c.面向对象着眼于找到一个具有特殊功能的对象,委托这个对象去做某件事情。

类是对象的模板,对象是类的实例

内存浅析:

为什么对某些数据进行缓存?
Java吧一些构建成本大,使用频繁的对象缓存起来,从而提高程序性能。

程序运行时,操作系统会分配三类(实际上是两块)主要的内存空间

栈的特点:
  1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
  2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
  3. 栈属于线程私有,不能实现线程间的共享!
  4. 栈是由系统自动分配,速度快!栈是一个连续的内存空间(堆是乱放的)。
  5. 先进后出
堆的特点

1.堆用于存储创建好的对象和数组(对象的一种)。
2.JVM只有一个堆,被所有线程共享
3.堆是一个不连续的较大内存空间,分配灵活,速度慢!

方法区
  1. JVM只有一个方法区,被所有线程共享!
  2. 方法区实际也是堆,只是用于存储类、常量相关的信息!
  3. 用来存放程序中永远是不变或唯一的内容。(类代码信息、【class对象】、静态变量、字符串常量等)
  4. 在jdk1.7之后常量池、静态区作为堆中一部分,方法区的概念弱化。
堆栈方法区实例

3.3 构造方法和普通方法的区别

​ a.构造方法是在创建对象的过程中自动调用的,普通方法只能手动进行调用

​ b.构造方法没有返回值类型【注意区别返回值void】,普通方法的返回值类型要么是确定的类型,要么为void

​ c.系统会默认为我们提供一个无参的构造方法,普通方法只能手动添加

​ d.构造方法的方法名称必须和对应的类名保持一致

​ e.构造方法在创建对象的过程中就会执行,而且每个对象只执行一次,对于普通方法而言,只有在需要使用的时候才被执行,并且一个对象可以调用多次

创建对象的过程

JVM第一次使用某个类时,系统会在准备阶段为该类的所有静态成员变量分配空间,并在初始化阶段初始化这些变量。

当程序创建一个子类对象时,系统不仅会为该类中定义的成员变量分配内存,还会为父类的成员变量分配内存。即使两者是同名的也会再次分配内存。

初始化块:在创建Java对象时,系统总是先调用该类里定义的初始化块,如果一个类定义了两个普通初始化块,则前面定义的初始化块先执行.初始化块虽然也是java类的一种成员,但是他没有名字,也就没有标识,所以没有办法通过类或者对象来对初始化块进行调用,他存在的意义就是在创建Java对象之前隐式执行,并且是在构造器执行之前执行。可以参考Integer包装类。与构造器不同,初始化块是一段固定的代码,不接收任何参数,所以如果有一段初始化处理代码对所有对象完全相同,且不需要任何参数,那么就可以将这段代码放入初始化块中。

使用javac编译类之后,初始化块会被还原到每个构造器中,且位于构造器所有代码的最前面。

静态初始化块会先执行他父类的初始化块,然后再执行自己的,然后再执行构造器。

当程序员调用构造器时,系统会先为该对象分配一个内存空间,并为这个对象执行默认初始化,这时这个对象已经产生了——这些操作再执行构造函数之前就已经完成了。但是这个对象还不能够被外部程序访问,只能再该构造器中通过this来引用。当构造器的方法体执行结束后,这个对象会作为构造器的返回值返回,通常还会赋给另一个引用类型的变量,从而让外部程序可以访问该对象。

this与super

this在作用于对象是表示的是这个对象,作用于构造函数时表示的是该类中的某个构造函数。super与之类似,注意使用this和super在调用构造方法时必须在构造函数的第一行,且不可以同时使用,原因是this所调用的构造方法的第一句一定是super。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值