1、基础
1.1、面向对象编程有哪些特性
1、抽象
抽象就是对同一个目标的共有的属性、特征、方法、功能、行为等进行抽取并归纳总结,它是一种将复杂现实简单化为模型的过程,它关注的是对象行为,而不用关注具体的实现细节。
在面向对象编程中,抽象主要是通过抽象类和接口来实现的:
- 抽象类是不能被实例化的,它包含一些抽象的方法和具体的实现方法。
- 接口是一种特殊的抽象类型,一般仅包含抽象方法的声明,在java8+中可以包含默认的方法和静态方法实现
抽象可以在不知道具体实现的情况下编程,提高了代码的灵活性和拓展性。
2、封装
封装就是指隐藏对象的属性和实现细节,将对象的数据、属性、行为、方法等组合到下一个单一的单元中,并通过访问修饰符控制成员属性的访问和修改权限,再通过特定公开的方法setter和getter方法暴露给外面访问。
private String name = "ccshen";
public String getName(){
return name;
}
name属性被private封装起来,外面只能通过对象的getName才能访问。
3、继承
继承是一种实现代码重用的机制,允许一个类继承另一个类的成员和方法,使得子类也能具有父类相同的行为。
继承是通过 extends 关键字实现的:
public class Dog extends Animal{
@Override
void eat(){
System.out.printIn("狗吃饭")
}
}
java类之间只能实现单继承,接口之间可以多继承。
4、多态
多态指同一个行为在不同情况下的多种不同表现形式或形态,主要体现为同一个接口或父类的引用指向不同的实现对象,并能够在运行时动态决定调用的具体实现,这使得程序具有更好的灵活性和可扩展性。
Animal animal = new Dog();
animal.eat();
通过父类引用变量指向子类时,当调用父类的方法时,它实际上会根据实际对象的类型,去调用子类中的方法。
1.2、JDK与JRE的区别
JDK:是整个Java的核心,包含了Java的运行环境(JRE)和一系列Java开发工具完整包。
JRE:是Java程序的运行环境,包含JVM、Java核心类库等。JRE只能运行Java应用程序,不能用于编译开发,它是JDK的子集。
安装JDK后就有JRE目录,JRE属于JDK的子集。
1.3、如何编译和运行Java文件
使用javac命令来编译.java文件
javac Test.java
运行后会生成Test.class文件
1.4、Java标识符命名规则
- 标识符只能由字母、数字、下划线(_)、美元符号($)组成
- 标识符不能由数字开头
- 标识符不能使用Java关键字,比如 for
// 类名
class User(){
// 变量名
int firstName;
// 常量名
private static final int default_code = 60;
// 合法方法名
public void setFirstName(int firstName){
this.firstName = firstName;
}
}
1.5、Java定义常量
Java常量是指使用final修饰的变量,它们的值在初始化后不能被改变
final int age = 30;
加修饰范围,以及静态关键字
private static final age = 30;
常量的作用域可以是类级别(普通、静态),方法级别。
1.6、Java有哪几种基本数据类型
Java有 4类 8种 数据类型
整数型:byte、short、int、long
浮点型:float、double
字符型:char
布尔型:boolean
1.7、== 和 equals 比较有什么区别
==
如果比较的对象是基本的数据类型,则比较的是数值是否相同
如果比较的对象是引用数据类型,则比较的是对象的地址是否相同
equals
equals是Object类提供的方法,接收Object参数类型
用来比较两个对象是否相等,默认比较的是对象地址,不能用于比较基本数据类型,但可以是包装类型,所以,如果是要比较两个对象的值是否相等,一般需要重写equals与hashcode方法 。
比如常用的String、Date、Integer等类都重写了equals和hashcode方法,比较的是存储对象的内容是否相等,而不是堆内存地址。
1.8、s1 = s1 + 1 和 s1 += 1 区别
如果s1原有数据类型小于int类型,则s1 = s1 + 1发生编译异常
因为s1是short类型,1是int类型,所以计算结果为int类型,它不能自动转换为比它小的数据类型,所以发生编译异常。
解决办法使用类型强制转换:
public static void main(String[] args){
short s1 = 1;
s1 = (short)(s1 + 1);
// s1 = 2
}
使用s1 += 1不会有问题,因为 s1 += 1;支持隐式强制类型转换
public static void main(String[] args){
short s1 = 1;
s1 += 1;
// s1 = 2
}
1.9、float n = 1.8 有错吗
有错!!!
因为double是双精度型浮点型,float是单精度型浮点型。
数字1.8默认是double类型,如果将一个double类型的值赋值给一个float类型的变量时,需要进行类型转换,因为double类型的精度高于float类型。
这种情况,如果不显示进行类型转换,编译器报错,因为可能会有精度丢失
因此需要强制类型转换或后面加上F:
float n = (float)1.8;
float = 1.8F;
1.10、i++ 与 ++i 区别
i++是先赋值后加1,++1是先加1后赋值