大家好,感谢邀请,今天来为大家分享一下Java面试题精选集锦的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
7.1. 抽象类与接口的比较
接口和抽象类都不能实例化。它们位于继承树的顶部,用于被其他类实现和继承。接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类必须实现这些抽象方法。
他们的区别:
1、属性:接口没有普通属性,只有静态属性,只能用public final static修饰(而且是默认的,即使你在接口中定义了Int i=0,也会隐式加上public最终静态);而抽象类可以有普通属性和静态属性(类属性)。
2、方法:接口中的方法都没有方法体并且都是默认使用public abstracrt 修饰,不能定义静态方法。抽象类可以有普通方法,也可以没有抽象方法,还可以定义静态方法。
3、构造函数:接口中没有构造器,抽象类中可以有构造器,但不能用于new对象,而是用于子类调用初始化抽象类操作。
4、初始化块:接口中不能包含初始化块,而抽象方法中可以包含初始化块。5、一个类只能有一个直接父类,包括抽象类,类可以实现多个接口,弥补了Java不能继承多个接口的缺点。
7.2.新版本中的修改
1、JDK1.8之前,抽象类中方法的默认访问权限是受保护的,JDK1.8中,默认访问权限是default。
2、JDK1.8接口增加了默认方法和静态方法。这两者都可以有方法体。默认方法属于实例,静态方法属于类(接口)。接口的静态方法不会被继承,静态变量会被继承。
3、JDK1.8,如果接口只有一个抽象方法,那么它会自动变成函数式接口。您可以使用@FunctionInterface注释。带有FunctionInterface 注解的接口只能有一个抽象方法。
4、从Java 8开始,接口可以有静态方法,用static修饰。但是接口中静态方法的修饰符只能是public,默认是public。调用时(接口名称.方法名称)。
5、在Java 8中,接口中除了可以写静态方法外,还可以写非静态方法,但是必须用default修饰,而且只能是public,默认也是public。
8. 构造方法,构造方法重载,什么是复制构造方法?
构造函数是类的特殊方法。它的主要功能是完成新对象的创建。初始化。1.方法名与类名相同,无返回值。
2、当创建(new)一个类的新对象时,系统会自动调用该类的构造方法来完成新对象的初始化。
3.普通方法可以与类同名。与构造函数方法唯一的区别是构造函数方法没有返回值(注意它不是void)。
4、定义类时,如果没有自定义构造函数,就会有默认的无参构造函数。如果构造函数是自定义的,就不会出现无参构造函数。
5.构造函数不能被继承,构造函数只能显式或隐式调用。
6、子类的构造函数总是先调用父类的构造函数。如果子类的构造函数没有显式指明使用父类的哪个构造函数,则子类会默认调用父类的无参构造函数(this 如果父类自定义了构造函数并且子类没有使用super ,会报错)。
7、Java不像C++那样支持复制构造方法(没有这个概念),但是Object类中有clone()方法。
受保护的对象clone() 抛出CloneNotSupportedException:创建并返回此对象的副本。 “复制”的确切含义可能取决于对象的类。
这样做的目的是,对于任何对象x,表达式: x.clone() !=x 为true,表达式: x.clone().getClass()==x.getClass() 也为true,但是这些这不是必须满足的要求。正常情况下:x.clone().equals(x)为true,但这不是必须满足的要求。
首先,使用该方法的类必须实现java.lang.Cloneable接口,否则会抛出CloneNotSupportedException。 Cloneable接口不包含任何方法,因此在实现它时,只需在类声明中添加implements语句即可。
第二个特别之处是这个方法是受保护的。重写clone()方法时,需要将其写为public,以便可以被类外的代码调用。
按照惯例,返回的对象应该通过调用super.clone来获取。如果一个类及其所有超类(Object 除外)都遵守此约定,则x.clone().getClass()==x.getClass()。
按照约定,此方法返回的对象应该独立于正在复制的对象。为了获得这种独立性,有必要在super.clone 返回对象之前修改该对象的一个或多个字段。这通常意味着复制包含被复制对象的内部“深层结构”的所有可变对象,并将对这些对象的引用替换为对副本的引用。如果一个类只包含基本字段或对不可变对象的引用,那么通常不需要修改super.clone 返回的对象中的字段。
这就是clone的浅拷贝和深拷贝的问题。具体使用时应特别注意:
浅拷贝:如果对象内部存在引用类型的基本变量,那么在复制该对象时,clone方法新生成的新对象中只复制基本类型的引用。换句话说,新对象和原始对象都包含对同一对象的引用。
深拷贝:复制对象时,如果该对象包含引用类型变量,那么引用类型变量指向的对象将被再次复制,然后引用新对象。
8、其实,需要特别注意的一点是,Java对象不是由构造函数创建的,而是由new操作符创建的。程序运行时,new操作符在堆上开辟一块空间,然后执行对象。初始化(包括调用构造函数),当对象创建成功后,也是new操作符将对象的起始地址返回给应用程序(而不是构造函数)。其实构造函数的作用是在创建对象时初始化类中的成员变量,而不是创建对象,并且构造函数没有返回值。因此程序执行的顺序是,先创建对象,然后求解构造器所有形参表达式的值(若形参表达式的计算出现异常,则不会调用构造器方法),最后调用构造器对对象进行初始化。
9. Java内部类
内部类是在另一个类中定义的类。
使用内部类有以下三个原因:
1)内部类方法可以访问类定义范围内的数据,包括私有数据。
2) 内部类可以对同一包中的其他类隐藏。
3)当你想定义回调函数,又不想写很多代码时,使用匿名内部类比较方便。
4)内部类有四种类型:成员内部类、局部内部类、静态内部类、匿名内部类
9.1、成员内部类
成员内部类也是最常见的内部类。它是外部类的成员,因此可以无限制地访问外部类的所有成员属性和方法。虽然是私有的,但是外部类需要通过内部类实例来访问内部类的成员属性和方法。如果内部类中定义了与外部类同名的实例变量,访问:OuterClass.this.outerMember;
成员内部类中需要注意两点。第一:成员内部类中不能存在任何static的变量和方法(因为需要先创建外部类,才能创建自己,可以声明static的常量);第二:成员内部类依附于外部类,因此只有先创建外部类之后才能创建内部类。
9.2、局部内部类
本地内部类,嵌套在方法和范围内。该类的使用主要是为了应用和解决比较复杂的问题。我们想要创建一个类来协助我们的解决方案,但我们不希望该类公开可用,因此生成了一个本地内部类。局部内部类的编译方式与成员内部类类似,但其作用域发生了变化。只能在该方法和属性中使用。除了这个方法之外,其他属性都会失效。
本地内部类可以访问的外部类的成员根据它们所在的方法体而有所不同。如果在静态方法中:可以访问外部类中的所有静态成员,包括private;如果在实例方法中:您可以访问外部类中的所有成员,包括私有成员。局部内部类可以访问所在方法中定义的局部变量,但是要求局部变量必须使用final修饰。
9.3、匿名内部类
1. 匿名内部类没有访问修饰符,并且是唯一没有构造函数的类。
2.新建匿名内部类,该类必须先存在。
3、注意,当方法的形参需要被匿名内部类使用时,那么形参必须是final的。
9.4、静态内部类(静态嵌套类)
用static修饰的内部类称为静态内部类,或嵌套内部类。静态内部类和非静态内部类之间有一个最大的区别。我们知道,非静态内部类在编译后会隐式保存一个引用,该引用指向创建它的外部类,但静态内部类则不会。不。缺少此参考意味着:
1.它的创建不需要依赖外围类。
2. 不能使用任何外围类的非静态成员变量和方法。
10. 枚举类
(1) 使用enum关键字而不是class定义枚举类。
(2)枚举类(enumerable)的实例数量必须有限。所有枚举变量必须定义在枚举类的第一行,并用逗号分隔。所有变量定义完毕后,必须以分号分隔。如果只有枚举变量而没有自定义变量,分号可以省略。枚举变量最好使用大写字母。在其他类中使用枚举变量时,只需要[类名.变量名],就像使用静态变量一样。
枚举变量默认由public static final 修饰。
(3)枚举类可以看成是普通的类,可以有构造函数、成员方法、成员变量。当然,与普通班级也有一些区别:
枚举类的构造函数默认修饰为private,且只能修饰为private;
枚举类默认继承自Enum类,因此不能继承其他类。 Enum类实现了Serialized和Comparable接口;
枚举类默认使用final修饰,因此无法派生子类。如果需要扩展枚举中的元素,请创建一个在接口内实现接口的枚举,以对元素进行分组。达到对枚举元素进行分组的目的。
(4)、switch()参数可以使用enum
(5)、enum允许程序员为eum实例编写方法。因此每个枚举实例可以被赋予不同的行为。
(六)、常用方法
好了,关于Java面试题精选集锦和的问题到这里结束啦,希望可以解决您的问题哈!
【Java面试题精选集锦】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于找到一份整理Java面试题的资料了!
有18位网友表示赞同!
准备Java面试就靠这篇文章了,问题都很实用。
有19位网友表示赞同!
不知道这些题在真面试中会不会出现啊?
有15位网友表示赞同!
收藏一下,待会儿好好复习Java基础知识。
有18位网友表示赞同!
Java面试题很多啊,有点看不过来!
有11位网友表示赞同!
现在面试都需要考这么多JAVA东西吗?
有18位网友表示赞同!
学习Java还是需要好好掌握这些基本概念吧。
有9位网友表示赞同!
希望这篇文章能帮我顺利通过Java的面试!
有18位网友表示赞同!
这应该是我学习Java以来遇到最全面的面试题汇总了!
有8位网友表示赞同!
感觉有些题比较难,需要多刷几遍代码才能理解。
有15位网友表示赞同!
分享一下这篇文章给在准备Java面试的同学吧!
有11位网友表示赞同!
这个清单可以帮助我快速查阅和复习Java面试常见问题。
有12位网友表示赞同!
JAVA真是个庞大的知识系统,要好好学习才行!
有13位网友表示赞同!
感谢作者整理这份实用资料,太棒了!
有5位网友表示赞同!
面试的时候遇到这类的题应该怎么做呢?
有9位网友表示赞同!
以后在刷题的时候可以特意关注这些常见的Java面试题。
有15位网友表示赞同!
看来我要好好温习一下Java的基础知识了!
有16位网友表示赞同!
准备Java面试确实需要下功夫,这份汇总很有帮助!
有11位网友表示赞同!
学习编程真是一项挑战,但是也要保持热情!
有14位网友表示赞同!
希望这篇汇总能帮助更多的人成功通过Java的面试!
有20位网友表示赞同!