面试题~汇总

一、.面向对象OOP


2.1 面向对象与面向过程
两者都是一种编程的思想
面向对象强调的是事情的结果,我们通过对象完成对应的功能
面向过程强调的是事情的过程,我们做任何事情,都要亲力亲为,经过每一个步骤
Java是一门面向对象的语言
2.2 类与对象
定义类通过关键字class来定义,类是一类事物的抽象,它是抽象的,它是模板
创建对象通过new关键字触发构造函数生成,对象是根据类创建出来的具体的内容
一个类可以创建出多个对象,对象是根据类的设计来创建的,所以对象具有类的所有属性与功能
对象之间是相互独立的,互不影响。我们把创建对象也称作“实例化”
2.3 面向对象的三大特性:封装
前提:为了保证数据的安全,也为了程序的使用者能够按照我们预先设计好的方式来使用资源
封装属性:用private修饰我们的属性
然后为属性提供对应的getXxx()【获取属性值】与setXxx()【设置属性值】
封装方法:用private修饰方法,被修饰的方法只能在本类中使用,所以我们在本类的公共方法里调用这个私有方法
外界如果想要使用这个私有方法的功能,只需要调用这个公共方法就可以了
2.4 面向对象的三大特性:继承
前提 :继承可以实现程序的复用性,减少代码的冗余
我们通过extends关键字建立子类与父类的继承关系:格式:子类 extends 父类
继承相当于子类把父类的功能复制了一份,包括私有资源
注意:虽然私有资源继承了,但是私有资源不可用,原因是被private限制了访问,私有资源只能在本类使用
注意:构造方法不能继承,原因是:构造方法要求名字是本类的类名,我们不能在子类中出现父类名字的构造方法
继承是可以传递的:爷爷的功能会传给爸爸,爸爸的功能会传给孙子
注意:爸爸从爷爷那里继承的功能,也会一起传给孙子
Java的类是单继承的:一个子类只能有一个父类,但是一个父类可以有多个子类
子类在继承了父类以后,如果对父类的功能不满意
可以在不修改父类功能的【满足OCP原则】前提下,在子类中,重写继承过来的这个方法
重写需要满足的规则:两同 两小 一大,我们可以在重写的方法上加@Override注解验证是否写对
继承是一种is a的关系,强耦合,关联性特别强,而且类的继承机会只有一次,要谨慎使用
子类可以直接使用父类的所有非私有资源
2.5 面向对象的三大特性:多态
前提:为了忽略子类型之间的差异,统一看作父类类型,写出更加通用的代码
比如:把Cat看作Animal,把Dog看作Animal,把Bird看作Animal,如果方法需要设置传入的参数,可以buy(Animal a)
比如:把算术异常、输入不匹配异常都看作是Exception,统一捕获处理,只写一个解决方案
概念:在同一时刻,同一个对象,代表的类型不同,拥有多种形态
6.多态的要求:继承 + 重写
多态的口诀1:父类引用指向子类对象:父类型的引用类型变量保存的是子类对象的地址值
多态的口诀2:编译看左边,运行看右边:
父类中定义的功能,子类才能使用,否则报错
多态中,方法的定义看的是父类的,方法的实现看的是子类重写后的功能;

7.多态中资源的使用:
1)成员变量:使用的是父类的
2)成员方法:对于方法的定义看的都是父类的,对于方法实现,重写后使用的是子类的
3)静态资源:静态资源属于类资源,不存在重写的概念,在哪个类中定义的,就属于哪个类
向上造型与向下造型
1)这两种都属于多态,只不过是多态的两种不同的表现形式
2)向上造型【最常用】
可以把不同的子类型都看作是父类型,比如Parent p = new Child();
比如:花木兰替父从军,被看作是父类型,并且花木兰在从军的时候,不能使用自己的特有功能,比如化妆
3)向下造型
前提:必须得先向上造型,才能向下造型
子类的引用指向子类的对象,但是这个子类对象之前被看作是父类类型,所以需要强制类型转换
Parent p = new Child(); 然后:Child c = (Child) p;
比如:花木兰已经替她爸打完仗了,想回家织布,那么这个时候,一直被看作是父类型的花木兰必须经历“解甲归田”【强制类型转换】这个过程,才能重新被看作成子类类型,使用子类的特有功能
为什么有向下造型:之前被看作是父类类型的子类对象,想使用子类的特有功能,那就需要向下造型
2.7 this与super
this代表的是本类,super代表的是父类
当本类的成员变量与局部变量同名时,我们可以通过this.变量名指定本类的成员变量
当父类的成员变量与子类的变量同名时,我们可以通过super.变量名指定父类的成员变量
我们可以在本类构造函数的第一行
使用this();调用本类的无参构造 / 使用this(参数); 调用本类对应参数的构造方法
构造函数的调用只有这一种方式,或者创建对象时被动触发,不能在外面自己主动调用
构造函数直接不能互相调用,否则会死循环
我们可以在子类构造函数的第一行
使用super();调用父类的无参构造 / 使用super(参数); 调用父类对应参数的构造方法
注意:子类默认调用super();父类的无参构造,如果父类没有无参构造,需要手动指定调用哪个含参构造
2.9 方法的重写与重载
方法的重写:
继承后,子类想在不改变父类代码的前提下,修改或者拓展功能
重写的规则:两同 两小 一大
1. 子类与父类的方法名要保持一致
2. 子类与父类的方法的参数列表要保持一致
3. 子类的返回值类型小于等于父类方法的返回值,这里说的是继承关系,不是值的大小
4. 子类的抛出异常类型小于等于父类方法抛出的异常类型
5. 子类方法的修饰符大于等于父类方法的修饰符
6. 注意:我们可以使用@Override注解标记这是一个重写的方法

