Android面试题Java基础篇

Android面试题Java基础篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐,更多精彩内容可以关注微信公众号(Android高级编程):android-tech

系列文章目录:

  • Android面试题View篇
  • Android面试题进程篇
  • Android面试题线程篇
  • Android面试题网络篇
  • Android面试题架构篇
  • Android面试题系统原理篇
  • Android面试题内存&性能篇

一个语言的编译过程

  • 1.词法分析:将一串文本按规则分割成最小的结构,关键字、标识符、运算符、界符和常量等。一般实现方法是自动机和正则表达式
  • 2.语法分析:将一系列单词组合成语法树。一般实现方法有自顶向下和自底向上
  • 3.语义分析:对结构上正确的源程序进行上下文有关性质的审查
  • 4.目标代码生成
  • 5.代码优化:优化生成的目标代码

Java 中内部类为什么可以访问外部类
因为内部类创建的时候,需要外部类的对象,在内部类对象创建的时候会把外部类的引用传递进去

java类加载过程:

  • 1.加载时机:创建实例、访问静态变量或方法、反射、加载子类之前
  • 2.验证:验证文件格式、元数据、字节码、符号引用的正确性
  • 3.加载:根据全类名获取文件字节流、将字节流转化为静态储存结构放入方法区、生成class对象
  • 4.准备:在堆上为静态变量划分内存
  • 5.解析:将常量池中的符号引用转换为直接引用
  • 6.初始化:初始化静态变量

静态方法跟静态代码块有什么区别
静态方法属于类,用类名.就能直接调用,静态代码块是类加载的时候就会调用的

关键字final和static是怎么使用的

final:

  • 1、final变量即为常量,只能赋值一次。
  • 2、final方法不能被子类重写。
  • 3、final类不能被继承。

static:

  • 1、static变量 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存, 在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
  • 2、static代码块
    static代码块是类加载时,初始化自动执行的。
  • 3、static方法
    static方法可以直接通过类名调用,任何的实例也都可以调用,因此static方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

String,StringBuffer,StringBuilder区别

  • 1、三者在执行速度上:StringBuilder > StringBuffer > String (由于String是常量,不可改变,拼接时会重新创建新的对象)。
  • 2、StringBuffer是线程安全的,StringBuilder是线程不安全的。(由于StringBuffer有缓冲区)

StringBuffer跟StringBuider的区别
StringBuider非线程安全,执行速度快,单线程用这个类

Java中重载和重写的区别:

  • 1、重载:一个类中可以有多个相同方法名的,但是参数类型和个数都不一样。这是重载。
  • 2、重写:子类继承父类,则子类可以通过实现父类中的方法,从而新的方法把父类旧的方法覆盖。

Java中实现多态的机制是什么?
答:方法的重写Overriding和重载Overloading是Java多态性的不同表现

  • 重写Overriding是父类与子类之间多态性的一种表现
  • 重载Overloading是一个类中多态性的一种表现.

说说你对Java反射的理解
JAVA反射机制是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法; 对于任意一个对象, 都能够调用它的任意一个方法和属性。 从对象出发,通过反射(Class类)可以取得取得类的完整信息(类名 Class类型,所在包、具有的所有方法 Method[]类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所有属性 Field[]、某个属性的完整信息、构造器 Constructors),调用类的属性或方法自己的总结: 在运行过程中获得类、对象、方法的所有信息。

说说你对Java注解的理解
元注解的作用就是负责注解其他注解。java5.0的时候,定义了4个标准的meta-annotation类型,它们用来提供对其他注解的类型作说明。
@Target
@Retention
@Documented
@Inherited

switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
switch能作用在byte、char、short和int上,JDK1.7后可以作用在String上。

”==”和equals方法究竟有什么区别?
==和equals都可以比较地址。==是运算符,equals是方法,方法可以通过重写改变其行为,如String的equals就是比较字符串内容。

构造方法能否被重写和重载?
构造方法不能被重写但是能被重载。

面向对象的特征有哪些?
封装、继承、多态和抽象。

抽象类和接口的区别?

  • 1).抽象类是abstract class修饰,接口是interface修饰。
  • 2).抽象类可以有任意类型的属性,接口只能有静态常量修饰的属性。
  • 3).抽象类可以有普通方法和抽象法方法,接口的方法都是抽象方法。
  • 4).抽象类和接口都不能实例化,但是抽象类有构造方法,接口没有构造方法。
  • 5).抽象类只能单根继承,接口可以多重实现。

内部类可以引用它的包含类的成员吗?有没有什么限制?
可以引用。如果需要指定当前类时要用外部类.this来引用。如果引用局部变量,需要将局部变量指定为final。

String s = new String(“xyz”);创建了几个String Object? 二者之间有什么区别?
2个对象。”xyz”创建在字符串常量池中,new String()创建在堆中。

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会在return前执行。

Integer与int的区别
Integer为包装类,int是基本数据类型。包装类拥有方法和属性,基本数据类型不具备。包装类可以通过intValue来转换成基本数据类型,也可以通过new Integer()将基本数据类型转换为包装类。在JDK1.5后,包装类和基本数据类型可以实现自动转换。

java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
java中有三种流,分别是字节流(InputStream、OutputStream)、字符流(Reader、Writer)、对象流(ObjectInputStream、 ObjectOutputStream)。

谈谈final,finally,finalize的区别?

  • final是修饰符,可以修饰类(不能被继承)、属性(常量)、和方法(不能被重写)。
  • finally是异常处理块中的代码块,表示无论如何都会执行的代码块。
  • finalize是Object类的方法,该方法在对象被垃圾回收之前执行的方法。

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
java中只有值传递,如果传递的对象,实际也是传递该对象的地址。

用最有效率的方法算出2乘以8等於几
将2的二进制向左移3位,java中用<<来移位

是否可以从一个static方法内部发出对非static方法的调用?
不能,除非先创建非static方法所在类的对象。

什么是内部类?内部类的作用
内部类可直接访问外部类的属性
Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法,不依赖外围类)
使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。 因为Java不支持多继承,支持实现多个接口。但有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
可继承 不可重写 而是被隐藏
如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成。

java的对象锁和类锁的区别
java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的

你可能感兴趣的:(Android面试题Java基础篇)