栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面经系列(2)Java基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面经系列(2)Java基础

目录
  • Java基础
    • 1、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的 main 方法?
    • 2、面向对象的特征有哪些方面
    • 3、java 中实现多态的机制是什么?
    • 4、抽象类和接口的区别?
    • 5、什么是内部类?Static Nested Class 和 Inner Class 的不同。
    • 6、内部类可以引用它的包含类的成员吗?有没有什么限制?
    • 7、匿名内部类是否可以继承其它类,是否可以implements接口?
    • 8、String 是最基本的数据类型吗?
    • 9、String s = new String("123");创建了几个 String Object? 二者之间有什么区别?
    • 10、String、StringBuffer 和 StringBuilder的区别


Java基础 1、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的 main 方法?
  • 接口可以继承接口。
public interface InterfaceFather {

}
interface InterfaceSon extends InterfaceFather {
    
}
  • 抽象类可以实现(implements)接口
public interface InterfaceFather {

}
abstract class Son implements InterfaceFather {
    
}
  • 抽象类是否可继承具体类。
class Father{

}
abstract class Son2 extends Father{
    
}
  • 抽象类中可以有静态的 main 方法。
abstract class Son2 extends Father{
    public static void main(String[] args) {

    }
}

tips:抽象类和普通类的唯一区别就是不能创建实例对象和允许有抽象(abstract)方法

2、面向对象的特征有哪些方面
  • 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
  • 继承:继承是从已有类得到继承信息创建新类的过程,继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段.子类继承父类属性(静态特征)和方法(动态特征),继承必须遵循封装当中的控制访问。
  • 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面,抽象只关注对象的哪些属性和行为,并不关注这此行为的细节是什么
  • 多态:多态性是指允许相同或不同子类型的对象对同一消息作出不同响应。
3、java 中实现多态的机制是什么?

靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

4、抽象类和接口的区别?
  • 含有abstract修饰符的class即为抽象类,abstract类不能创建实例对象。
abstract class Test extends Father{
    public static void main(String[] args) {
        Test test = new Test(); //Error: 'Test' is abstract; cannot be instantiated
    }
}
  • 含有 abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必是抽象的。
  • abstract class 类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。
abstract class Test {
    abstract void method();
}
class TestSon extends Test {
    @Override
    void method() {
    }
}

abstract static void method1() { 
	// Error: Illegal combination of modifiers: 'abstract' and 'static'
}
abstract Test() {
	//Error: Modifier 'abstract' not allowed here    
}
  • 如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。
abstract class Test {
    abstract void method();
}
class TestSon extends Test {
    // Error:Class 'TestSon' must either be declared abstract or implement abstract method 'method()' in 'Test'
}

abstract class Test {
    abstract void method();
}
abstract class TestSon extends Test { // true
}
  • 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。
public interface Test {
    public abstract void method();
    // 一般省略 public abstract,直接写成void method();
}
  • 接口和抽象类的区别:
    1.抽象类可以有构造方法,接口中不能有构造方法。
public interface Test1 {
     public Test1(); //Error: Not allowed in interface
}
abstract class Test {
	public Test() {
    }
}

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

interface Test1 {
     int num = 0; //可以有变量,会默认为是public static final型,必须给其初值,在实现类中不能重新定义,也不能改变
}
abstract class Test {
	int num = 0;
}

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

public interface Test1 {
     void method(); //可以有普通方法,但是会默认为是 public abstrac 类型
}
abstract class Test {
	void method(){
    }
}

4.抽象类中的抽象方法的访问类型可以是 public,protected 和 default,但接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。(代码同上)
5.抽象类中可以包含静态方法,接口中不能包含静态方法。(jdk1.8后可以)

public interface Test1 {
    static void method1() {   
    } //在jdk1.8后,接口可以有静态方法,但是必须要加方法体。
}
abstract class Test {
	static void method1() {   
    }
}

