Java 基础
OOP相关
1、什么是B/S架构?什么是C/S架构
答:
B/S中B是Brower,浏览器的意思;S是Server,即Brower/Server,用户通过浏览器访问服务。
C/S中C是Client,客户端的意思;Client的范围很大,可以包括浏览器,但是一般情况都是桌面定制。
2、Java都有那些开发平台?
答:
1)Java SE:主要用在客户端开发
2)Java EE:主要用在Wef服务器开发
3)Java ME:主要用在嵌入式开发
3、JDK和JRE的区别
答:
1)JDK:Java development kit:Java开发工具箱,运行在JRE之上,主要是提供给开发人员开发相关的业务功能。
2)JRE:Java Run Environment:Java运行时环境,java程序需要通过jre去运行。java的跨平台性是靠这个,支持多种语言,包括groovy,scala,java等程序。
4、Java语言有哪些特点
答:
1)跨平台
2)类库丰富,社区活跃,最受欢迎的语言之一
3)支持多线程,面向对象
5、面向对象和面向过程的区别
答:
整体来说算是一个编程进化的过程,面向过程出现在面向对象之前。
面向过程一般只需按照业务逻辑从头到尾编写即可,但是时间久了就会发现代码逻辑混乱,晦涩难懂,维护难度高。
为了解决面向过程编程遇到的问题,提出了面向对象编程。
面向对象编程:OOP,重点在于对象是什么:
赋予某个类丰富的功能,比如创建一个类对应业务功能的用户,把这个用户的动作行为封装在该类中,让这个类看起来就像人一样有手有脚。称之为对象。
具备某种功能的实体,称为对象。面向对象最小的程序单元是:类。面向对象更加符合常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
面向对象也是依据Java的三个特性:继承、封装、多态 来实现的。主要是一种设计思想。
面向对象的特征:四点:封装、继承、多态、抽象。
6、访问修饰符 public,private,protected,以及不写(默认)时的区别?
答:
作用域 | 当前类 | 同包 | 子类 | 其他 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
这个是对class的,其实对interface,默认就是public
7、Java的基本类型包括哪些:
答:
8种:
整形:byte,short,int,long
浮点型:float,double
字符型:char,char 在底层也会翻译成整形。
布尔型:boolean,boolean 在底层也会翻译成整形。
char 型变量中能不能存贮一个中文汉字?为什么?
- 在 C 语言中,char 类型占 1 个字节,而汉字占 2 个字节,所以不能存储。
- 在 Java 语言中,char 类型占 2 个字节,而且 Java 默认采用 Unicode 编码,一个 Unicode 码是 16 位,所以一个 Unicode 码占两个字节,Java 中无论汉字还是英文字母,都是用 Unicode 编码来表示的。所以,在 Java 中,char 类型变量可以存储一个中文汉字。
8、instanceof 关键字的作用?和 isAssignableFrom 区别?
答:
instanceof是java保留的二目操作符,用来判断该对象是否是某个java类型/父类/interface。返回值是boolean,true表示该对象是该类型,false表示不是该类型。
不过instanceof使用有限制,该对象不能是基本类型(什么是基本类型看第七点)。在编译阶段就会抛出异常类。
instanceof 等价于 Class.isInstance(),不过Class.isInstance()是提供给class去动态匹配的,使用的情况是我们只拿到了对象的class,没有拿到具体的对象的情况下。
isAssignableFrom 和 instanceof 功能类似,instanceof能实现的功能 isAssignableFrom 操作的对象是class,这一点和 instance 不一样。
看看使用情况应该更好理解:
interface ClassDemoInteface {
}
class ClassDemoParent {
}
public class Assigned extends ClassDemoParent implements ClassDemoInteface {
public static void main(String[] args) {
Assigned cd = new Assigned();
/* ----------- instance ------------*/
System.out.println(cd instanceof Assigned); // true
System.out.println(cd instanceof ClassDemoParent); // true
System.out.println(cd instanceof ClassDemoInteface); // true
System.out.println(cd instanceof Object);
/* ----------- isAssignableFrom ----------*/
System.out.println(Assigned.class.isAssignableFrom(Assigned.class)); // true
System.out.println(Assigned.class.isAssignableFrom(ClassDemoParent.class)); // false
System.out.println(Assigned.class.isAssignableFrom(ClassDemoInteface.class)); // false
System.out.println(ClassDemoParent.class.isAssignableFrom(Assigned.class)); // true
System.out.println(ClassDemoInteface.class.isAssignableFrom(Assigned.class)); // true
}
}
9、重载和重写的区别
答:
重载:指的是父类有一个函数签名(函数名/方法名),子类/同类使用同样一个同一个函数签名,但是我们的参数不一样(类型不一样,参数个数不一样都可以)。
然后在代码运行的阶段,jvm会自动帮我们匹配到一个符合的函数/方法,然后执行代码程序。
这里会引发另外一个问题:如果我的调用方法的时候传参发现有多种重载函数都能匹配上,怎么办?
一般只有基本类型才会出现上面的问题,为什么呢?因为这里涉及一个隐式转换和显式转换的问题?第10题会涉及这一点:
这个设计jvm的运行的重载函数的匹配顺序,下面直接给出匹配的结论点:
byte -> byte, short, int ,long ,float ,double,Byte,Number,Object
short -> short, int ,long ,float ,double,Short,Number,Object
char -> char, int ,long ,float ,double,Character,Object
int -> int ,long ,float ,double,Integer,Number,Object
long -> long ,float ,double,Long,Number,Object
重写:指的是子类使用和父类/接口同一个的一个方法签名(函数名/方法名),参数也一样,一般情况会使用注解@Override
标准出来。表示覆盖父类/interface方法。
10、什么是隐式转换,什么是显式转换?
答:
显示转换就是类型强转,把一个大类型的数据强制赋值给小类型的数据;
隐式转换就是大范围的变量能够接受小范围的数据;
隐式转换和显式转换其实就是自动类型转换和强制类型转换。
为了更方便理解,可以看下面的代码:
public static void main(String[] args) {
char c = '~'; //char 占 2 byte,16bit。
System.out.println(c); //~
int i = c;
System.out.println(i); //126
long l =c;
System.out.println(l); //126
double d = c;
System.out.println(d); //126.0
byte b = (byte) c;
System.out.println(b); //126
c = (char) (c << 3);
System.out.println(c); // ϰ
byte b1 = (byte) c;
System.out.println(b1); //-16
}