JavaSE基础
面向对象的三大特性
继承
继承是从已有类得到继承信息创建新类的过程.
封装
通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口.面向对象的本质就是将现实世界描述成一系列完全自治,封装的对象.我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装.可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口.
多态
就是用同样的对象引用调用同样的方法但是做了不同的事情.多态性分为编译时的多态性和运行时的多态性. 方法重载实现的是编译时多态性(也称为前绑定),方法重写实现的是运行时的多态性(也称为后绑定).运行时的多态需要做俩件事情:1.方法重写(子类继承父类并重写父类的方法);2.对象造型(用父类型引用引用子类型对象)
抽象
抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象俩方面.抽象只关注对象有哪些属性和行为,而不关注行为的细节是什么.
不同权限修饰符的区别
本类 | 相同包中的类 | 不同包中的子类 | 不同包中的非子类 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default | √ | √ | ||
private | √ |
构造方法的特点
- 构造方法的名称必须和类名一致
- 构造方法没有返回值类型
- 构造方法的作用是给新创建的对象属性初始化,而不是创建对象,创建对象由new关键字负责
- 构造方法会在创建对象时自动调用
- 如果类中没有提供任何构造方法,编译器会自动在类中添加一个无参的构造方法
如果类中已经提供了构造方法,编译器不再添加无参构造方法 - 一个类可以存在多个构造方法,形成重载
- 构造方法不能使用static,final,abstract修饰符
this 关键字
- this(参数)语句只能出现在构造方法中,而不能放在普通方法中
- this(参数)语句只能放在构造方法的首行
构造代码块
- 构造代码块 ----- 类中定义的代码块 创建对象时先调用.(相当于加在了构造方法的首部)
- 局部代码块 ----- 方法中定义的代码块
- 静态代码块 ----- 使用 static关键词修饰的代码块 会在类加载时执行(所以只执行一次)
- 同步代码块 ----- 使用synchronized关键词修饰的代码块,在多线程编程中使用
局部变量和成员变量的区别 重点
-
定义位置不同
- 局部变量定义在方法中
- 成员变量定义在类中,方法之外
-
占用的内存空间不同
- 局部变量存储在栈区中
- 非静态成员变量存储在堆区中,静态成员变量存储在方法区中的全局数据区里
-
生命周期不同
- 局部变量的作用范围是定义该变量的一对{}
- 非静态的成员变量随着对象的创建而存在,随着对象的消失而消失
静态成员变量随着类的加载而存在,随着程序结束,JVM卸载时销毁
-
初始值不同
- 局部变量没有默认的初始值,使用前必须要先初始化
- 成员变量有默认的初始值
创建对象的四种方式 重点
- 使用new关键字创建对象 最常用
- 利用反射机制—在Web容器和开源框架的底层实现中经常使用,自动调用无参构造方法
- 利用对象克隆技术—调用Object类的clone()方法,不会调用构造方法
- 利用反序列化技术—IO流中的ObjectInputStream和ObjectOutputSteam,不会调用构造方法
使用new关键字创建对象的过程 重点
- 加载类的字节码文件到内存(只执行一次),初始化静态成员变量,如果类中存在静态代码块,则先执行静态构造代码块中的语句
- 在堆区为类的实例属性分配存储空间,并将类中的方法放入全局代码区
- 如果类的属性定义时没有指定初始值,则取默认值
- 如果类的属性定义时指定了初始值,则以初始值为准
- 如果类中存在构造代码块,则先执行构造代码块中的语句
- 调用类的构造方法,对属性值再次赋值
- 在栈区创建引用型变量,并将对象的地址值赋给该变量(指向该对象),至此对象创建完成
public static void main(String[] args) {
Person person = new Person("张三", "男", 20);
change(person);
System.out.println(person);
}
static void change(Person person){
person.setName("李四");
person.setGender("女");
person.setAge(30);
//person = new Person("李四", "女", 30);
/**
* 如果使用 person.set()方法则相当于原地操作.会改变实参
* 如果 person=new Person("","",) 形参指向new的内存.实参并不改变
* 和数组是一个道理
* /
}