Skip to content

接口及数据结构相关

2968字约10分钟

java数据结构

2024-10-24

1.接口基本概念、接口中的方法

jdk8以前没有实现(无方法体)

jdk8有默认方法、static方法

// jdk8以后可以有默认实现的方法
		default void test() {
			System.out.println("default test()");
		}
		// jdk8以后可以有static实现的方法
		static void test1() {
			System.out.println("static test1()");
		}

jdk9具有私有方法

private void test1() {
	System.out.println("static test1()");
}

接口可以new运算但是不能实例(创建)对象,不能直接创建对象

2.构造方法

构造方法无返回类型(错误)严格来说构造方法在定义中不需要指定返回类型

3.static方法

类方法只能调用类变量

4.重载的条件

1.同类、同名方法

2.三不同:方法的参数不同(参数个数、参数类型,参数顺序)

同一个类中两个或两个以上的函数,取相同的函数名,但形参的个数或类型不同,多个参数的个数不同、类型不同,顺序不同

5.同上

6.变量的初始化

两种方式:

set方法

构造方法(调用其他构造方法this())

7.构造方法调用时机

创建对象时(new 构造方法,this、super调用其他构造方法)

8.类的权限修饰符

成员内部类:private、default、protected、public

外部类:public(所有包)、default(同包访问)

9.接口的修饰符

public、default

10.同包访问成员变量的修饰符:

default、protected、public

11.重写的条件

1.同名同参数的方法(参数个数、类型、顺序相同)

2.不同的类(继承链上的不同类)

3.返回的数据类型(引用类型)可以与超类的不同

子类重写的方法返回类型是超类的派生类,异常数减少

4.子类重写的方法的权限修饰符可以与超类的不同(子类重写的权限>=超类的方法权限)

若超类的的方法使用private修饰则子类不能够继承到,无法进行重写

若超类的的方法使用static修饰这时方法属于类,每个对象共享这个方法,此时不可重写原因是:

重写是利用对象的实际数据类型来判断调用那个对象的方法,类方法不满足条件

重写是基于继承的,没有继承就没有重写

12.final与finally的区别

1.当用final修饰一个类时,表明这个类不能被继承。

2.“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。

注:类的private方法会隐式地被指定为final方法。

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

finally:

在异常处理中使用,无论有无异常其中代码都要执行

final:是修饰符(关键字)有三种用法: 第一种:类被声明为final,意味着它不能再派生出新的子类,即不能被继承; 第二种:将变量声明为final,可以保证它们在使用中不被改变;被声明为final的变量必须在声明是给定初始值,而在以后的引用中只能读取不能修改。 第三种:被声明为final的方法不能在子类中被重写。 finally:通常放在try…catch…的后面,finally块中的代码一定能执行,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。

13.构造方法必须与类同名,普通方法也可以与类同名

class Stack implements MyStatck{
	// 构造方法
	Stack() {
		
	}
	// 普通方法
	void Stack() {
		
	}
}

14.private修饰的成员变量只能被该类自身访问

15.数据结构

栈:后进先出的线性表或链表

进栈出栈不需要移动栈底指针

数据结构:

物理结构:顺序结构、链表、索引、hash队列

逻辑结构:栈、队列、串、树、图、表

16.构造方法

私有构造方法实例化类必须有一给非私有方法(单例模式)

类与字节码文件的关系

一个类对应一个字节码文件

内部类的字节码文件:外部类$内部类.class

17.接口与抽象类的区别

1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

扩展:

相同点:

(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类的特点:

a、抽象类不能被实例化只能被继承;

b、包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;

c、抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;

d、一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;

e、抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。

***接口*:**Java中接口使用interface关键字修饰,特点为:

a、接口可以包含变量、方法;变量被隐士指定为public static final,方法被隐士指定为public abstract(JDK1.8之前);

b、接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题;

c、一个类可以实现多个接口;

d、JDK1.8中对接口增加了新的特性:(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。

接口只能是功能的定义,而抽象类既可以为功能的定义也可以为功能的实现。

18.同上

19.接口不可重写访问权限

20.子类不可覆盖超类的final、static方法

21.数组定义与初始化

int [3] a;错误的

22.单链表插入节点

任意节点插入

p.next=c.next;

c.next=p;

img

23.树的遍历

先序遍历:根左右

中序遍历(平衡遍历):左根右

后序遍历(逆波兰表达式):左右根

27.Object的方法:

clone();

toString();

finalize();

hasNext();Scanner对象的

29.成员变量不可覆盖

上转型对象的调用:

属性父类的

方法为子类的

30.instanceof()方法判断一个对象是不是属于一个类的

多态:模糊数据类型调用

内部类访问外部类,内部类可以使用final、static,非static内部类无法在外部的类方法调用

成员变量不会构成重写

简答题

1.四大修饰符的作用

public 使用对象最广:类、接口、变量、方法

protected使用对象:变量、方法 注意:不能修饰外部类

default 使用对象:类、接口、变量、方法。(即缺省,什么也不写)

private 使用对象:变量、方法

注意:不能修饰外部类

2.抽象类与接口的区别

1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

3.栈、队、方法区的使用

栈的使用:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间。

队的使用:通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域。

方法区的使用:方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在常量池中,常量池是方法区的一部分。

栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整,栈空间用光了会引发StackOverflowError,而堆和常量池空间不足则会引发OutOfMemoryError。

4.静态变量和实例变量的区别

静态变量用static修饰,实例变量不用。

静态变量是随着类的字节码的加载而被加载进内存的,所以只要程序一启动运行到该类时就会被加载进内存,不管创建了多少个对象在内存中只存储一份。而实例变量是在创建对象以后才能被分配内存空间,创建对少个对象就会存储多少份。

静态变量被存储到内存的静态区,实例变量被存储到堆中。

静态变量是和类相关的,使用类名直接调用。实例变量是和对象相关的必须通过对象名调用。