大家好,我是青空。
最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,能不能做一些分享,和做一些面试题解析的系列文章。
青空收到消息之后,觉得这个建议挺不错的。那我就计划简单及概念性的面试题就多个面试题汇总成一片文章,比较复杂的面试题就单独拎出来讲讲。
文末领取面试大全
1.static的独特之处
1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法 不属于 任何一个实例对象,而是被类的实例对象所共享 。
怎么理解 “被类的实例对象所共享” 这句话呢?就是说,一个类的静态成员,它是属于大伙的 【大伙指 的是这个类的多个对象实例,我们都知道一个类可以创建多个实例!】,所有的类对 象共享的,不像成 员变量是自个的【自个指的是这个类的单个实例对象】…我觉得我已经讲的 很通俗了,你明白了咩?
2、在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加 载并进行 初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。
3、static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话, 是可以任 意赋值的!
4、被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便 没有创建 对象,也可以去访问。
2.static存在的主要意义
static的主要意义是在于创建独立于具体对象的域变量或者方法。 以致于即使没有创建对象, 也能使用属性和调用方法 !
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能 。static块可 以置于类 中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的 顺序来执行每个 static块,并且只会执行一次。
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因 此,很多 时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
3.this与super的区别
super:它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员 数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名 (实参)
this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的 形参与类中的成员数据同名,这时需用this来指明成员变量名)
super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。
super()和this()均需放在构造方法内第一行。
尽管可以用this调用一个构造器,但却不能调用两个。
this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数, 其它的构 造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语 句,就失去了语句的 意义,编译器也不会通过。
this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变 量,static方法,static语句块。
从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
4.super关键字的用法
super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一 个父类。 super也有三种用法:
1.普通的直接引用 与this类似,super相当于是指向当前对象的父类的引用,这样就可以用super.xxx来引用父类的成员。
2.子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分
class Person {
protected String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
private String name;
public Student(String name, String name1) {
super(name);
this.name = name1;
}
public void getInfo() {
System.out.println(this.name);
System.out.println(super.name);
}
}
public class Test {
public static void main(String[] args) {
Student s1 = new Student("Father", "Child");
s1.getInfo();
}
}
3.引用父类构造函数
- super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
- this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
5.String类的常用方法有哪些?
- indexof();返回指定字符的的索引。
- charAt();返回指定索引处的字符。
- replace();字符串替换。
- trim();去除字符串两端空格。
- splt();字符串分割,返回分割后的字符串数组。 getBytes();返回字符串byte类型数组。
- length();返回字符串⻓度。
- toLowerCase();将字符串转换为小写字母。 •toUpperCase();将字符串转换为大写字母。 — substring();字符串截取。
- equals();比较字符串是否相等。
6.char型变量中能否能不能存储一个中文汉字,为什么?
char可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char 类型占2个字节(16 比 特),所以放一个中文 是没问题的。
27.是否可以继承String类?
String 类是final类,不可以被继承。 补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系 (Has-A)和依赖
关系(Use-A)而不是继承关系(Is-A)。
8.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对 不对?
不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。 Java对于eqauls方法和hashCode方法是这样规定的: (1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同; (2)如果两个对象的hashCode相同,它们并不一定相同。
当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对 象可以出 现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如 果哈希码频繁的冲 突将会造成存取性能急剧下降)。
29.构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。
30.谈谈你对多态的理解?
多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程 时并不确 定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该 引用变量发出的方 法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。因为在 程序运行时才确定具体的 类,这样,不用修改源代码,就可以让引用变量绑定到各种不同的对 象上,从而导致该引用调用的具体 方法随之改变,即不修改程序代码就可以改变程序运行时所 绑定的具体代码,让程序可以选择多个运行 状态,这就是多态性。
参考资料
《Java核心技术卷一》
面试大全包括:包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!
领取方式:扫描下方公众号【蚂蚁原图】回复【面试题】即可获取