1、面向过程与面向对象的区别?
· 面向过程性能好,面向对象易维护
· 原因:1类调用需要实例化,耗资源;2而且java是半编译语言。
· 应用:1单片机等追求性能,没啥改动的用面向过程;2互联网业务系统用面向对象。
2、Java的特点?
· 面向对象(封装、继承、多态)
· JVM实现平台无关性
· 支持多线程
· 支持网络编程
· 编译与解释并存(java --编译--> class,class --JVM运行--> 机器码)
3、JVM(JOT,AOT),JDK,JRE是些什么鬼?
4、Oracle JDK 和OpenJDK
5、字符型常量 和 字符串常量的区别?
· 字符型 单引号 相当于整数型(ASCII)可以进行表达式运算
· 字符串 双引号 是引用类型(一个地址)
public class JavaGuide {
public static void main(String[] args) {
char charCom = 'a'; //字符型常量,单引号
String stringCom = "String"; //字符串常量,双引号
System.out.println(charCom + 1);//字符可以进行运算,ASCII码
}
}

6、构造器 Constructor 是否可被 override?
首先,重写发生在父子类之间,所以父子类名都不一样,构造器都不能被继承,那就更不能被重写了。
[Hero.class文件]
public class Hero {
public Hero() {
}
public String name() {
return "hero";
}
}
[SuperMan.class文件]
public class SuperMan extends Hero {//Hero的构造器没有被继承,所以不能被重写
public SuperMan() {
}
public String name() {
System.out.println("超人");
return "超人";
}
}
7、重载(overload) 和 重写(override) 的区别?
· 重载发生在同类中,重写通常发生在(父子类/接口实现)中;
· 方法签名(方法名与参数列表),重载必须不同,重写必须相同;
· 重写时,返回值的类、异常类 必须 子类里的小于等于父类里的(故:返回void/基本数据类型就不能改了); 访问权限修饰符,必须(子)大于等于(父)
· 重载时,随便,可改
· 重载发生在编译,重写发生在运行
【Hero.java】
public class Hero {
public String name(){
return "hero";
}
public Hero hero(){
return new Hero();
}
/*Overload
方法重载:必须动签名,修饰符列表可动,编译期
*/
public Hero hero(int a){
system.out.println(a++);
return new Hero();
}
}
【SuperMan.java】
public class SuperMan extends Hero {
/* 运行期
重写1:改逻辑,不动签名。
默认不写也行,同名同参自然是可以重写的;
不同名自然是不能重写的,但是建议写上,便于解释器找到错误
*/
@Override
public String name(){
return "超人";
}
/*
重写2:可以改返回值类型,但只能改为子类,例如:superman 是 hero 的子类
所以void,和基本数据类型的返回值自然是不能改了!
*/
@Override
public SuperMan hero() {
return new SuperMan();
}
}
8、Java的三特性,封装、继承、多态
封装:对象的属性私有化,提供访问它们的方法
继承:代码复用,但不能选择性继承,包括私有的。可以加,可以盖
多态:父类型引用指向子类型对象导致的程序在编译和运行阶段的两种不同的绑定,称为多态;
- 编译阶段,静态绑定,a1为Animal类型,只能调用在Animal中存在的方法;
- 运行阶段,动态绑定,a1是Cat类型对象的引用,实际调用的是Cat中的方法,无论有没有重写。
多态扩展:向上转型:父类引用指向子类对象
向下转型:子类引用指向父类对象
用于需要的方法为子类特有时
有风险:两类型没有继承关系:Animal a2 = new Bird(); Cat c2 = (Cat)a2;
编译通过,运行报错:java.lang.ClassCastException
用instanceOf判断规避