1、面向过程与面向对象
1.1面向对象:
面向对象是一种编程思想,将数据和处理数据的程序封装到一个对象中。它关注的是功能。
1.2面向过程:
2、面向对象的特征
2.1封装
把描述的对象的特征(属性)和行为封装成一个类。封装还可以通过访问修饰符有效的控制对属性的访问。
2.2继承
把子类所共有的特征(属性)和行为(方法)抽取出来作为一个父类,所有子类都来继承该类,这样就拥有了父类的属性的行为,继承具有单一性和传递性。(单继承)
2.3多态
一个接口或父类,有多种实现方法。把子类或接口实现类赋给父类或接口引用,程序在运行时确定引用的对象。
多态的条件:
- 要有继承
- 子类重写父类方法
- 父类引用指向之类对象
2.4抽象
将一类对象的共同特征抽象出来,只关注它们有哪些属性和行为,不关注具体的实现细节
3.访问权限修饰符
image.png4.为什么要重写equals方法
一个对象如果没有重写equals方法,那么该对象的equals方法从Object类中继承而来。Object类中的equals方法实际上就是 == ,它比较的是地址。在实际业务中,可能我们判断两个对象实例是否相等,只要他们的属性值相等,我们就认为他们相等,这时候就要去重写equals方法。
5.重写equals方法为什么要重写hashcode方法
(没有重写过的hashcode是根据对象内存地址计算得来的)
两个对象相等,它们的hashcode一定等。两个对象的hashcode相等,它们不一定相等。这两条是java的规定。
对于使用哈希存储的集合(hashmap、set)、系统等,会增加哈希冲突的几率,导致系统性能下降。
6.重写重载区别
重写:重写是指子类重写父类的方法。
重写规范(两同、两小、一大)
(构造方法属于静态不能被重写)
- 两同:方法名相同,参数相同
- 两小:返回类型小于等于父类返回类型,抛出的异常要小于等于父类抛出的异常
- 一大:访问权限大于等于父类的访问权限
重载:指具有相同方法名,不同参数(类型不同、个数不同)的方法。返回类型可以相同也可以不同,但是无法以此作为是否是重载方法的判断依据。
7.为什么不能以返回类型来区分重载
如果有个方法:
int sum(int a,int b)
floag sum(int a,int b)
当你调用 sum(1,2)的时候,编译器不知道你要调用的是哪个方法,所以肯定会报错。
8.抽象类和接口的区别
1、不同
- 抽象类可以定义构造器,接口不可以
- 抽象类可以有抽象方法和具体方法,接口只可以有抽象方法
- 抽象类可以有普通成员变量,接口没有普通成员变量
- 抽象类可以有静态方法,接口没有静态方法
- 接口中成员变量实际都是常量
- 抽象类修饰符可以是private、默认、protected、public,接口成员修饰符为public
2、相同
- 都不能被实例化
- 都可以作为引用类型
9.==和 equals 的区别?
equals 和== 最大的区别是一个是方法一个是运算符。
==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象
的地址值是否相等。
equals():用来比较方法两个对象的内容是否相等。
注意:equals 方法不能用于基本数据类型的变量,如果没有对 equals 方法进行重写,则比较的是引用类型的变
量所指向的对象的地址。
10.创建String对象的方式
1、String str = "abc"
判断字符串常量池中是否存在"abc",存在则直接让str指向“abc”,不存在则在字符串常量池中创建“abc”对象,返回引用给str
2、String str = new String("abc")
栈中生成str引用,堆中生成字符串对象,返回引用给str,str指向堆中,判断常量池是否存在“abc”,不存在则在常量池中创建"abc"字符串
11.String + 拼接原理
-
String s1 = "abc" + "def";
这个拼接中"abc","def"都是常量,在编译期时jvm会对它优化,直接变成String s1 = "abcdef";
image.png
String s1 = "abc";
String s2 = s1 + "def";
这个拼接中存在这变量,这jvm在编译期是无法确定的,所以只能运行时来解决。java1.5以前时调用StringBuffer拼接,1.5以后调用StringBuilder拼接,返回toString给栈中变量。
image.png
12.多态实现机制
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动
态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变
量的类型中定义的方法。
13.java异常种类
照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异)也叫 RuntimeException。只有 java 语言提供了 Checked 异常,Java 认为 Checked异常都是可以被处理的异常,所以 Java 程序必须显式处理 Checked 异常。如果程序没有处理 Checked 异常,该程序在编译时就会发生错误无法编译。这体现了 Java 的设计哲学:没有完善错误处理的代码根本没有机会被执行。对 Checked 异常处理方法有两种:
- 当前方法知道如何处理该异常,则用 try...catch 块来处理该异常。
- 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
运行时异常只有当代码在运行时才发行的异常,编译时不需要 try catch。Runtime 如除数是 0 和数组下标越
界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检
测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。
网友评论