1. 什么是对象?
语法:Classname objname = new Classname();
示例:Person p = new Person();
2. 为什么Java不支持多继承?
首先会产生歧义问题,比如类A有个方法foo(),并有两个子类B和C有自己的foo()实现,现在假如有类D继承B和C,当D调用foo()方法时,编译器则不能确定哪个foo()方法会被调用。
A foo()
/ \
B foo() C foo()
\ /
D foo()
其次多继承会造成设计、创建的复杂性,比如强制转换、构造器链等。
另外有了多继承也不会带来太多的好处,所以为简化目的,不要多继承,也许是明智的决定。
3. 给出this关键字的示例。
class Square {
int height;
int width;
Square(int height, int width) {
// 注意:参数名与实例变量名是相同的
this.height = height;
this.width = width;
}
}
4. 封装是什么?请举例。
封装是一个技术手段,设置属性为private,并提供public的方法来访问这些属性。
如果一个属性设置为private,则被隐藏在类中,不能在类之外被访问,因此封装也可以叫做数据隐藏。
封装的最大好处就是可以修改我们的代码实现,而不会影响其他人使用我们的代码,因此封装可以使我们的代码具有可维护性、扩展性和灵活性。
class Person {
private int age;
private String name;
public void talk() {
System.out.println("Hello I am " + name);
System.out.println("my age is " + age);
}
}
5. 什么是方法重载(Overload)?请举例。
方法重载意味着可以有2个或更多的方法名字相同,但方法签名不同。这些方法可能存在于同一个类中,也可能存在于父子关系类中。
class Person {
private String firstName;
private String lastName;
Person() {
this.firstName = "";
this.lastName = "";
}
Person(String firstName) {
this.firstName = firstName;
this.lastName = "";
}
Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
6. 定义static变量和static方法?
static关键字主要是为了内存管理,我们可以在变量、方法、代码块和嵌套类上使用static。
static变量:可以被所有对象使用,就好比员工的公司名,学生的学校名。static变量只在类加载时在类区域分配内存一次。
static方法:static方法属于类而不属于对象。static方法可以被类直接调用而不需要创建对象。static方法可以访问static变量且可以改变static变量的值。
7. 什么是抽象?
抽象就是隐藏内在实现细节,而只对外显示功能。
8. 接口和抽象类的区别?
接口:接口是隐式抽象的,没有任何实现。接口中的变量默认是final的。接口中的成员默认是public的。接口通过implements关键字实现。接口只能扩展接口。一个类可以实现多个接口。接口是绝对抽象的,不能被实例化。
抽象类:抽象类可以有实例方法,实现子类的默认行为。抽象类可以包含non-final变量。抽象类可以有一般的成员,比如private、protected等。抽象类通过extends关键字被扩展。抽象类可以扩展其它类和实现多个接口。抽象类不能被实例化,但可以通过main()方法启动。
9. public和private区别?
public:public方法和构造器可以被任何Java程序调用,无论是否在同一个包中。
private:不能用于类(可用于内部类)和接口。不能用于接口中的属性和方法。private变量、方法和构造器不能被当前类之外的代码访问。
10. 什么是super关键字?
super是一个引用变量,用于引用直接父类对象。当你创建一个子类对象时,一个父类对象会隐式实例化,可以通过super来引用。
super可以引用直接父类的变量,super()用于调用直接父类的构造器,super可以调用直接父类的方法。
11. Java中的访问修饰符有什么?
private、protected、default、public
12. 本地变量?
本地变量是指方法中声明的变量,且只能在这个方法中使用的变量。
public class HelloApp {
public static void main(String[] args) {
String helloMessage; // 本地变量
helloMessage = "Hello, World!";
System.out.println(helloMessage);
}
}
13. protected和default有什么区别?
protected:protected不能用于类(可用于内部类)和接口,也不能用于接口中的属性和方法,protected属性、方法和构造器可以在同一个包中访问,只能被其它包中的子类访问。
default:不用于接口中的属性和方法,default属性、方法和构造器只能在同一个包中被访问。
14. 什么是类?
类是创建对象的模型,且实际中不存在。属性和方法类代码存储在JVM中。当需要使用类时,我们需要创建一个这个类的对象。
class Person {
String name; // 属性
int age;
void talk() { // 方法
}
}
15. 什么是继承?
从一个类衍生出另一个类就叫做继承。被继承的类叫父类,继承的类叫子类。
16. 解释一下接口?
接口只能有抽象方法和常量,一个类实现接口,需要实现接口中的方法。
public interface Playable {
void play();
}
17. 继承的类型?
多层继承、多继承、层次继承。
18. 什么是多态?
多态给我们最大的扩展灵活性,定义同名的多个方法是多态。有两种多态,一种是编译时多态(重载-Overload),一种是运行时多态(重构-Override)。
19. 什么是实例变量?请举例。
对象创建时实例变量会初始化给默认值。boolean默认值是false,数据字型是0,任何引用对象的变量默认值为null。
class Circle {
// 实例变量
double x;
double y;
double z;
// 实例方法
void scale(double a) {
radius *= a;
}
}
20. 方法定义。
方法表示执行任务的代码语句组合,方法组成:方法头、方法体。
语法:修饰符 返回类型 方法名(参数类型1 参数1,参数类型2 参数2,...)
返回类型:方法返回的值的类型。
方法体:方法做什么的代码语句集合。
方法名:方法的名字,方法名和参数列表组成方法签名。
参数:参数就像占位符,当方法调用时,需要给参数赋值。
public static int max(int num1, int num2) { // 方法头
// 方法体
int result;
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
21. 什么是final方法?请举例。
final方法:用final修饰,不能被覆盖(Override)。
子类不能扩展父类的final方法。
22. 什么是默认构造器?请举例。
没有参数的构造器是默认构造器。
语法:class-name() {}
class Bike {
Bike() {
System.out.println("bike is created.");
}
public static void main(String[] args) {
Bike b = new Bike();
}
}
23. 抽象方法定义?
抽象方法是指需要在子类中实现的方法。抽象方法定义在父类中,但没有方法体。如果一个类包含抽象方法,那这个类必须是抽象类。
抽象方法语法:
abstract class clsName {
// 变量描述
// 构造器
// 抽象方法
abstract rtype mthName(params);
}
clsName:类名,合法的java标识符。
abstract:关键字,定义抽象方法。
rtype:方法的返回类型。
mthName:方法名,合法的java标识符。
24. 什么是final变量?请举例。
final可用于变量、方法、类。
final变量不能被修改。
25. 什么是参数化构造器?请举例。
参数化构造器可以为不同的对象提供不同的值。
class Student {
int id;
String name;
Student(int i, String n) {
id = i;
name = n;
}
void display() {
System.out.println(id + ", " + name);
}
public static void main(String[] args) {
Student s1 = new Student(111, "abc");
Student s2 = new Student(222, "xyz");
s1.display();
s2.display();
}
}
26. this关键字的作用是什么?
this关键字引用当前类实例,可调用当前类构造器,调用当前类方法。
语法:this.varName