【Java八股文总结】之面向对象

Java面向对象基础

一、面向对象基础

在这里插入图片描述

1、什么是封装?

封装 是指 将类的属性隐藏在内部,外部不能直接访问和修改 ,如何实现?
通过修改成员变量的可见性,从公有改为私有。
封装的核心思想就是 尽可能把属性都隐藏在内部,对外提供方法来访问,我们可以在这些方法中添加逻辑处理来实现过滤,以屏蔽错误数据的赋值。

2、什么是继承?

继承 是用来描述类之间的关系的,即一个类继承(拥有)另外一个类中的属性和方法,被继承的类叫做父类,继承父类的类叫做子类。
继承的基本语法: extends 关键字

public class 类名 extends 父类名 {

}

Java中的继承是单继承,也就是说一个子类只能有一个直接父类。

1、子类访问父类

创建一个子类对象的时候,会默认先创建一个父类对象,无论是通过有参构造或是无参构造来创建子类对象,都是通过无参构造来创建父类对象的。
可以通过 super 关键字让子类创建对象时调用父类的有参构造。

public Student(){
	super(1);
	System.out.println("通过无参构造创建了Student对象");
}

子类可以访问父类的构造方法、普通方法、成员变量,都是通过 super 关键字来完成,具体语法:
构造方法: super(参数列表)
普通方法: super.方法名(参数列表)
成员变量: super.成员变量名
注意: 在子类的构造方法中,可以通过super访问父类的构造方法和普通方法。在子类的普通方法中,只能通过super访问父类的普通方法。

2、子类的访问修饰符

Java访问权限修饰符:public、protected、默认修饰符、private。
在这里插入图片描述

3、方法重写

子类在继承父类方法的基础上,对父类方法重新定义并覆盖的操作叫做 方法重写构造方法不能被重新,方法重写的规则:

  1. 父子类的方法名相同
  2. 父子类的方法参数列表相同
  3. 子类方法的返回值与父类方法返回值类型相同或者是其子类
  4. 子类方法声明抛出的异常类型与父类方法相同或是其子类
  5. 子类方法的访问权限不能小于父类
3、什么是多态?

一个事物具有多种表现形态,在Java程序中,定义一个方法,在具体的生成环境中根据不同的需求呈现不同的业务逻辑,多态的前提是继承
多态的具体使用有两种形式:

  1. 定义方法时形参类型为父类,实际调用方法时传入子类类型的参数。
  2. 定义方法时返回值类型为父类,实际调用方法时返回子类对象。
    以上两种形式的基本原理都是**父类引用可以指向子类对象**。
1、Java语言如何实现多态

本质上多态分两种:
①编译时多态(又称静态多态)
重载(overload) 就属于编译时多态,编译时多态在编译时就已经确定,运行时调用的是确定的方法。
②运行时多态(又称动态多态)
通常所说的多态指的都是运行时多态,也就是编译时不确定究竟调用哪个具体方法,一直等到运行时才能确定(如子类继承父类后实现的方法)。

2、什么时候使用多态?

①方法参数列表: 代码量大了之后,一些逻辑可以提取出来成为公共的部分,剩余的部分就自然而然地成为多态了。
如:定义方法参数列表时定义为父类类型,这样就可以传递任意子类类型的对象,从而根据传入不同的子类对象来实现不同子类的方法。
②向上转型: 在多态中需要将父类的引用指向子类的对象,只有这样该引用才既可以调用父类的方法,又能调用子类的方法。

Person per = new Student();
4、什么是接口?

接口是 由抽象类衍生出来的 一个概念,并由此产生了一种编程方式:面向接口编程。
面向接口编程就是将程序中的业务模块进行分离,以接口的形式去对接不同的业务模块。
面向接口编程的优点:当用户需求变更时,只需要切换不同的实现类,而不需要修改串联模块的接口,减少对系统的影响。

  1. 能够最大限度实现解耦合,降低程序的耦合性。
  2. 使程序易于扩展
  3. 有利于程序的后期维护。
