四、JavaSE-面向对象基础

  1. Java面向对象编程的三大特性

封装:是面向对象三大特征之一,其含义有两个(掌握思想):

  • 把对象的字段和方法存放在一个独立的模块中(类)

  • 信息隐藏,尽可能隐藏对象的数据和功能的实现细节

封装的好处:

  • 提高组件的重用性,把公用功能放到一个类中,谁需要该功能,直接调用即可

  • 保证数据的安全性,防止调用者随意修改数据

继承:不同类型的对象,相互之间经常有一定数量的共同点。例如,小明同学、小红同学、小李同学,都共享学生的特性(班级、学号等)。同时每一个对象还定义了额外的特性使得他们与众不同。例如小明的数学比较好,小红的性格惹人喜爱;小李的力气比较大。继承时使用已存在的类定义作为基础建立新的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间,提高我们的开发效率。

关于继承如下3点请记住:

  • 子类拥有父类对象所有的字段和方法(包括私有字段和私有方法),但是傅雷中的私有字段和方法子类时无法访问,只是拥有。

  • 子类可以拥有自己得的字段和方法,即子类可以对父类进行扩展。

  • 子类可以用自己的方式实现父类的方法(方法的重写)。

多态:顾名思义,表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。

多态的特点:

  • 对象类型和引用类型之间具有继承(类)、实现(接口)的关系;

  • 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;

  • 多态不能调用”只在子类存在但在父类不存在“的方法;

  • 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。

  1. 构造方法有哪些特点?是否可被override?

构造方法特点如下:

  • 名字与类名相同。

  • 没有返回值,但是不能用void声明构造函数。

  • 生成类的对象自动执行,无需调用。

构造方法不能被override(重写),但是可以被overload(重载),所以你可以看到一个类中有多个构造函数的情况。

  1. 类的构造器的作用是什么?

构造方法是一种特殊的方法,主要作用是完成对象的初始化工作。

  1. 重载和重写的区别

  • 重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同顺序不同,方法返回值和访问修饰符可以不同

  • 重写:是子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名,参数列表必须相同,返回值范围小于父类,访问修饰符范围大于等于父类,抛出的异常范围小于父类。另外,如果父类方法访问修饰符为private则子类就不能重写该方法。也就是说方法提供的行为改变,而方法的外貌并没有改变。

  1. 接口抽象类的区别是什么?

共同点:

  • 都不能被实例化

  • 都可以包含抽象方法

  • 都可以有默认实现的方法(Java8可以用default关键字在接口中定义默认方法)。

区别:

  • 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。

  • 一个类只能继承一个类,但是可以实现多个接口。

  • 接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认default,可在子类中被重新定义,也可被重新赋值。

  1. 在调用子类构造方法之前会调用父类没有参数的构造方法,其目的是?

帮助子类做初始化工作,为了对象实例化

  • 子类中所有的构造器都会默认调用父类的无参构造器,因为每一个子类构造器内的第一行都有一条隐式的super()

  • 若父类中没有无参构造器,那么子类的构造器内必须通过super语句指定要调用父类中的构造器

  • 若子类构造器中用this来指定调用子类自己的构造器,那么被调用的构造器也一样会调用父类中的构造器

  1. ==与equals区别?

==:他的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型比较的是值,引用数据类型比较的是地址).

equals():它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价通过”==“比较这两个对象

  • 类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。

  1. final关键字修饰这三个地方:变量,方法,类,会有什么作用

  • 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

  • 当final修饰一个类时,表明这类不能别继承。final类中的所有成员方法都会被隐式地指定为fianl方法。

  • final修饰的方法不可以被重写。

  • 使用final方法的原因有两个。第一个原因就是把方法锁定,以防任何继承类修改它的含义;第二个原因时效率,在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行优化了)。类中所有的方法都隐式的指定为final。

  1. 描述深拷贝和浅拷贝

  • 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递的拷贝,此为浅拷贝。

  • 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

  1. 当某个场景下,接口与继承这2种均可用时,如何判断何种更合适?

继承:是面向对象分析与设计最常用的方式之一,在应用系统的设计过程中,得到了广泛的使用。它的主要不足是,继承后的系统需要囊括整个继承树的信息,对新系统而言,冗余部分相当大;二是子类对父类的耦合很紧密,不利于系统的扩展;

接口:有很大的灵活性,接口的不同实现方式,对于使用接口的客户而言,只是一种抽象的耦合。改变接口的实现,对客户代码的影响很小。

因此,如果某个功能的实现比较复杂,今后发生变化、引入不同实现方式的可能性比较大,一般采用接口的方式。如果有大量的功能,已经在父类得到实现,可以直接使用,并且,这些功能已经比较成熟,则采用继承的方式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值