java面向对象、内存、封装、变量、重写和重载讲解
理解面向对象
- 面向对象是相对于面向过程的,面向对象和面向过程都是一种思想;
- 面向对象和面向过程的比较:
- 面向对象比面向过程更加高级
- 面向对象强调的是对象,面向过程强调的是过程
- 面向对象更加符合人们的思考习惯
- 面向对象使得人变成了指挥者
- 面向对象将功能实现封装进对象,强调的是具有功能的对象
- 面向对象关注的是解决问题需要哪些对象
内存的分类:
- 栈区:存放数据的特点:先进后出,我们将局部变量和函数放入栈区,使用完立即释放
- 堆区:存放的是实体(数组和对象),实体可以同时存储多个数据;堆区内部的数据(变量被释放,一个实体没有被指向的时候称为垃圾)会在某个时刻被释放–通过垃圾回收机制,垃圾回收机制是通过一个线程控制的,这个线程的等级比较低,所以不会被立即释放。
- 方法区:方法区和堆内存一样,是各个线程共享的数据区域,看到这个方法区这个名字很快能想到这个区域存方法信息,事实上方法区存放的数据很多,包括被虚拟机加载的类信息,用final修饰的常量,String对象,用static修饰的静态变量。
- 本地方法区:常说的常量池,String类的字符串常量
成员变量
- 在创建对象的时候被赋予默认值
- 可以在类中定义变量的时候直接赋值
- 可以在没有被static修饰的方法以外被直接使用
- 成员变量和局部变量的区别:
- 作用域:成员变量是整个对象,局部变量是从定义开始到所在的函数/if/for结束
- 默认值:成员变量会有默认值,局部变量没有默认值,要使用的时候必须先定义默认值
- 释放机制:成员变量跟对象保持一致,通过垃圾回收机制回收,局部变量使用完后立即释放。
- 存放位置:成员变量放在堆区中的对象中,局部变量放在栈区的方法区中
- 成员变量的分类
- 静态的(static修饰)和非静态的
- 静态的:静态的方法和变量—可以引用调用也可以通过类名调用,推荐使用类名调用
- 非静态的:非静态的方法和属性—只能通过引用调用
封装
- 解释:
- 隐藏实现细节,提供公共访问方式(<根据对属性的封装来说明>把对成员变量的访问进行私有化,通过一个公共方法间接实现了访问)
- 方法:
- 将成员变量设置为私有的属性(private),方法设置为公用的(public),用get、set方法方便外接对属性设置值和取得值。
- 代码实例:
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 总结:封装是java的三大特性之一,封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
重写和重载
- 涉及的是子类和父类之间的同名方法,要求方法名、参数列表、返回值类型相同,访问修饰符不能严于父类
- 重写:
- 简单的解释就是将父类有的方法用相同的方法名在子类再定义一次
- 注意的是方法名和参数个数和类型必须一样
- 重载:
- 简单的解释就是将父类有的方法用相同的方法名在子类再定义一次,但是呢参数的个数和类型不能相同
- 注意的是方法名必须一样,但是参数个数和类型必须不能一样
- 注意点:
- 私有方法不能被重写
- 子类的同名方法的权限大于等于父类的同名方法
- 静态的方法只能覆盖静态的方法