Java复习,Java知识点以及Java面试题(二)

面向对象:封装,继承,多态

类:相关属性和行为的集合。 对象:该类的具体体现

成员变量和局部变量的区别:

位置:成员变量在类中方法外;局部变量在方法定义中或者方法声明上。

内存中的位置:成员变量在堆内存;局部变量在栈内存。

生命周期:成员变量随着对象的创建而存在,随着对象的消失而消失;局部变量随着方法的调用而存在,随着方法的调用完毕而消失

初始化值:成员变量有默认初始化值;局部变量没有默认初始化值,必须定义,赋值,然后才能使用。

匿名对象:仅仅只调用一次的时候,匿名对象调用完就是垃圾,可以被GC回收

用法:匿名对象可以直接调用方法,也可以作为实际参数传递

封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方法。提高代码复用性,提高代码安全性。

原则:将不需要对外提供的内容隐藏起来。把属性隐藏,提供公共方法对其访问。

private关键字:被private修饰的成员变量或成员方法只能在本类中访问。

this关键字:当前类的对象引用

构造方法:给对象的数据进行初始化,方法名与类名相同,没有返回值类型,没有返回值。

创建对象做了哪写事情:Student s = new Student();

把Student.class文件加载到内存

在栈内存给s变量开辟一个空间

在堆内存为学生对象申请一个空间

给成员变量进行默认初始化

给成员变量进行显示初始化

通过构造方法给成员变量进行初始化

数据初始化完毕,把堆内存的地址值赋值给s变量

static关键字(修饰成员变量,成员方法):针对多个对象有共同的成员变量的时候,Java提供static关键字来修饰

特点:随着类的加载而加载

优先于对象存在

被类的所有对象共享

可以通过类名来调用,也可以通过对象名调用

静态修饰的内容:与类相关的,类成员

注意事项:

A. 静态方法中没有this关键字:静态是随着类的加载而加载,this是随着对象的创建而存在。静态比对象先存在

B. 静态方法只能访问静态的成员变量和静态成员方法。非静态方法可以访问静态或非静态成员变量,也可以访问静态或非静态的成员方法

静态变量和成员变量的区别

所属:静态变量属于类,所有也称为类变量;成员变量属于对象

内存中的位置:静态变量存储于方法区的静态区;成员变量存储于堆内存

内存出现时间不同:静态变量随着类的加载而加载,随着类的消失而消失;成员变量随着对象的创建而存在,随着对象的消失而消失

调用:静态变量可通过类名调用,也可通过对象调用;成员变量只能通过对象名调用

main方法是静态的,不需要创建对象,通过类名就可以,方便JVM调用

继承:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,多个类无需再定义这些属性和行为,只要继承即可,通过extends关键字实现类与类的继承

好处:提高代码复用性,提高代码维护性,让类与类产生关系,是多态的前提

弊端:耦合性增强了,打破了封装性

特点:Java只支持单继承,不支持多继承,支持多层继承

子类不能继承父类私有方法,只能继承父类所有非私有的成员;子类不能继承父类的构造方法,但是可以通过super关键字去访问父类的构造方法;不要为了部分功能而去继承,当子类需要使用父类的所有方法的时候去使用继承,体现”B is a A”的关系。

继承中成员变量的关系:

1)子类中的成员变量和父类中的成员变量不一样。

2) 子类中的成员变量和父类中的成员变量一样。(就近原则)

在子类方法中访问一个变量的查找顺序:

子类方法的局部范围找—->子类的成员范围找—–>父类的成员范围找

super关键字:代表父类存储空间的标识(可以理解为父类的引用,可以操作父类的成员)

继承中构造方法的关系:

1)子类中所有的构造方法默认都会访问父类中空参数的构造方法

2)子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。

子类的每一个构造方法的第一条语句默认都是:super()

使用super关键字可以去调用父类的带参构造方法

一个类的初始化过程:成员变量初始化,默认初始化,显示初始化,构造方法初始化

子父类的初始化(分层初始化):先进行父类初始化,然后进行子类初始化

继承中成员方法的关系:

通过子类调用方法:先找子类—->再找父类

方法重写:子类中出现了和父类中方法声明一模一样的方法

注意事项:父类中私有方法不能被重写,因为父类私有方法子类根本就无法继承

子类重写父类方法时,访问权限不能更低。最好一致

方法重写和方法重载的区别:

方法重写override:在子类中出现和父类一样的方法声明的现象

方法重载overload:在同一个类中,出现的方法名相同,参数列表不同的现象

This和super的区别:

this代表当前类的引用

super代表父类的储存空间标识(可以理解为父类的引用,通过super访问父类的成员)

final关键字:可以修饰类,方法,变量

final修饰类,该类不能被继承

final修饰方法,该方法不能被重写。(覆盖,复写)

final修饰变量,该方法不能被重新赋值,此时这个变量就是常量

final关键字修饰局部变量:

final修饰基本类型,值不能变。

final修饰引用变量,是指地址值不变。

fina修饰变量的初始化时机:

被final修饰的变量只能赋值一次

在构造方法完毕前。(非静态的常量)

多态:同一个对象(事物),在不同时刻体现出来的不同状态

前提:要有继承关系或者接口实现关系,要有方法重写,要有父类或者父接口 引用指向子类对象

多态中的成员访问特点:(父类 f = new 子类(); )

1)成员变量:编译看左边,运行看左边。

