怎么理解面向对象?
理解面向对象编程,那就要将面向过程编程和对象一起讨论:
-
Procedure Oriented Programming 简称POP
- 是一种基本的编程思想,将一件事按照步骤一步步执行实现。这种方法强调执行过程(细节)。
- 如猜数游戏,猴子偷桃,闰年等问题,需要编程这一步步推理,有逻辑。
- 缺点:如果逻辑复杂,计算推理量大,过程复杂等。所有有了面向对象编程
-
2.Object Oriented Programming 简称OOP
-
创建解决问题的对象 ,让各个对象调用各自的方法而配合完成。 在面向对象编程OOP 中,给类中定义的方法,具体的实现过程,其实也是面向过程的。
- 简单来说需要的方法已经定义好了(描叙执行过程的),直接调用该方法就能完成想要的功能。
-
3.(说人话)区别:面向过程:亲力亲为,侧重于分析完成事情的过程。
-
面向对象:所有事情交给相应的对象完成,侧重于如何创建解决问题的对象。
-
面向对象的3大特性?
封装private
将类中的属性使用
private修饰
,这样就能
防止非当前类对其访问
。
封装的步骤:
1.
给类中的所有属性添加
private
访问修饰符
2.
给每个属性添加
getXXX()方法用于读取属性值
3.
给每个属性添加
setXXX()方法用于给属性赋值
继承override
类
A extend
类
B
。类
A
就是类
B
的子类,类
A
的对象就能直接访问类
B
中非私有成员。
或接口
A extends
接口
B
。
重载overload
在一个类中,某个方法在不同的参数下,表现不同的行为。
同名不同参。
重载与重写相关面试题
说出重载与重写的异同
相同点:方法名不变
不同点:
行为不同,参数不同
构造方法能重载吗?能重写吗?
构造方法可以重载,不能重写。
构造方法在执行时,一定创建对象吗?
不一定。创建子类时会自动执行父类构造方法,但不会创建父类对象
Object类
是所有类的父类。任何类都间接地继承了该类,但没有明确地使用
extends
体现出来。所有类都可以访
问
Object
类中的方法,或对其进行重写。
面向对象三大特性--多态
多态就是子类的对象指向父类的引用
(
子类对象使用父类变量接收,即向上转型
)
。
父类 变量
= new
子类
();
应用:如要调用动物发出叫声的方法,参数为猫,输出喵喵叫,参数为狗,输出汪汪叫。
不用多态,需要写多个重载的方法,参数为猫或狗的具体类型。
this和super 关键字理解
都可以当做对象或构造方法使用。
当做对象:
this
表示当前类的对象
,
super
表示当前类的父类对象。
this
或
super
当做对象使用时,只能用在非静态方法中。
当做构造方法:
this()
表示当前类的无参数构造方法,如果带参数就表示对应参数的构造方法。
super()
表示当前类的父类的无参数构造方法,如果带参数就表示对应参数的构造方法。
this()或super()
只能用在另一个构造方法的首行。
-
对象和类
object对象:某个类的具体实例
class类 :是拥有相同属性和行为的对象的集合。称为“一类”,可以理解为“模板”。定义类:创建对象:修饰符 class 类名 {// 属性:定义变量// 行为:定义方法}类名 变量名 = new 构造方法 ([ 参数 ]);类和对象的关系
对象是类的具体表现,类是对象的集合 ( 模板 ) 。如包饺子的模具就是一个类,每次用这个模具包出来的饺子都是一个一个对象。先定义类,才能通过该类创建对成员变量和局部变量的区别
成员变量:定义在类中的变量,即类的属性。它有默认值。通过对象访问。局部变量:定义在方法中的变量。它没有默认值。只能在方法 中赋值后才能使 用。静态常量:特殊的成员变量,用 final static 修饰。它有默认值。通过类名访问。成员变量的生命周期:类创建对象,成员变量初始化;类的对象被回收,成员变量销毁。局部变量的生命周期:方法开始调用,局部变量初始化;方法调用结束,局部变量销毁。构造方法
是一种特殊的方法。方法名和类名一致,没有返回值部分。
特性
1.在使用 new 关键字创建对象时,调用对应的构造方法。2.每个类在定义后,都隐藏有一个无参的构造方法。3.如果自定义了有参数的构造方法,无参数的构造方法就会失效。如果想要使用无参构造方法,就要 再写出来。4.构造方法 通常用于限制创建对象时携带的参数,初始化成员变量。5.构造方法之间都是重载关系,构造方法不能重写。6.构造方法执行时,不一定会创建对象。如抽象类中有构造方法,但无法创建抽象类对象,只能在创建抽象类的子类对象时,自动调用抽象类的构造方法。格式:访问修饰符 类名 (){}构造方法作用?
通常用于限制创建对象时携带的参数,初始化成员变量。如果没有声明构造方法能执行吗?
可以,因为一个类即使没有声明构造方法,也会有默认的不带参数的构造方法。
为什么在调用子类的构造方法之前会先调用父类没有参数的构造方法,其目的是?
1.帮助子类初始化,目的为了对象的实例化。
2.子类中所有的构造方法都会默认调用父类的中的无参构造方法,因为每个子类构造方法的第一行都是一条隐式的super()
流程代码解释:
public class Father {/*默认会有public Father(){}*/}public class Son extends Father {/*默认会有public Son(){super();}*/}注意3.父类中没有无参数的构造方法,子类中就必须调用父类中对应的构造方法
public class Father {private String name ;// 由于该构造方法的出现,默认无参的构造方法就会失效public Father ( String name ){this . name = name ;}}public class Son extends Father {public Son ( String name ){// 这里必须要调用父类中的构造方法,否则无法通过编译super ( name );}抽象类和接口的异同
抽象类是一个类,用 abstract class 定义有构造方法,不能创建对象,在创建子类对象时调用构造方法抽象类中可以有抽象方法,也可以有普通方法抽象类被子类继承时,使用extends 关键字。子类必须重写父类中的所有抽象方法子类只能继承一个抽象类接口不是一个类,用interface定义没有构造方法,不能创建对象接口中的属性都是公共的静态常量接口中的方法都是公共的抽象方法JDK1.8后,可以在接口中定义 default 方法和 static 方法接口被实现类实现时,使用implements 关键字。实现类必须重写父接口中的所有抽象方法实现类可以实现多个接口相同点:
接口和抽象类都不能创建对象接口的实现类和抽象类的子类,都需要重写抽象方法什么是方法的返回值?返回值在类的方法里作用是?
1.方法的返回值是某个方法体中的代码执行后产生的结果。
2.作用接受结果使其能够用于其他操作。
对象的相等与他们的引用的相等有什么区别?
对象的相等:是指比的是内存中存放的内容是否相等
引用相等:比较的是他们指向的内存地址是否相等。
构造方法、静态块、方法块中的方法执行顺序是怎么样的?
静态代码块”,》“构造方法”,》“方法块”
abstract:
用于修饰类和方法,表示抽象的。修饰方法,方法成为抽象方法,没有方法体,同时该方法的所在类也一定要用 abstract 修饰,让其成为 抽象类抽象类和普通类区别
抽象方法只能出现在抽象类中,不能出现在普通类中。抽象类中可以没有抽象方法。抽象类中有构造方法,但该构造方法只会在 new 抽象类的子类对象时会自动调用,抽 象类不能创建自身对象。抽象类通常需要被继承 ,一旦有子类继承了抽象类,就必须要重写抽象类中的所有抽象方法。抽象类存在意义:就是为了被继承,依靠子类实例化【实现梦想】,只是画大饼。普通类:可以实例化后调用自己类的属性方法和父类的方法属性。普通类存在意义就是实例化【实现】。抽象类能使用final修饰吗?
不能。抽象类就是让子类继承的,定义为final类最终的,final类定义为不能继承不能修改的,就会矛盾。