Java面试必知: Java 面向对象

面向对象的三大特性

继承

继承是从已有类得到继承信息创建新类的过程.

封装

通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口.面向对象的本质就是将现实世界描述成一系列完全自治,封装的对象.我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装.可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口.

多态

就是用同样的对象引用调用同样的方法但是做了不同的事情.多态性分为编译时的多态性和运行时的多态性. 方法重载实现的是编译时多态性(也称为前绑定),方法重写实现的是运行时的多态性(也称为后绑定).运行时的多态需要做俩件事情:1.方法重写(子类继承父类并重写父类的方法);2.对象造型(用父类型引用引用子类型对象)

抽象

抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象俩方面.抽象只关注对象有哪些属性和行为,而不关注行为的细节是什么.

不同权限修饰符的区别

本类相同包中的类不同包中的子类不同包中的非子类
public
protected
default
private

构造方法的特点

  1. 构造方法的名称必须和类名一致
  2. 构造方法没有返回值类型
  3. 构造方法的作用是给新创建的对象属性初始化,而不是创建对象,创建对象由new关键字负责
  4. 构造方法会在创建对象时自动调用
  5. 如果类中没有提供任何构造方法,编译器会自动在类中添加一个无参的构造方法
    如果类中已经提供了构造方法,编译器不再添加无参构造方法
  6. 一个类可以存在多个构造方法,形成重载
  7. 构造方法不能使用static,final,abstract修饰符

this 关键字

  • this(参数)语句只能出现在构造方法中,而不能放在普通方法中
  • this(参数)语句只能放在构造方法的首行

构造代码块

  1. 构造代码块 ----- 类中定义的代码块 创建对象时先调用.(相当于加在了构造方法的首部)
  2. 局部代码块 ----- 方法中定义的代码块
  3. 静态代码块 ----- 使用 static关键词修饰的代码块 会在类加载时执行(所以只执行一次)
  4. 同步代码块 ----- 使用synchronized关键词修饰的代码块,在多线程编程中使用

局部变量和成员变量的区别 重点

  1. 定义位置不同

    • 局部变量定义在方法中
    • 成员变量定义在类中,方法之外
  2. 占用的内存空间不同

    • 局部变量存储在栈区中
    • 非静态成员变量存储在堆区中,静态成员变量存储在方法区中的全局数据区里
  3. 生命周期不同

    • 局部变量的作用范围是定义该变量的一对{}
    • 非静态的成员变量随着对象的创建而存在,随着对象的消失而消失
      静态成员变量随着类的加载而存在,随着程序结束,JVM卸载时销毁
  4. 初始值不同

    • 局部变量没有默认的初始值,使用前必须要先初始化
    • 成员变量有默认的初始值

创建对象的四种方式 重点

  1. 使用new关键字创建对象 最常用
  2. 利用反射机制—在Web容器和开源框架的底层实现中经常使用,自动调用无参构造方法
  3. 利用对象克隆技术—调用Object类的clone()方法,不会调用构造方法
  4. 利用反序列化技术—IO流中的ObjectInputStream和ObjectOutputSteam,不会调用构造方法

使用new关键字创建对象的过程 重点

  1. 加载类的字节码文件到内存(只执行一次),初始化静态成员变量,如果类中存在静态代码块,则先执行静态构造代码块中的语句
  2. 在堆区为类的实例属性分配存储空间,并将类中的方法放入全局代码区
    • 如果类的属性定义时没有指定初始值,则取默认值
    • 如果类的属性定义时指定了初始值,则以初始值为准
  3. 如果类中存在构造代码块,则先执行构造代码块中的语句
  4. 调用类的构造方法,对属性值再次赋值
  5. 在栈区创建引用型变量,并将对象的地址值赋给该变量(指向该对象),至此对象创建完成
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的内存.实参并不改变
    * 和数组是一个道理
    * /
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值