6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是 public static final 类型,并且默认即为 public static final 类型。
7.一个类可以实现多个接口,但只能继承一个抽象类。(接口可以实现多继承,而抽象类只能单继承 )

5、什么是内部类?Static Nested Class 和 Inner Class 的不同。

内部类就是在一个类的内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以
定义在外部类的方法外面,也可以定义在外部类的方法体中。

class Father {
    int num1 = 1;
    void method() {
        class Inner2 {
            static int num2 = 0; // Error: Inner classes cannot have static declarations
            void method2() {
                num1 = 2;
            }
        }
    }
    class Inner1 {
        void method3() {
            num1 = 3;
        }
    }
}

在方法外部定义的内部类前面可以加上 static 关键字,从而成为 Static Nested Class,它不再具有内部类的特性,所有,从狭义上讲,它不是内部类。Static Nested Class 与普通类在运行时的行为和功能上没有什么区别,只是在编程引用时的语法上有一些差别,它可以定义成 public、protected、默认的、private等多种类型,而普通类只能定义成 public 和默认的这两种类型。在外面引用 Static Nested Class 类的名称为“外部类名.内部类名”。在外面不需要创建外部类的实例对象,就可以直接创建 Static Nested Class,例如,假设 Inner 是定义在 Outer 类中的 Static Nested Class,那么可以使用如下语句创建 Inner 类:

Outer.Inner inner = new Outer.Inner();

由于 static Nested Class 不依赖于外部类的实例对象,所以,static Nested Class 能访问外部类的非 static成员变量。当在外部类中访问 Static Nested Class 时,可以直接使用 Static Nested Class 的名字,而不需要加上外部类的名字了,在 Static Nested Class 中也可以直接引用外部类的 static 的成员变量,不需要加上外部类的名字。
在静态方法中定义的内部类也是 Static Nested Class,这时候不能在类前面加 static 关键字,静态方法中的 Static Nested Class 与普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的 static 的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量前必须加 final 修饰符。

6、内部类可以引用它的包含类的成员吗?有没有什么限制?

可以引用,但是静态内部类不能访问外部类的普通成员变量

class Outer {
    int num1 = 1;
    static num2 = 0;
    static class Inner3{
        void method() {
            num1 = 3; // Error: Non-static field 'num1' cannot be referenced from a static context
            num2 = 2;
        }
    }
    class Inner1 {
        void method3() {
            num1 = 3;
        }
    }
}
7、匿名内部类是否可以继承其它类,是否可以implements接口?

必须继承(而不是可不可以)其他类或实现其他接口。

8、String 是最基本的数据类型吗?

基本数据类型包括 byte、int、char、long、float、double、boolean 和 short。
String 是引用类型。并且String类型是被final修饰的,不能继承String类,也不能修改这个类。

9、String s = new String(“123”);创建了几个 String Object? 二者之间有什么区别?

两个或者1个对象,“123”对应一个对象,这个对象放在字符串常量缓冲区,常量“123”不管出现多少次,都是缓冲区的那一个。而new String()每写一次,就创建一个新的对象。如果以前使用过“123”,就不会创建“123“了,直接从缓冲区拿。

10、String、StringBuffer 和 StringBuilder的区别

String:字符串常量
StringBuffer:字符串变量(线程安全)
StringBuilder:字符串变量(非线程安全)

  • String、StringBuilder 和 StringBuffer都可以存储和操作字符串,但是String类提供了数值不可改变的字符串,而StringBuffer、StringBuilder提供了数值可以改变的字符串。
  • 每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,当需要对字符串进行改变时,最好不要用String。
  • StringBuilder被看作时StringBuffer的简易替换,在大多数情况下,StringBuilder比StringBuffer要更快,如果请款允许优先使用StringBuilder。

总结:

  • 速度:大部分情况下,StringBuilder > StringBuffer > String
  • 使用环境:
    • 操作少量数据:String
    • 单线程操作:StringBuilder
    • 多线程操作:StringBuffer
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667665.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号