class A {
public void show() {
show2();
}
public void show2() {
System.out.println(“我”);
}
}
class B extends A {
public void show2() {
System.out.println(“爱”);
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println(“你”);
}
}
public class Test2DuoTai {
public static void main(String[] args) {
A a = new B();
a.show();
B b = new C();
b.show();
}
}
//爱
//你
20.package,import,class有没有顺序关系
package放在有效代码的第一行,import放在中间,class放在三者最后。
21.要求:使用已知的变量,在控制台输出30,20,10。
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(?); //num
System.out.println(??); //this.num
System.out.println(???);//Outer.this.num
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
22.按照要求,补齐代码
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
//需要补齐代码内容
public static Inter method() {
return new Inter() {
public void show() {
System.out.println(“HelloWorld”);
}
};
}
23.==号和equals方法的区别
相同点:都是作比较的,返回的都是布尔类型。
不同点:
(1)==:
* 是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,
基本数据类型比较的是值, 引用数据类型比较的是地址值
(2)equals:
* equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,
如果没有重写Object类中的equals方法,equals方法和号比较引用数据类型无区别,
重写后的equals方法比较的是对象中的属性。
24.判断定义为String类型的s1和s2是否相等
-
String s1 = “abc”;
-
String s2 = “abc”;
-
System.out.println(s1 == s2); //true
-
System.out.println(s1.equals(s2)); //true
//常量池中没有这个字符串对象,就创建一个,如果有直接用即可
25.下面这句话在内存中创建了几个对象?
- String s1 = new String(“abc”);
//创建几个对象
//创建两个对象,一个在常量池中,一个在堆内存中
26.判断定义为String类型的s1和s2是否相等
-
String s1 = new String(“abc”); //记录的是堆内存对象的地址值
-
String s2 = “abc”; //记录的是常量池中的地址值
-
System.out.println(s1 == s2); ? //false
-
System.out.println(s1.equals(s2)); ? //true
27.判断定义为String类型的s1和s2是否相等
-
String s1 = “a” + “b” + “c”;
-
String s2 = “abc”;
-
System.out.println(s1 == s2); ? //true,java中有常量优化机制
-
System.out.println(s1.equals(s2)); ? //true
28.判断定义为String类型的s1和s2是否相等
-
String s1 = “ab”;
-
String s2 = “abc”;
-
String s3 = s1 + “c”;
-
System.out.println(s3 == s2); //false
-
System.out.println(s3.equals(s2)); ? //true
29.null与""的区别?
""是字符串常量,同时也是一个String类的对象,既然是对象当然可以调用String类中的方法
null是空常量,不能调用任何的方法,否则会出现空指针异常,null常量可以给任意的引用数据类型赋值
30.String,StringBuffer,StringBuilder的区别
(1)String:是一个不可变的字符序列
(2)StringBuffer:是一个可变的字符序列。是jdk1.0版本的,是线程安全的,效率低
(3) StringBuilder:是一个可变的字符序列。是jdk1.5版本的,是线程不安全的,效率高
31.Integer的面试题
看程序写结果
Integer i1 = new Integer(97);
Integer i2 = new Integer(97);
System.out.println(i1 == i2); //false
System.out.println(i1.equals(i2)); //true
System.out.println(“-----------”);
Integer i3 = new Integer(197);
Integer i4 = new Integer(197);
System.out.println(i3 == i4); //false
System.out.println(i3.equals(i4)); //true
System.out.println(“-----------”);
Integer i5 = 97;
Integer i6 = 97;
System.out.println(i5 == i6); //true
System.out.println(i5.equals(i6)); //true
System.out.println(“-----------”);
Integer i7 = 197;
Integer i8 = 197;
System.out.println(i7 == i8); //false
System.out.println(i7.equals(i8)); //true
-128到127是byte的取值范围,在这个取值范围内,自动装箱
就不会新创建对象,而是从常量池中获取,如果超出了byte取值
范围就会重新创建对象
32.注意:String和StringBuffer分别作为参数传递
-
A:形式参数问题
-
String作为参数传递
-
StringBuffer作为参数传递
基本数据类型的值传递,不改变其值。引用数据类型的值传递,改变其值。
String类虽然是引用数据类型,但当它当做参数传递时和基本数据类型一样。
33.JDK1.5新特性:
泛型,枚举,增强for,自动拆装箱,静态导入,可变参数
34.并发修改异常产生的原因及解决方案
产生原因:用迭代器遍历集合的时候又使用集合改变了集合的结构
解决方案:(1)用普通for循环
(2)用列表迭代器ListIterator
35.HashMap和Hashtable的区别
- 共同点:
底层都是哈希算法,都是双列集合
- HashMap:
线程不安全,效率高,JDK1.2版本
可以存储null键和null值
- Hashtable:
线程安全,效率低,JDK1.0版本
不可以存储null键
36.Collection和Collections的区别:
Collection是单列集合的顶层接口,里面定义了单列集合的共性内容。
Collections是操作集合的工具类,里面提供了一些查找、排序等常用集合功能。
37.final,finally和finalize的区别
- final
修饰类,不能被继承
修饰方法,不能被重写
修饰变量,只能赋值一次
- finally
是try语句中的一个语句体,不能单独使用,用来释放资源
- finalize
是一个方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
38.如果catch里面有return语句,请问finally的代码还会执行吗?
如果会,请问是在return前还是return后?
return 会先建立返回路径,然后执行finally内的语句,然后再由return返回
会执行,在return后(return – finally – return)
39.throws和throw的区别
-
a:throws
-
用在方法声明后面,跟的是异常类名
-
可以跟多个异常类名,用逗号隔开
-
表示抛出异常,由该方法的调用者来处理
-
b:throw
-
用在方法体内,跟的是异常对象名
-
只能抛出一个异常对象名
-
表示抛出异常,由方法体内的语句处理
40.内存输出流面试题
- 定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)
//创建字节输入流,关联a.txt
FileInputStream fis = new FileInputStream(“a.txt”);
//创建内存输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//创建字节数组,大小为5
byte[] arr = new byte[5];
int len;
//将文件上的数据读到字节数组中
while((len = fis.read(arr)) != -1) {
//将字节数组的数据写到内存缓冲区中
baos.write(arr, 0, len);
}
//将内存缓冲区的内容转换为字符串打印
System.out.println(baos);
fis.close();
41.实现多线程两种方式的区别
-
查看源码的区别:
-
a.继承Thread : 由于子类重写了Thread类的run(), 当调用start()时, 直接找子类的run()方法
-
b.实现Runnable : 构造函数中传入了Runnable的引用, 成员变量记住了它, start()调用run()方法时内部判断成员变量Runnable的引用是否为空, 不为空编译时看的是Runnable的run(),运行时执行的是子类的run()方法
-
继承Thread
-
好处是:可以直接使用Thread类中的方法,代码简单
-
弊端是:如果已经有了父类,就不能用这种方法
-
实现Runnable接口
-
好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
-
弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂
42.面试题
-
在同步代码块中,用哪个对象锁,就用哪个对象调用wait()方法
-
为什么wait()方法和notify()方法定义在Object类中
-
因为锁对象可以使任意对象,而Object是所有类的超类,所以wait()方法和notify()方法需要定义在Object类中
-
sleep方法和wait方法的区别
-
a.sleep方法必须传入参数,参数就是时间,时间到了自动醒来
-
wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待
-
b.sleep方法在同步函数或者同步代码块中,不释放锁。睡着了也抱着锁睡。
-
wait方法在同步函数或者同步代码块中,释放锁。
参考:
sleep方法和wait方法的区别?
sleep是Thread里面的方法,而wait是Object类里面的方法。
sleep方法让线程在指定时间内处于休眠状态,时间到了后继续向下执行
wait 方法让线程处于阻塞状态,必须在得到notify或者notifyAll的通知后才能继续向下执行
sleep方法没有释放锁,其他线程不能进入同步代码块或者同步方法
wait 方法释放了锁,使得其他线程可以进入同步代码块或者同步方法。
43.线程的五种状态
- 新建,就绪,运行,阻塞,死亡
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/1b3a1b53731125056da466df9b5ed24a.jpeg)
Docker步步实践
目录文档:
①Docker简介
②基本概念
③安装Docker
④使用镜像:
⑤操作容器:
⑥访问仓库:
⑦数据管理:
⑧使用网络:
⑨高级网络配置:
⑩安全:
⑪底层实现:
⑫其他项目:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
BDZl-1712035151840)]
[外链图片转存中…(img-PZn9G4F4-1712035151840)]
①Docker简介
②基本概念
③安装Docker
[外链图片转存中…(img-AyymkAGL-1712035151841)]
④使用镜像:
[外链图片转存中…(img-9RI8AWpD-1712035151841)]
⑤操作容器:
[外链图片转存中…(img-QgycI8aD-1712035151842)]
⑥访问仓库:
[外链图片转存中…(img-r3kiBcol-1712035151842)]
⑦数据管理:
[外链图片转存中…(img-MEBxwVf0-1712035151842)]
⑧使用网络:
[外链图片转存中…(img-9wa9AGGB-1712035151842)]
⑨高级网络配置:
[外链图片转存中…(img-JklbLSxS-1712035151843)]
⑩安全:
[外链图片转存中…(img-h0zm8TUH-1712035151843)]
⑪底层实现:
[外链图片转存中…(img-DcP0QE1U-1712035151843)]
⑫其他项目:
[外链图片转存中…(img-hJY53xPH-1712035151843)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!