5、怎么使用接口?

接口在Java中时独立存在的一种结构,和类相似,我们需要创建一个接口文件,Java 中用class关键字来标识类,用 interface 来标识接口,基本语法:

public interface 接口名{
	public 返回值 方法名 (参数列表);
}

接口其实就是一个抽象类,极度抽象的抽象类。
抽象类: 一个类中一旦存在没有具体实现的抽象方法时,那么该类就必须定义为抽象类,同时抽象类允许存在非抽象方法。
但是接口完全不同,接口中不能存在非抽象方法,接口中必须全部是抽象方法=。
因为接口中必须全部都是抽象方法,所以修饰抽象方法的关键字abstract可以省略。
接口中允许定义成员变量,但是有如下要求:

  1. 不能定义private和protected修饰的成员变量,只能定义public和默认访问权限修饰符修饰的成员变量。
  2. 接口中的成员变量在定义时就必须完成初始化。
  3. 接口中的成员变量都是静态常量,即可以直接通过接口访问,同时值不能被修改。
    注意: 使用接口时,不能直接实例化接口对象,而必须实例化其实现类对象,实现类本身就是一个普通的Java类,创建实现类的代码如下所示。
public class MyInterfaceImpl implements MyInterface {
	@Override
	public void test() {
		// TDDO Auto-generated method stub
	}
}

通过 implement 关键字来指定实现类具体要实现的接口,在实现类的内部需要对接口的所有抽象方法进行实现,同时要求访问权限修饰符、返回值类型、方法名和参数列表必须完全一致。
接口和继承,Java类只支持单继承,但是接口可以多实现(一个实现类可以同时实现多个接口)。

6、Java中创建对象的方式?

Java种创建对象共有5种方式:

  1. new关键字;
  2. 类的Class.newInstance();(反射机制)
  3. 构造器的Constructor.newInstance();
  4. Clone()方法;
  5. 反序列化;
    参考链接:Java中创建对象的5种方式
7、对象实体和对象引用的区别?

对象实体在堆内存中;对象引用指向对象实例,对象引用存放在栈内存中。
举例: 一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。

8、对象相等和引用相等

对象相等:比较的是内存中存放的 内容是否相等
引用相等:比较的是它们指向的 内存地址是否相等

9、类的构造方法的作用?

完成**对象的初始化**。

10、构造方法的特点?是否可以被override?

在这里插入图片描述

11、重载和重写的区别
  • 重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同(参数列表不同),方法返回值和访问修饰符可以不同(没有要求),发生在编译时。
public int add(int a,String b)
public String add(int a,String b)
// 编译错误

返回值不同不是方法重载。

  • 重写: 发生在子类继承父类时,方法名和参数列表必须相同,返回值范围小于等于父类,抛出异常的范围小于等于父类,访问修饰符的范围大于等于父类;如果父类方法的访问修饰符是private,则子类不能重写该方法。
12、面向对象三大特征

在这里插入图片描述
在这里插入图片描述

13、接口和抽象类的区别?

