javase面试总结(更新)

1.面对对象是什么

这是一种“万物皆对象”的思想,是针对于面向过程的编程思想。任务事物都可以称为对象,其中的一个个个体就被称为实例,就是面向对象中的类和对象概念。以对象为中心,消息为驱动。

区别:

(1)编程思想不同:面向过程是以实现功能的函数开发为主,面向对象是通过实例类的属性、方法实现

(2)封装性:面向过程封装功能,面向对象封装数据和功能

(3)面向对象具有继承多态,而面向过程没有继承多态

2.面向对象特性

(1)封装:通常认为是将数据和方法封装起来,只能通过定义的接口来访问数据

(2)继承:继承就是通过提供继承信息创建新类的过程。提供继承信息的是父类(超类/基类),使用继承信息创建新类的是子类(派生类)

(3)多态:分为编译时多态(重载)和运行时多态(重写)

        继承关系中:子类继承父类并重写父类方法。父类调用子类引用对象,达到相同方法不同对象呈现不同的效果

        实现接口:通过传递的参数不同实现相同方法不同效果

继承补充:

(1)子类只是拥有父类的属性、方法、代码块(包括私有属性和私有方法,不继承构造器),但是父类的属性、方法子类无法访问,只能拥有

(2)子类可以有自己的属性和方法

(3)子类可以重写父类方法来实现父类方法

3.JDK、JRE、JVM 三者之间的关系?

JDK(Java Development Kit):是 Java 开发工具包,是整个 Java 的核心,包括了 Java 运行环境 JRE、 Java 工具。 java工具常见的有 jar(jar文件管理工具,主要用于打包压缩、解压jar文件。)

java: Java运行工具,用于运行.class字节码文件或.jar文件。

javac: Java编译工具(Java Compiler),用于编译Java源代码文件。

javadoc: Java文档工具,主要用于根据Java源代码中的注释信息生成HTML格式的API帮助文档。 等等

JRE( Java Runtime Environment):是 Java 的运行环境,包含 JVM 标准实现及 Java 核心类库(11 个)。

JVM(Java Virtual Machine):是 Java 虚拟机,是整个 Java 实现跨平台的最核心的部分,能够运行以 Java 语言写作的软件程序。所有的 Java 程序会首先被编译为 .class 的类文件,这种类文件可以在虚拟机 上执行。

4.重载和重写的区别

重载:编译时多态,同样的方法,通过不同的传参实现不同方法实现

重写:运行时多态,同样方法,同样传参,实现不同的方法效果

        (父类中private的方法不能重写)

        (static方法不能重写)

5.Java 中是否可以重写一个 private 或者 static 方法

        Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态与 类绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。

        Java 中也不可以覆盖 private 的方法,因为 private 修饰的变量和方法只能在当前类中使用, 如果是其 他的类继承当前类是不能访问到 private 变量或方法的,当然也不能覆盖。

        (1)静态的方法可以被继承,但是不能重写。

        (2)如果父类和子类中存在同样名称和参数的静态方法,那么 该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类 的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法也不 在存在多态的性质。

6.构造器是否可以被重写

父类的构造器不能被继承,所以也不能被重写。通常执行子类构造器首先要访问父类构造器

7.构造方法的特性

(1)名字与类名相同

(2)没有返回值,不用void来修饰

(3)实例类的时候就会自动执行

8.在 Java 中定义一个不做事且没有参数的构造方法有什么作用(无参构造器)

类中默认有一个无参构造器,如果定义一个有参构造器,无参构造器就会被取消,则需要另外声明一个无参构造器

9.Java中创建对象的方法

1)使用new关键字

2)使用Class.newInstance方法,该方法调用无参构造器创建对象(反射):Class.forname.newInstance();

3)使用clone();

4)反序列化,比如调用ObjectInputStream类的readObject()方法

10.抽象类和接口有什么区别

1)抽象类有构造器,接口中没有构造器

2)抽象类可以有抽象方法(不能被private修饰,会编译报错),也可以有具体方法(可被private修饰,但一般不这样),而接口中只能有抽象方法(public abstract)

3)抽象类中的成员权限是public、默认、protected(抽象类中的方法就是为了被继承,所以不能用private修饰),而接口中的成员可以是public(方法默认:public abstract  变量:public static final)

        接口继承接口,实现类中需要实现重写全部方法

        jdk1.8中可以给接口添加静态方法和默认方法

        静态方法:使用static修饰的方法,可以通过接口直接调用静态方法,并执行其方法体

        默认方法:使用default修饰的方法,可以通过实现类对象来调用

