Java 面向对象(二)
jvm内存分配
- .java 文件转换成.class 文件 在编译器中完成
- .class 文件通过类加载器(三种)在内存分配空间
- jvm 会将内存分为5块:
- 栈: java栈区域比较小,空间1M ,(存取速度快)在栈中执行的基本上是快速的任务,存放基本数据内容和对象的引用。
- 堆: new 的对象都存放在堆里面,堆里面的对象都会产生一个唯一的内存地址,内存地址会赋值给栈里面的引用。堆里面的对象需要垃圾回收机制才能销毁(如果要手动销毁,对象= null;)java 堆比较占内存。
- 方法区 : 也称为静态区,主要存放5类,被所有线程共享:
- 类(class)
- 常量
- 成员方法
- 静态方法
- 静态变量
- pc寄存器(计数器):每个线程都会有一个pc寄存器,主要保存jvm的指令和地址。
- 本地方法栈:主要用来保存native方法进入区域的地址。
- 栈和堆:
- 栈:主要用于存储局部变量和对象的引用变量,每个线程都会有一个独立的栈空间,所以线程之间是不共享数据的。有两种结构:
- 顺序存储
- 链式存储
- 堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的
- 栈:主要用于存储局部变量和对象的引用变量,每个线程都会有一个独立的栈空间,所以线程之间是不共享数据的。有两种结构:
方法:
- 方法的重载: 在一个类中,方法的名字相同,但是方法的参数个数、方法参数的类型或方法的参数的位置不同,把方法名字相同的方法称为重载方法。
- 方法的重写: 当子类继承父类,子类与父类方法名称一样,参数类型、参数个数,就称为子类重写了父类方法
- 作用:父类提供的方法无法满足子类的业务,所以子类可以重写父类的方法来扩展自己的内容。调用方法时,优先调用子类的方法。
- 规范:
(1) 子类方法名、返回值、参数个数、位置 都必须跟父类方法一致
(2)子类的访问修饰符可以跟父类一致,也可以比父类的访问修饰符小(范围小)
(3)子类重写的方法抛出的异常,不能比父类抛出的异常更多。 - @override :
- 表示此方法时重写父类方法
- 增加代码的可读性
- 编译器会 更根据标签来检测我们写的代码,子类在重写时不规范。
- 重写和重载区别:
- 重写发生在子类与父类之间,重载发生在本类之中
- 重写扩展了父类的方法,重载表现了相同行为不同的表现方式(多态)
继承
- 类与类之间的关系:
- 关联关系: 最弱的一种关系。
- 继承关系:比较强的一种关系。
- 聚合关系:比较强的一种关系。聚集和组合,某个是某个的一部分。
- 实现关系 : 子类要去实现父接口。
- 语法:class 子类 extends关键字 父类 {}
class Animal { } class rabbit extends Animal { // rabbit 称为子类,Animal 称为父类 }
- 特性:
(1)子类继承父类,子类可以拥有父类所有的属性(非私有的属性)和(非私有的)方法.
(2)子类可以拥有自己的属性和方法,对父类进行了扩展
(3)子类也可以实现父类的方法
(4)java的继承是单继承、,子类只能有一个父类。 - 缺点:
提高了类与类之间的耦合,代码之间联系非常紧密。
构造方法(构造器)
- 构造函数:没有返回值、方法名称与类名一致
- 格式:
类名() { }
- 作用:
(1)在实例化对象时,首先执行的就是构造器,创建对象。(如果没创建构造器,编译器自动给每个类加上无参构造器)
(2) 初始化属性,构造器也可以重载。
(3) 优先创建父类在创建子类对对象
object对象
- object :是所有java类的基类,默认继承object,创建了任何对象都可以使用object提供的方法。