Java面试基础篇之面向对象

面向对象

什么是面向对象?

  • 对象是Java程序中真实存在的个体,是类的实例,每个对象都有各自的状态特征(属性)及行为特征(方法),Java通过对象之间的行为交互来解决问题
  • 面向对象就是把构成问题的事物分配成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为

面向对象的三大特征?

  • 封装: 核心思想就是将数据私有化,行为公开化,外界只能通过访问我们公开的方法来访问数据和逻辑,保证数据的安全和程序稳定
  • 继承: 本质上是对一个类的拓展,获得一个类的属性和方法,并且可以对该类的方法进行重写,实现代码复用
  • 多态: 基于继承或实现的前提,由父类的引用指向子类的对象,同一方法,对于不同的对象具有不同的实现

重写和重载的区别?

  • 重写发生在父子类中,子类重写父类里面的方法,方法名相同,返回值类型相同,参数列表相同,方法体不同
  • 重载发生在一个类中,方法名相同,参数数量类型不同,方法体不同,跟返回值类型无关

抽象类和接口的区别?

  • 抽象类abstract修饰,抽象类里可以有普通方法,抽象方法不能被private修饰,子类用extends继承,单继承
  • 接口interface修饰,接口中的方法全部都是抽象方法,JDK1.8以后可以有默认方法和静态方法,接口中的变量都是常量,子类用implements实现,可以实现多个接口

抽象类中一定有抽象方法?

  • 不一定,抽象类中可以没有抽象方法,但是有抽象方法的类一定要定义成抽象类

抽象类能不能被final修饰?

  • 不能,被final修饰的类不能被继承,但是定义抽象类的目的就是让类不能直接被实例化而是被其他类继承

String和new String()的区别?

  • String存放在字符串常量池有且仅有一份
  • new String()会在堆内存中开辟一块新的内存空间
String str1=“abc”;
String str2=“abc”;
String str3=new String(“abc”);
String str4=new String(“abc”);
System.out.println(str1 == str2); //true在常量池只有一份地址相同
System.out.println(str2 == str3); //false一个在常量池一个在堆中
System.out.println(str3 == str4); //false每new一次开辟一块新的空间

String,StringBuilder,StringBuffer的区别?

  • String不可变对象,所以在对String类型做改变时,都会产生一个新的对象,然后指针指向新的String对象,所以如果经常改变内容的字符串最好不要用String
  • StringBuffer修改时是对对象本身进行操作,不会生成新的对象,是线程安全的,效率比较低
  • StringBuilder是JDK1.5之后新增的类,功能和StringBuffer相似,线程不安全,效率高
  • 执行效率 StringBuilder>StringBuffer>String

String常用的API有哪些?

  • hashCode() 返回此字符串的哈希码
  • equals(Object anObject) 将此字符串与指定的对象比较,比较的是重写后的串的具体内容
  • length() 返回此字符串的长度
  • toUpperCase() 所有字符都转换为大写
  • toLowerCase() 所有字符都转换为小写
  • startsWith(String prefix) 测试此字符串是否以指定的元素开头
  • endsWith(String suffix) 测试此字符串是否以指定的字符串结束
  • charAt(int index) 返回指定索引处的 char 值/字符
  • indexOf(String str) 返回指定字符在此字符串中第一次出现处的索引
  • lastIndexOf(String str) 返回指定字符在此字符串中最后一次出现处的索引
  • split(String regex) 根据给定元素来分隔此字符串
  • trim() 返回去除首尾空格的字符串
  • getBytes() 把字符串存储到一个新的byte数组中
  • substring(int beginIndex) 返回一个新子串,从指定下标处开始,包含指定下标
  • substring(int beginIndex, int endIndex) 返回一个新子串,从执定下标开始,到结束下标为止,但不包含结束下标
  • valueOf(int i) int转成String

==和equals()区别

  • == 在比较基本数据类型时,是比较是否相等
  • ==在比较引用数据类型时,比较的是两者的内存地址是否相等
  • equals()方法的底层是通过==来实现的,equals()默认是比较两者的内存地址,重写equals()方法后,比较的是它们的数值

hashCode()方法?

  • 通过对象的内部地址(也就是物理地址)转换成一个整数,然后该整数通过hash函数的算法就得到了hashCode整型值

hashCode()相同equals()一定相同吗?

  • 两个对象hashCode相同,equals()不一定相同
  • 两个对象equals()相同,hashCode()一定相同

Java中的IO流分为几种?

  • 按功能分为: 输出流和输入流
  • 按类型分为: 字节流和字符流
  • 字节流和字符流的区别是: 字节流按8位传输,以字节为单位输入输出数据,字符流按16位传输,以字符为单位输入输出数据。

BIO,NIO,AIO有什么区别

  • BIO: Block IO同步阻塞式IO,就是我们平时使用的传统IO,数据的读取写入必须阻塞在一个线程内等待其完成,特点是模式简单,缺点是并发处理能力低
  • NIO: New IO同步非阻塞IO,是传统IO的升级,在Java1.4中引入了NIO框架,对应java.nio包,提供了 Channel ,Selector,Buffer等抽象,它支持面向缓冲,基于通道IO进行读写,并发处理能力较高
  • AIO: Asynchronous IO也在Java 7中引入的NIO升级版NIO2,异步非阻塞IO,基于事件回调机制实现的,应用不是很广泛
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值