//1、接口中定义的静态方法,只能被接口调用

//2、接口中定义的默认方法,可以被接口的实现类对象调用,默认方法可不重写

//3、如果实现类中重写接口中的默认方法,则实现类调用重写的方法

//4、如果子类所继承的父类和接口中默认方法重名,并且子类没有重写,则使用类优先原则默认调用父 类的方法

//5、如果父类中属性变量x与接口中属性变量x重名,直接调用x则会报错,因为无法判断 (ambiguous),需要加前缀。

接口中不能有代码块

                创建实例对象的顺序

                根据类的模板初始化对象,给属性赋默认值,执行代码块操作,执行构造器初始化操作(无参 构造省略此步骤)

接口中的属性和静态方法只能被接口调用(实现类对象无法调用),接口的主要功能是定义方法, 接口的实现类就是为了实现方法。

        

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

静态变量:被static修饰,属于类变量,因此不管创建对少个对象,内存中只有这一份拷贝;静态变量可以实现被多个对象共享内存

实例变量:属于实例,需要先创建对象,然后通过对象才能访问到

12、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误

s1=s1+1运算的类型为int,将int值赋值给short会转换错误

s1+=1 +=是java运算符,java编译器会对它进行特殊处理,可以正常运算

13.Integer和int的区别

1)int是Java的八种基本类型之一,Integer是java为int提供的包装类

2)int默认值是0,Integer默认值是null,可以区分0和未赋值情况

3)Integer变量必须实例之后才能使用,int不需要

1.两个new的Integer变量进行比较时,永远不相等,因为内存地址不一样

2.Integer和int进行比较时只要值相等就为true,因为Integer在进行比较时,java会自动把Integer拆分成int进行比较

3.非 new 生成的 Integer 变量和 new Integer() 生成的变量进行比较时,结果为 false,两者在内存中 的地址不同

14.装箱和拆箱

自动装箱是基本类型和包装类之间的一个转化,反之则为自动拆箱

自动拆箱触发:==作比较时

15.switch 语句可以传递的数据类型

byte、string、char、int、enum、short

16.字节和字符的区别

字节:储存容器的基本单位

字符:各种符号

1字节是8个二进制单位,一个字符是一个或多个字节的二进制单位组成

17.String为什么要设置成不可变类

1)字符串常量池是java堆内存中特殊的储存区域,如果一个String值已经存在字符串常量池时,则不会重新创建String对象,而是引用旧的对象

2)允许String缓存HashCode:在HashMap等容器中,String的哈希码被频繁调用,字符串不变性保证了哈希码的唯一性,可以放心缓存。意味着性能优化手段,不用每次都计算新的哈希码

3)String被引用在很多地方,比如URL、文件path、反射需要的String参数等,如果可变的话会引起各种安全隐患

18.String、StringBuilder、StringBuffer 的区别

String:属于不可变字符序列,属于引用类型,底层时char数组实现

StringBuffer:线程安全,方法添加同步锁,性能消耗大一些

StringBuilder:线程不安全,无同步锁,性能消耗小一些

19.String 字符串修改实现的原理

String首先创建一个StringBuilder对象,然后通过append方法最后通过,最后通过toString方法返回

20.String str = "i" 与 String str = new String("i") 一样吗

因为str = "i" java虚拟机会将其分配到常量池里,str= new String("i")则会被分到堆内存中

str= “i”,那系统会先检测字符串常量池中1是否包含该字符串的对象,如果存在,则返回字符串常量池中的内存地址,不会再创建;如果不存在,则在字符串常量池中创建对象,再返回

而在执行str=new String("i")的时候,系统会先判断字符串常量池中是否包含该字符串对象

如果不存在,则会在字符串常量池中创建对象,再到堆内存中创建字符串对象,把常量池的“i”拷贝到堆内存中,然后返回堆内存中该字符串的内存地址

字符串常量池在jdk7.0版本之前是在方法区,jdk7.0版本移至堆内存区域

21、String 类的常用方法都有那些

indexof():返回指定字符的索引

charAt():返回指定索引的字符

replace():字符串替换

trim():去掉去掉字符串两边的空白

split():分割字符串,返回一个分割后的字符串数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值