2)构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化

3)成员方法:编译看左边,运行看右边

4)静态方法:编译看左边,运行看左边(静态和类相关,算不上重写,所以访问还是左边的)

好处:提高代码的维护性(继承保证了这个优点)

提高了代码的扩展性

弊端:不能使用子类的特有功能

对象间转型问题:

向上转型:父类 f = new 子类();

向下转型:子类 z = (子类)f; 要求该父对象必须是能够转换为Zi的

ClassCastException:类型转换异常,可能发生在向下转型中。

抽象类

抽象类的特点:

抽象类和抽象方法必须用abstract修饰

抽象类中比一定有抽象方法,但是有抽象方法的类必须定义为抽象类

抽象类不能实例化

因为它不是具体的。

抽象类有构造方法,但是不能实例化 ?构造方法的作用是什么。用于子类访问父类数据的初始化

抽象类的子类:

a. 如果不想重写抽象方法,该子类是一个抽象类

b. 重写所有的抽象方法,这个时候子类是一个具体的类

抽象方法不能有主体

抽象类的实例化其实是靠具体的子类实现的,是多态的方法

Animal a = new Cat();

抽象类的成员特点:

成员变量:既可以是变量也可以是常量

构造方法:有,用于子类访问父类数据的初始化

成员方法:既可以是抽象的也可以的非抽象的

抽象类的成员方法特性:

A:抽象方法,强制要求子类做的事情

B:非抽象方法,子类继承的事情,提高代码复用性

面试问题:一个类如果没有抽象方法,可以不可以定义为抽象类,有什么意义:

可以,不让创建对象,不能new实例化

抽象类不能和哪些关键字共存:

private 冲突(非法的修饰符组合);final 冲突;static 无意义。

特点:

接口用关键字Interface表示:interface 接口名{}

类实现接口用implements表示:class 类名 implements 接口名 {}

接口不能实例化:按照多态的方式来实例化

接口的子类:可以是抽象类但是意义不大;可以是具体类,要重写接口中的所有抽象方法。

由此可见多态的体现: 具体类多态,抽象类多态,接口多态

成员特点

成员变量:接口中的变量默认是常量,并且是静态的。默认修饰符:final, static

构造方法:接口没有构造方法。

成员方法:接口方法必须是抽象的。默认修饰符:public abstract

类与类:继承关系,只能单继承,可以多层继承。

类与接口:实现关系,可以单实现,也是可以多实现。并且还可以在继承一个类的同时实现多个接口

接口与接口:继承关系,可以单继承,也可以多继承

抽象类和接口的区别:
成员区别:抽象类:成员变量:可以变量,也可以常量

构造方法:有

成员方法:可以抽象,也可以非抽象

接口:成员变量:只可以常量

成员方法:只可以抽象

关系区别:

类与类:继承,单继承

类与接口:实现,单实现,多实现

接口与接口:继承,单继承 ,多继承

类名作为形式参数:需要该类的对象

抽象类名作为形式参数: 需要该抽象类的子类对象

接口名作为形式参数:需要该接口的实现类对象

类名作为返回值类型:返回该类的对象

抽象类名作为返回值类型:返回该抽象类的子类对象

接口名作为返回值类型:返回该接口的实现类对象

权限修饰符:

本类中 同一个包下(子类和无关类)不同包下(子类) 不同包下(无关类)

private: Y N N N

defualt Y Y N N

protected Y Y Y N

public Y Y Y Y

修饰符:

权限修饰符:private,defualt,protected, public

状态修饰符:static,final

抽象修饰符:abstract

类:权限修饰符:defualt, public;状态修饰符:final;抽象修饰符:abstract

成员变量:权限修饰符:private,defualt,protect, public;状态修饰符:final;抽象修饰符:abstract

构造方法:权限修饰符:private,defualt,protected, public

成员方法:权限修饰符:private,defualt,protect, public;状态修饰符:static,final;抽象修饰符:abstract

比较常见的:public static final int X = 10;

public static void show() {}

public final void show() {}

public abstract void show();

内部类:

定义在其他类中的类。

特点:直接访问外部的成员,包括私有

外部类要访问内部类的成员,必须创建对象。

位置:在成员位置定义的类为成员内部类;直接访问内部类的成员:外部类名.内部类名 对象名 = 外部类对象.内部类对象;成员内部类被static修饰后的访问:外部类名.内部类名 对象名 = new 外部类名.内部类名()

成员内部类的修饰符:private 为了保证数据的安全性;static 为了方便访问数据 静态内部类访问的外部类数据必 须用静态修饰

在局部位置定义的 类为局部内部类;可以直接访问外部类的成员;在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能;

面试题:

局部内部类访问局部变量的注意事项?

A:局部内部类访问局部变量必须用final修饰

B:为什么:局部变量是随着方法的调用而调用,随着调用完毕而消失,而推内存的内容并不会消失。所以,加入final修饰。加入final修饰后,这个变量就成了常量。既然是常量,就消失了。

匿名内部类:

内部类的简化写法

前提:存在一个类,抽象类或者是接口

格式:new 类名抽象类名或者接口名(){重写方法;}

本质是什么?该类的子类,抽象类的子类,接口的实现类的匿名对象

Original: https://www.cnblogs.com/AICROC/p/13021081.html
Author: 生于思考
Title: Java复习,Java知识点以及Java面试题(二)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/568382/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球