面向过程和面向对象:
如何理解面向过程,其实面向过程是流程化的,一步一步,上一步做完了再做下一步。
OOP是面向对象程序设计的英文缩写,面向对象是模块化的,将问题分解成各个对象,从而来解决问题,其实底层还是面向过程,只不过把面向过程抽象化了,封装成了方便调用的类。
面向对象的三大特征:
封装、继承、多态
封装:是指将对象的一些属性和方法进行私有化,外界只能通过接口来获取内部信息。
继承:通过extends关键字来实现,继承发生在子父类之间,子类继承父类的属性和方法,并且可以添加自己的新属性和方法。
继承的特点如下:
1、只支持单继承,即一个子类只允许有一个父类。
2、子类可以拥有父类的属性和方法。
3、子类可以拥有自己的属性和方法。
4、子类可以重写覆盖父类的方法。
5、可以声明父类,创建子类。
多态:是指同一个行为具有多个不同的表现形式的能力。
多态的好处:
可以提高代码的复用性;提高代码的扩展性;提高代码的可维护性。
重写:在Java中,子类可以重写父类的方法,从而实现多态性。重写是指子类中定义了一个与父类中同名同参数的方法,并且该方法的访问修饰符不能比父类中被重写的方法的访问修饰符更严格。
重写需要满足一下规则:
- 子类方法的访问修饰符不能比父类中被重写方法的访问修饰符更严格。
- 子类方法的返回类型必须与父类中被重写方法的返回类型相同,或者是其子类。
- 子类方法抛出的异常类型必须与父类中被重写方法声明的异常类型相同,或者是其子类。
- 子类方法的参数列表必须与父类中被重写方法的参数列表相同,或者是其子类。
方法的重载:是指在同一个类中,允许一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回类型无关。
需要注意的规则:
1.被重载的方法必须改变参数列表(参数的顺序、个数、类型);
2.被重载的方法可以改变返回类型;
3.被重载的方法可以改变访问修饰符;
4.被重载的方法可以声明新的或更广的检查异常;
5.方法能够在同一个类中或者在一个子类中被重载;
6.无法以返回值类型作为重载函数的区分标准。
重载与重写的区别:
重载的规则:
必须具有不同的参数列表;
可以有不同的返回类型,只要参数列表不同即可;
可以有不同的访问修饰符;
可以抛出不同的异常。
重写的规则:
参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载;
返回类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载;
访问修饰符的限制一定要大于等于被重写方法1的访问修饰符(public>protected>default>private);
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。(子类的异常一般是小于等于父类的)
成员变量与局部变量的区别有哪些?
1.语法上,成员变量是属于类的(在类内方法外),局部变量是在方法中定义的变量或是方法的参数(定义在方法内的);成员变量可以被 public 、private 、static 等修饰符修饰,而局部变量不能被访问控制修饰符及static所修饰;但二者均可被final修饰。
2.存储上,成员变量属于对象的一部分,存储在堆内存中;局部变量存储于栈内存中。
3.生存时间,成员变量属于对象的一部分,随对象的创建而存在,局部变量则是随着方法的调用而自动消失。
4.成员变量会被默认赋值,局部变量不会默认赋值
5.调用时,成员变量是 “ 对象名 .变量(方法) ”;局部变量则是 “类名 .变量(方法) ”
调用静态方法与调用成员方法(实例方法)的区别?
1.静态方法是通过static关键字进行修饰的,被static修饰的变量,方法是属于类。不需要创建该类的对象可以直接使用 “类名.变量(方法)” 的形式进行调用;
2.在类中把不用static关键字定义的方法都可以理解为成员方法,成员方法是通过创建对象后,通过“ 对象.方法名 ”的形式来进行调用的。
创建对象的方法:new运算符、反射、序列化和反序列化
new创建对象实例(对象实例在堆内存中);
反射:Java的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象的方法功能称为Java语言的反射机制。
Java反射可以用来获取一个class对象或实例化一个class表示的类对象,还可以获取构造方法、成员变量、成员方法。(动态加载一个指定的类并获取该类中的所有内容)。
序列化和反序列化
序列化:将对象以二进制的形式保存在,把Java对象转换为字节序列。
反序列化:将二进制的文件转化为对象读取,把字节序列恢复为原先的Java对象。
通过实现Serializable接口来实现序列化,它表示该类对象是可被序列化。
构造方法:
构造方法的主要作用是完成对类对象的初始化工作。
相关特性:
1.名字与类名相同;
2.没有返回值,但不能用void声明构造函数;
3.生成类的对象时自动执行,无需调用。
构造器不可以被重写但是可以被重载,所以会有一个类中有多个构造函数的情况。
举例:
//无参构造器
public Person(){
name = "unknown";
age = 0;
}
//有参构造器
public Person(String name , int age ){
this.name = name;
this.age = age;
}
构造器是否可以被重写?
Constructor不能被override(重写),但是可以overload(重载),所以你可以看到一个类中有多个构造函数的情况。
构造器是一种特殊的方法,用于创建和初始化对象的,不可以被重写。构造器通常完成为对象的成员变量赋值;在对象创建时对成员变量进行初始化;为对象进行必要的预处理。
String类可以被继承吗?
不可以,因为string类使用final修饰,无法被继承。
String s = new String(" xyz ")创建了几个字符串对象?
一个或两个,如果字符串常量池已经有" xyz ",则是一个,反之,两个(一个是在字符串常量池中的,另一个则是通过new String()创建并初始化的)。
访问权限修饰符有哪些?作用域分别是什么?
1. public 在Java中访问权限最大,对所有类都可见。
2. protected 表示保护的意思,对同一个包内的类和所有子类可见。
3. default 是Java中默认访问权限修饰符,表示不指定任何访问权限修饰符时所使用的访问权限,在同一个包内可见。
4. private 表示私有,仅在同一个类可见。
向上转型和向下转型:
向上转型:(其实是父类的引用指向子类的引用)通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换。
向下转型:通过父类对象(大范围)实例化子类对象(小范围),在书写上父类对象需要加括号强制转换为子类类型。
ArrayList、LinkedList、Vector 的异同:
ArrayList和LinkedList都是线程不安全,Vector线程安全;
ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表的数据结构。对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针。对于新增(add)和删除(remove),LinkedList要优于ArrayList,因为ArrayList要移动数据。
Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于
强同步类,开销比ArrayList大,访问要慢。 Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。
抽象类的特点:
- 抽象类不能被初始化
- 抽象类可以有构造方法
- 抽象类的子类如果为普通类,则必须重写抽象类中的所有抽象方法
- 抽象类中的方法可以是抽象方法或普通方法
- 一个类中如果包含了一个抽象方法,这个类必须是抽象类
- 子类中的抽象方法不能与父类中的抽象方法同名
- 抽象方法不能为 private、static、final 等关键字修饰
- 抽象类中可以包含普通成员变量,访问类型可以任意指定,也可以使用静态变量(static)
break,continue,return的区别?
break结束当前循环体;
continue结束当前循环,进行下一个循环条件;
return结束当前的方法直接返回。
一个类的构造方法的作业是什么?若一个类没有声明构造方法,该程序能正确执行吗?为什么?
主要作用是完成对类对象的初始化工作。可以执行,因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。
在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
帮助子类做初始化工作。(进一步解释,首先创建子类会隐式地去创建父类)
String类可以被继承吗?
不可以,String类使用final修饰,无法被继承。
== 与 equals 的区别?
对于基本数据类型,== 比较的是数值;
对于引用数据类型,== 比较的是地址;
equals不能用于比较基本数据类型,在没有重写的情况下,equals相当于 == ,比较的是地址;
如果重写了equals方法,equals比较的是对象的内容。
Object的clone方法是深拷贝还是浅拷贝?
是浅拷贝;
浅拷贝:只拷贝栈内存的数据,不拷贝堆内存中的数据;
深拷贝:既拷贝栈内存的数据,也拷贝堆内存中的数据。
object类的方法有:equals、clone、toString(返回对象的字符串)。
this关键字与super关键字:
this关键字常用的方法是指向当前对象,除此之外还有:
调用当前类的方法;
this可以调用当前类的构造方法;
this可以作为参数在方法中传递;
this可以作为参数在构造方法中传递;
this可以作为方法的返回值,返回当前类的对象。
super关键字的方法:
指向父类对象;
调用父类的方法;
super关键字可以调用父类的构造方法。
StringB3uilder和StringBuffer的区别:
二者均是当出现大量字符串拼接时使用的,且SringBuffer和StringBuffe类的对象都可以被多次修改,不产生新的未使用的对象。
在使用StringBuffer类时,每次都会对String Buffer对象本身进行操作,而不是生成新的对象,所以如果对字符串进行修改推荐使用StringBuffer。
StringBuilder和StringBuffer最大的区别在于StringBuilder是线程不安全的;
但StringBuilder的速度要优于StringBuffer。