JAVA特点概述
一,跨平台
这无疑是java最大的特点了,我相信大多数人第一次听说java语言大都从跨平台开开始的。实际上java跨平台特性主要体现在两个方面:编码和运行机制。
1,编码
java语言相比较其他语言很特殊一点就是在java中基本类型char占两个字节(16位),即在java中一个汉字就是一个char,如图:
这是由于jvm内部统一使用unicode编码,unicode本就是一种统一的字符集编码格式,其为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
2,JVM
我们知道java并不是直接运行在操作系统中的,而是运行在java虚拟机(jvm)中,也就是说jvm是java代码和操作系统之间的过渡。
编译在c语言中,是指把c语言代码分析解释为二进制的机器指令,而java中的编译只是把.java文件解释成了.class文件,并没有变成机器指令,而.class文件要变成什么样的机器指令要由具体的jvm来决定。
我感觉jvm就像是一个适配器,在java代码和操作系统之间连接
二,面向对象
现在谈及高级语言,哪有不是面向对象的,java当然也不例外,当然也具有面向对象的基本特点——封装、继承、多态。我最开始接触面向对象的思想是在C++程序设计的课堂上,所以,我会把java和C++中的面向对象做对照。
1,封装
什么是封装:封装就是把数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作,才能对数据进行操作。
封装的表现:每一个类都是对某一类事物的属性和方法的抽象,都是一个封装;类中的每一个方法都是对一种操作的抽象,所以每一个方法也是一种封装。
授权——访问控制修饰符:前面说程序其他部分要经过授权才能对数据进行操作,要实现对不同情况的授权,java中有四种访问控制修饰符,如下图:
2,继承
什么是继承:在现实生活中,我们知道,儿子可以继承父亲的样貌,可以和父亲长的很像,也可以长得有点像母亲,还可以有点自己的特点,这其实就是继承。儿子继承父母的相貌,在程序中就是子类继承父类的属性和方法。
java中继承的特点:
1,只支持单继承,即一个子类只能继承一个父类,这点和C++不同,C++可以多继承
2,子类可以拥有父类的属性和方法
3,子类可以拥有自己的属性和方法
4,子类可以重写覆盖父类的属性和方法
5,父类装载子类,即new的是子类,但引用确是父类,这也叫子类到父类的自动转型,如下:
Parent p=new Child();
这种情况下,p调用的方法看上去是父类方法,但运行的是子类Child的方法。
这种情况也是可以强制转型的,如代码:
Child c=(Child)p
注意:强制转型永远只能向上转,比如这里new的是Child,你可以将其转换为Parent或Child,但不能转为Grandson,编译不会报错但会引起运行时异常:java.lang.ClassCastException
继承的优点
1,提高代码复用性,表现为子类和父类相同的方法不用在写一遍
2,是程序设计更符合人类常规思维方式,利于程序开发
java继承补充知识点
1,继承的类加载:父静态代码块-子静态代码块-父构造代码块-父构造方法-子构造代码块-子构造方法。其中静态代码块在多个实例化对象时只执行一次,而普通代码块则每次在构造方法前执行。父类除构造方法外的方法都会被子类覆盖。
2,子类覆盖父类的方法遵循的是“两同两小一大”原则。两同指的是方法名和形参列表相同。两小指的是子类方法的返回值类型要小于或等于父类被覆盖方法的返回值,子类方法声明抛出的异常应比父类方法抛出的异常要小或相等。一大指的是子类方法的访问权限应该比父类方法要大或相等。
3,静态方法(static)可以被子类继承,但是不能被子类重写(覆盖),方法相同时子类会将父类的该方法隐藏。
3,多态
多态的定义一句话概括起来就是:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
多态存在的三个必要条件:要有继承;要有重写;父类引用指向子类对象。
看到这三个条件是不是和熟悉,这不就是前面讲继承时的一些特点吗,还有我特别强调的转型问题,其实这就是多态实现的基础。
多态的好处:
1,可扩展性:增加新的子类不会影响已存在类的多态性、继承性,以及其他特性的运行和操作。增加子类只会扩展系统功能。
2,接口性:父类通过方法签名向子类提供共同接口,由子类来完善或覆盖。
instanceof运算符
多态机制导致同一类型的引用变量调用同一方法也可能导致运行结果不同,如例子:
public class Animal {
void bark() {
System.out.println("动物在叫");
}
public static void main(String[] args) {
Animal a=new Dog();
Animal aa=new Cat();
a.bark();
aa.bark();
}
}
public class Dog extends Animal{
void bark() {
System.out.println("狗叫");
}
}
public class Cat extends Animal{
void bark() {
System.out.println("猫叫");
}
}
//运行结果
/*
狗叫
猫叫
*/
public class Animal {
void bark() {
System.out.println("动物在叫");
}
public static void main(String[] args) {
Animal a=new Dog();
Animal aa=new Cat();
a.bark();
aa.bark();
}
}
public class Dog extends Animal{
void bark() {
System.out.println("狗叫");
}
}
public class Cat extends Animal{
void bark() {
System.out.println("猫叫");
}
}
//运行结果
/*
狗叫
猫叫
*/
所以在做强制类型转换时使用instanceod判断对象实际类型,以避免不可预料的结果。
抽象类和接口区别
1,抽象类的目的是简化编程,增加代码复用;接口是对下层编程者的约束,是一种规范。
2,很多情况下可以先有子类在抽象出共同的抽象类;而一帮情况下会先有接口,再有实现接口的子类。
3,其他异同如下图: