blog 2019.3.6 day9 java内存的操作

面向对象进阶

jvm内存的分配

开发工具会把java文件变成class文件(通过编译器)
xxx.java------xxx.class
xxx.class—通过类加载器加载。(类加载器常见的有三种)------在内存分配空间

jvm会将内存分为五块:

栈:java栈的区域比较小,空间默认在1M左右,特点:存取数据的 速度非常快,在栈里面执行的基本都是快速的任务。栈内的对象使用完马上就删除了,栈一般存基本数据类型,和对象的引用。

堆:new出来的对象都存放在堆里面,堆里面的每一个对象都会产生一个唯一的地址。这个内存地址会赋值给栈里面的引用。堆里面的对象需要垃圾回收机制才能销毁。要销毁一个对象 对象=null.

这是程序员无法控制的,这也就是java堆比较占内存的地方。

方法区:又称为静态区,主要存放
    (1)类(class)
    (2)常量
    (3)成员方法 public void xxxx()  没有加static的方法叫做 成员方法,属于对象的方法。只能通过创建对象,对象加点的方法调用他
                             public static xxxxxx 属于类的方法。
  
      
      (4)静态方法/静态属性
       和非静态的最大区别 就是加载时间不同。 静态在类加载的时候就在内存分配空间了,非静态只有在调用的时候才 分配空间。
       (5)静态变量
       被所有线程共享的区域。

=常量池:开发过程中涉及到的字面量=
int i = 10;
i 和10 都存放在栈内,因为int是基本数据类型。

String s = “123”
s存放在栈内,因为他是变量。
“123”在常量池里面。
因为string不是基本数据类型,String是一个类、对象。========================================================
pc寄存器(计数器):(一般操作不了)主要用来保存jvm的指令和地址
本地方法栈:
主要用来保存native方法进入区域的地址。

在这里插入图片描述
在这里插入图片描述

两种创建abc的方法完全不一样

在这里插入图片描述

Q:

java的内存 是怎么工作/操作的。

介绍一下栈和堆的数据结构。

栈的特点: 分为顺序栈和链式栈
栈:一端受限,另外一端允许操作的线性表
理解:先进后出,先进来的数据放在栈底,后出来的数据在栈顶,栈底是封闭的,只能从栈顶出。先放的数据后取,后放的数据先取。L I F O (last in first out)栈存储数据有两种结构:1、顺序存储:首先要分配一个足够大的数组,控制这个输入一端进行增删,另一端控制住不让操作。让操作的叫栈顶,不让操作的叫栈底。

左边 入栈 右边出栈
在这里插入图片描述

2、链式存储:采用链表结构,链表不是连续的,是一块一块的。控制入栈和出栈的一个端口。控制一端不能操作。
优点:要多少申请多少,空间不够再申请即可。但是用完了一定要释放空间。

数组:增删改的效率很低,查询效率高
链表:增删改效率高,增删改效率低。

堆:经过排序的一种树形的数据结构,堆的数据结构指的就是二叉树,堆可以看成一棵树的数组结构。
需要从书架上取出任意位置的一本书,不需要动其他的书,直接取你想要的书。

书架–堆机构
盒子–栈结构(取自己想要的书需要先取出来这本书上面的所有书)

方法:
1、定义方法的语法:public static void add(){ }
(不加static 变成了一个成员行为,一个成员方法了
public void show())
在这里插入图片描述
2、方法的参数,形参和实参
3、方法的返回值,可以是基本类型,是一个对象
4、方法的内存分区

在这里插入图片描述

this.name 成员变量

address 局部变量

方法的重载

:设计代码途中,java考虑到一个行为可能因为条件的不同发生执行的内容不同, 所以允许:方法的名字一样,方法的参数不一样
在这里插入图片描述

print方法本身就是一个重载,为了输出不同数据类型,定义了很多种print方法
在这里插入图片描述

重载满足的条件:在一个类中,方法的名字相同,但是方法的参数或者方法参数的个数、位置(比如先int后String 和 先String 后int)、类型不同,便可以把相同方法名称的方法称为重载方法。

重载的好处:为了减少整个程序命名的冗余 。更利于用户来访问

仅仅返回值 int void不同,不可以称为重载。
在这里插入图片描述

面向对象的特征:继承、封装、(抽象)、多态

继承

对象与对象(类)之间的关系:
1、关联关系:最弱的一种关系(学生类中包含了老师 ) has a 学校类有老师 学校has a 老师
2、继承关系:(比较强的一种关系) is-a 判断XX与XX是否是继承关系 就看is a 能否说通。
游泳运动员is a 运动员 就是继承关系。
老师isn’t a 班级 就不是继承关系

3、聚合关系(比较强的关系) 也是一种继承关系,比继承表达的更明确一些。
聚集 和组合。“XX是XX的一部分” 这俩就是聚合关系

4、实现关系:子类要去实现父接口。

继承的语法:

 public class Animal{

}

calss rabbit **extends** Animal {
    rabbit称为子类,Animal称为父类。
}

子类继承父类,就可以用父类所有的方法

用this。name的时候优先找本类,找不到再找父类有没有

java中继承的特性:

1、子类继承父类,子类可以拥有父类的所有非私有的属性和非私有的方法。
访问修饰符范围,private只能本类用,public所有类都可以用。

2、子类可以拥有自己的属性和方法,对父类进行了扩展
3、子类也可以实现父类的方法。
4、java的继承是单继承,一个类只能有一个父类(extends),c++之类的可以多继承。一个类可以多重继承。
当一个对象同时属于两个类时:比如鳄鱼既属于水栖类 又属于陆地类
解决方法:水栖类继承陆地类, 鳄鱼继承水栖类(多重继承)。

继承的缺点:
提高了类与类之间的耦合,若以后要动其中一个类,会要动其他类。
父类若是出了问题,所有子类都出问题
类与类之间的代码联系非常紧密,代码独立性比较差,以后修改或替换不容易。

构造器(构造方法)=
在这里插入图片描述

把这个方法称为 构造器(构造函数),用这个构造器来产生类对象
在这里插入图片描述

作用:1、只要创建对象采用的是new关键字,那么首先要执行的就是构造器。
构造器是用于创建对象的一个方法。

创建对象还是通过JVM来创建,但是构造器可以将创建好的对象返回出去,调用者才能访问这个对象

若果没有写构造器,编译器会自动给每个类加上无参构造器。但是如果写了有参构造,编译器就不会默认加无参构造。
在这里插入图片描述
无参构造器

2、初始化属性。

在这里插入图片描述

有参构造器
传参进来是为了初始化属性。
在这里插入图片描述
可以无需进行下面的赋值过程了
在这里插入图片描述
在创建对象的时候,可以直接把值传给了有参构造器
在这里插入图片描述

子类在继承父类时,new一个子类对象,父类会不会产生一个对象?
会 必须有父类对象,才能用父类的这些功能。

子类在继承父类时,new一个对象时,先创建子类还是先创建父类?
通过构造器验证,在父类写一个构造器 子类写一个构造器,看哪一个先执行。

验证结果: 父类先产生,再产生子类。

Object类

javad的所有类都默认继承一个Object类 它给所有java类都提供了一些必须的方法

Object是所有java类的根基类,如果在类中没有使用extends显示的去继承类,默认就继承Object类。
在java中,创建的任何一个对象都可以使用object提供的方法

怎么用?

方法的重写@Override

方法的重载发生在一个类中,名称一样,参数不同等等

**重写的概念:**方法的重写发生在继承中,当一个子类继承父类的时候,子类中与父类方法名称一样,参数类型一样,参数个数一样,类型也一样,就称子类重写了父类的方法。

子类也叫派生类, 父类也称为基类。

重写的作用:父类提供的方法有可能无法满足子类的业务,所以子类可以重写父类的方法来拓展自己的内容。
子类重写父类的方法,调用方法的时候优先调用子类的方法。

重写的规范:
1、子类的方法名字、返回值、参数个数、类型、位置 都必须跟父类保持一致。
2、子类的方法访问修饰符,它必须和父类一样,或者比父类的访问修饰符范围要小
3、子类重写的方法抛出的异常不能比父类抛出的异常更多。

@Override:见到马上想到它是重写。作用有:
1、可以把他当成注释来用,看到这个标记就知道当前方法是重写方法
2、增加代码的可读性,我可以根据标签判断哪些方法是重写的,哪些方法是子类本身的
3、编译器会根据标签来检测我们写的代码。如果子类在重写的时候不满足重写的规范,编译器会给你提示。

重写和重载的区别:

1、重写发生在子类和父类之间,重写是拓展、增强父类的功能、行为。
2、重载发生在同一个类中 ,名称一样,参数不同等等,就叫重载。表现出多态(相同行为的不同表现方式)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值