在这里插入图片描述
在这里插入图片描述
抽象类 可以存在普通成员函数,而 接口 中只能存在public abstract抽象方法
抽象类 中的成员变量可以是各种类型的,而 接口 中的成员变量只能是public static final常量类型的
抽象类 只能继承一个接口 可以实现多个
抽象类和接口都不允许实例化
注意: Java中是单继承,多实现。(即继承只能是单继承,一个子类仅有一个父类。接口可以多实现,即一个实现类可以同时实现多个接口)
接口的设计目的,是对类的行为进行约束 (更准确的说是一种 “有” 约束, 因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。
抽象类的设计目的,是代码复用 。当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各个子类自己实现。正是因为A-B在这里没有实现,所以 抽象类不允许实例化 出来(否则当调用到A B时,无法执行)。
抽象类对类本质的抽象,表达的是is a的关系,比如:BMW is a Car。抽象类包含并实现子类的通用特性,将子类存在差异化的特性进行抽象,交由子类去实现。而 接口对行为的抽象,表达的是like a的关系。
比如: Bird like a Aircraft (像飞行器一样可以飞),但其本质上 is a Bird。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁、是如何实现的,接口并不关心。
使用场景: 当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。 在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口,在设计阶段会降低难度。

补充:
1、接口(关键字:interface

何谓接口? Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口中全是抽象方法。

  1. 接口不能实例化,因为接口中的方法都是抽象的,是没有方法体的。怎样产生具体的实例呢?使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法。
  2. 一个类可以实现多个接口。
  3. 一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法!!!
  4. 接口中所有的方法都是抽象的和public的,所有的属性都是public、static、final的。
  5. 接口用来弥补类无法实现多继承的局限。
  6. 接口也可以用来实现解耦。
2、抽象类(关键字:abstract

抽象方法: 只声明未实现(即没有方法体的方法)。
抽象类: 包含抽象方法的类(抽象类中不只有抽象方法)。

  1. 抽象类中可以没有抽象方法,但是有抽象方法的必须是抽象类。即一个类包含了抽象方法,那么该类一定是抽象类。
  2. 继承抽象类的子类必须重写父类所有的抽象方法!!!
  3. 抽象类不能创建对象!!!(即不能实例化),如果创建,编译无法通过而报错,只能创建其非抽象子类的对象。
  4. 抽象类中,可以有构造方法,供子类创建对象时,初始化父类成员。
  5. 不能用abstract修饰变量,代码块,构造器。
    (最重要的特征:得到了抽象方法,失去了创建对象的能力!!!)
3、抽象方法、抽象类

①抽象方法: 只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达上就是没有“{}”。使用 abstract 修饰符来表示抽象方法和抽象类。
②抽象类: abstract修饰符表示所修饰的类没有完全实现,还不能实例化。
如果在类的方法声明中使用abstract修饰符,表明该方法是一个抽象方法,它需要在子类实现。如果一个类包含抽象方法,则这个类也是抽象类,必须使用abstract修饰符,并且不能实例化。
抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。

4、为什么使用抽象类?

由于父类方法的不确定性,所以用抽象类来把父类设计的抽象,以至于它都没有任何具体的事例,所以没有必要在父类里写,可以精简代码。(比如我们在实现多态的时候,就是会定义许多实现类去继承父类,父类中没有必要去实现方法,只需要定义即可,使用抽象类定义父类,可以精简代码)

5、abstract和final是什么关系?

互斥关系。
abstract定义的抽象类作为模板让子类继承;final定义的类不能被继承。
抽象方法定义通用功能让子类重写;final定义的方法子类不能重写。

6、abstract和static是什么关系?

abstract修饰的方法是抽象方法,只有定义没有实现。
static修饰的静态方法属于类,可以直接使用”类名.方法名“调用,使用类名调用抽象方法是没有意义的。

13、深拷贝和浅拷贝有什么区别?什么是引用拷贝?

深拷贝: 拷贝整个对象。
浅拷贝: 如果是引用对象,则直接复制对象引用地址,不拷贝对象里面的内容。
引用拷贝: 两个不同的引用指向同一个对象。
在这里插入图片描述
因此深拷贝是安全的,浅拷贝的话如果有引用类型,那么拷贝后对象,引用类型变量修改,会影响原对象。

Q:浅拷贝如何实现呢?

Object类提供的 clone() 方法可以非常简单地实现对象的浅拷贝。

Q:深拷贝如何实现呢?
  • 重写克隆方法: 重写克隆方法,引用类型变量单独克隆,这里可能会涉及多层递归。
  • 序列化: 可以先将原对象序列化,再反序列化成拷贝对象。
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值