Java基本概念对比辨析
# Java基本概念对比
# 重载与重写的区别
重载发生在同一个类中,具有相同的方法名,但是有不同的参数个数、参数位置。比如构造方法重载。
重写就是当子类继承父类的相同的方法,做出有别于父类的响应。
区别点 | 重载 | 重写 |
---|---|---|
发生范围 | 同一个类中 | 子类中 |
参数列表 | 必须修改 | 不能修改 |
返回类型 | 可修改 | 不可修改 |
异常 | 可修改 | 可以减少或删除,不能抛出新的或更广的异常 |
访问修饰符 | 可修改 | 不能做更严格的限制 |
发生阶段 | 编译期 | 运行期 |
# Java的访问修饰符
访问修饰符 | 当前类 | 同一包内 | 子类(同一包) | 子类(不同包) | 其他包 |
---|---|---|---|---|---|
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | |
default | √ | √ | √ | ||
private | √ |
# 成员变量与局部变量的区别
- 语法形式:成员变量属于类的,局部变量是在方法中定义的变量或是方法的参数;成员变量可被访问修饰符、static等修饰,而局部变量不能;成员变量和局部变量都能被final所修饰。
- 变量在内存中的存储方式:static修饰的成员变量,这个变量是属于类的(称类变量);没有被static修饰的成员变量属于实例的(称实例变量)。而类变量存储在方法区中,对象及实例变量存在于堆中,局部变量存在栈中。
- 变量在内存中的生存时间:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而创建和消失。
- 成员变量如果没有赋值,则会自动以类型的默认值(例外:被final修饰的成员变量必须显式的赋值),而局部变量则不会自动赋值。
# 静态方法和实例方法的区别
- 外部调用静态方法时:可以使用“类名.方法名”的方式,也可以使用“对象名.方法名”的方式。而实例只能用“对象名.方法名”的方式,调用静态方法无需创建对象。
- 静态方法在访问本类的成员时,只允许访问静态成员,而不可以访问非静态的变量和方法;实例方法则无此限制。
# ==和equals的区别
⭐ ==
基本数据类型 ==
比较的是值,引用数据类型 ==
比较的是内存地址。
因为 Java 只有值传递,所以对于 ==
来说,基本数据类还是引用数据类型,本质都是比较值,只是引用类型变量存的是对象的地址。
⭐ equals()
判断两个对象是否相等,不能用于比较基本数据类型,equals是存在于Object类中的方法。
public boolean equals(Object obj) {
return (this == obj);
}
1
2
3
2
3
equals()
方法存在两种使用情况:
类没有覆盖
equals()
方法,通过equals()
比较两个对象时等价于==
比较两个对象的地址类覆盖
equals()
方法,一般覆盖equals()
方法比较两个对象的内容相等,相等返回true
# wait()和sleep()的区别
- sleep()属于Thread类,wait()方法属于Object类。
- 两者都可以暂停线程的执行。
- 最主要区别:sleep没有释放锁,wait释放锁。
- wait通常被用于线程间交互,sleep通常被用于暂停执行。
- 使用wait、notify、notifyAll只能在同步方法或同步代码块中使用。
- wait被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notfiy和notifyAll方法,或者使用wait(long timeout)超时后线程会自动苏醒。sleep方法执行后,线程会自动继续运行。
# run()和start()的区别
系统调用 start 方法来启动一个线程,该线程进入就绪状态。当 CPU 为该线程分配时间片时,就可以运行其中的 run 方法。
直接运行 run 方法,就会当初一个普通函数来使用,而不是线程执行体。
# 获取键盘输入的常用方法
通过scanner
Scanner input = new Scanner(System.in); String s = input.nextLine(); input.close();
1
2
3通过BufferedReader
BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String s = input.readLine();
1
2
# foreach与for效率对比
对于for循环,是调用get(i)获取元素;对于foreach,是通过iterator实现的遍历,效率不同的原因主要是数据结构不同造成的。
对于ArrayList来说,它通过数组实现,可以随机存取,for和foreach循环效率差不多;
但是LinkedList是通过链表实现,for循环获取第i个元素必须从头开始遍历,而iterator遍历就是从头开始遍历,遍历完只需要一次,所以for循环需要的时间远远超过foreach。
# 对象的相等与引用相等的区别
对象相等:内存中存放的内容是否相等
引用相等:比较他们指向的内存地址是否相等。
# static可以修饰哪些内容
- 类变量:被 static 修饰的成员变量叫类变量(静态变量),类变量属于类,它随类存储在方法区,并不随对象存储在堆中,类变量可以通过类名和对象名来访问。
- 类方法:被 static 修饰的成员方法叫类方法(静态方法)。
- 静态块:被 static 修饰的初始化块叫静态初始化块。属于类,它在类加载的时候被隐式调用一次,之后不再被调用。
- 静态内部类:被 static 修饰的内部类叫静态内部类。可以包含静态成员,也可以包含非静态成员,静态内部类不能访问外部类的实例成员,只能访问外部类的静态成员。外部类的所有方法、初始化块都能访问其内部定义的静态内部类。
# continue、break、return的区别
- continue:跳出当前循环,继续下一次循环。
- break:跳出整个循环,执行循环下面的代码。
- return:跳出所在方法,结束该方法的运行。
- return;:结束该方法,无返回值
- return value:有返回值的函数方法
编辑 (opens new window)
上次更新: 2023/08/20, 21:21:52