方法的重载:
在同一个类中,存在两个或者两个以上的方法,方法名相同,但参数列表不同的现象
作用:重载提高程序的灵活性,只要用户调用这个方法,不管传入什么参数,都能匹配的上
注意:方法是否构成重载,除了前两项以外,看的是参数的个数与类型,与方法的参数名字没关系

3.7 接口与抽象类的区别
接口是一种用interface定义的类型
抽象类是一种用class定义的类型
接口中的方法都是抽象方法
抽象类中的方法不做限制
接口中的都是静态常量
抽象类中可以写普通的成员变量
接口没有构造方法,不可实例化
抽象类有构造方法,但是也不可以实例化
接口是先天设计的结果,抽象是后天重构的结果
接口可以多继承
抽象类只能单继承

3.7 异常
异常的继承结构
异常层次结构中的根是Throwable
Error:目前我们编码解决不了的问题
Exception:异常
编译异常:未运行代码就报错了, 那你
运行时异常RunTimeException:运行代码才报错,可以通过编译,不强制要求处理
异常的解决方案
捕获处理try-catch–自己解决

向上抛出throws–交给别人解决,在方法定义的两个小括号之间throws,可抛出多个异常,用逗号隔开

不能直接把异常抛给main(),因为调用main()是JVM,没人解决了
注意:是否抛出异常取决于自己的业务,比如暂时不处理或者处理不了需要交给别人处理

成员内部类
位置:类里方法外
1)被private修饰
被私有化的内部类在main()中是没有办法直接创建其对象的
可以在私有内部类所处的外部类中,创建一个公共的方法供外界调用,这个方法用来返回创建好的私有内部类对象
2) 被static修饰
静态内部类可以不创建外部类对象,直接创建静态内部类对象,格式:Outer3.Inner3 oi = new Outer3.Inner3();
如果静态内部类中还有静态方法,那么我们可以不创建对象
直接通过链式加载的方式调用:Outer3.Inner3.show2();//表示通过外部类名直接找到静态内部类,再找到静态方法

局部内部类
位置:方法里
直接创建外部类对象,调用局部内部类所处的方法,并不会触发局部内部类的功能
需要在外部类中创建局部内部类的对象并且进行调用局部内部类的功能,才能触发内部类的功能

匿名内部类
位置:可运行代码中,比如 main()中
匿名内部类通常与匿名对象【没有名字的对象】一起使用
格式:new Inter1(){ 我这个大括号其实是一个匿名内部类,我来实现方法 }.eat();
如果只是想使用一次接口/抽象类的某个功能,可以使用匿名内部类
匿名内部类+匿名对象的功能:创建实现类+实现方法+方法功能的一次调用【功能三合一】

3 基础API

1.equals和==的区别

等号比较的其实是地址值;

equals比较的是值是否相同,equals:1、先比较地址,通过返回true ,不通过再判断括号内的对象是不是string类型,如果不是string类型返回false,如果是string类型继续判断两个字符串的长度,如果长度不相等返回false,如果长度相等继续对字符串里面的每个字母进行对比,如果有一个字母不相同就返回false直到对比到最后一个字母都没有问题,然后返回true

3.2 String
String底层维护的是一个char[],而且String不可变,因为源码中的数组被final修饰了
创建方式:
char[] vlaues = {‘a’,‘b’,‘c’}; String s = new String(values);
String s = “abc”;有高效的效果,因为串存在堆中的常量池,第二次使用时就不再新建了

  1. 常用方法:

int hashCode() 返回此字符串的哈希码。
boolean equals(Object anObject) 将此字符串与指定的对象比较,比较的是重写后的串的具体内容
String toString() 返回此对象本身(它已经是一个字符串!)。

 int length() 返回此字符串的长度。
String toUpperCase() 所有字符都转换为大写。
String toLowerCase() 所有字符都转换为小写
boolean startsWith(String prefix) 测试此字符串是否以指定的元素开头。
boolean endsWith(String suffix) 测试此字符串是否以指定的字符串结束。

char charAt(int index) 返回指定索引/下标处的 char 值/字符
int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。
int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。
String concat(String str) 将指定字符串连接/拼接到此字符串的结尾,注意:不会改变原串
String[] split(String regex) 根据给定元素来分隔此字符串。

String trim() 返回去除首尾空格的字符串
byte[] getBytes() 把字符串存储到一个新的 byte 数组中
String substring(int beginIndex) 返回一个新子串,从指定下标处开始,包含指定下标
String substring(int beginIndex, int endIndex) 返回一个新子串,从执定下标开始,到结束下标为止,但不包含结束下标
static String valueOf(int i) 把int转成String

3.3 StringBuilder与StringBuffer

String的:

特点:
创建之后长度内容是不可变的,每次拼接字符串,都会产生新的对象
优缺点:
优点:String类提供了丰富的关于操作字符串的方法,比如:拼接、获取对应下标处的字符、截取子串等等
缺点:在进行字符串拼接+=的时候,效率比较低
String转StringBuilder:
String s = “abc”; StringBuilder sb = new StringBuilder(s);

StringBuilder的:

特点:
StringBuilder是一个长度可变的字符串序列,在创建的时候,会有一个长度为16的默认空间
当拼接字符串的时候,是在原对象的基础之上进行拼接,如果长度不够就扩容
所以StringBuilder在创建之后,对应的操作一直是用一个对象
创建方式:
StringBuild

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值