通过这段时间的学习,对这些概念有了一点的了解,现在摘录下来做个记录,继续加深印象,同时联系打字。
一、面向对象与面向过程的区别
面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采取面向过程开发,性能是最重要的因素。
去电:没有面向对象易维护、易复用、易扩展。
面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活易于维护。
缺点:性能较低。
经过一段时间的学习,对面向对象有了一点点理解,面向对象是一种思考方式,但是并不是说所有的问题都可以用面向对象来解决。我自己感觉Java比较好在于解决了C++多继承这个bug,我自己的观点是程序的易维护性应该比运行效率更重要,多继承时常导致继承关系很难被理顺。
二、Java语言的特点
1、简单易学;
2、面向对象(封装、继承、多态);
3、平台通用(虚拟机实现);
4、可靠性;
5、安全性;
6、支持多线程(C++语言没有内置的多线程机制,因此必须调用操作系统的多线程功能进行多线程程序设计,而Java语言提供了多线程支持);
7、支持网络编程并且很方便;
8、编译与解释共存。
Java学起来简单吗?没感觉,只不过学过C语言之后再来看Java可能比较简单一些;
Java做电脑界面很方便,怪不得用来开发安卓系统;
不过,Java做图形界面方便,也有与串口有关的与其他硬件通信的API,为什么做仪器界面设计的不用Java呢?可能是不如matlab方便,毕竟matlab本来就是用来处理数据的。
三、关于JVM、JDK和JRE
JVM:JVM是Java虚拟机,是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,在不同的系统给出相同的结果。
JRE:JRE是Java运行时的环境。是运行已编译Java程序所需的所有内容的集合,包括Java虚拟机(JVM),Java类库,Java命令和其他一些基础构件,但是不能用来创建新程序。
JDK:Java Development Kit是功能齐全的Java SDK,拥有JRE所有的一切,还有编译器(javac)和工具。能够创建和编译程序。
四、Java与C++的区别
都是面向对象的语言,都支持封装、继承和多态;
Java不提供指针来直接访问内存,程序内存更安全;
Java的类是单继承的,但是可以应用多个接口,实现C++多继承的功能;
Java有自动内存管理机制,不需要手动释放无用内存。
为什么会有人没学过C++,C++和C不是一样吗?Java也不是没有指针,只是具体细节被封装起来不暴露出来,比如声明一个字符串String ab,这个时候这个ab实际就可以看作是指针,或者说指向一个对象的变量,就可以看做是指针;
可能就是Java不考虑那么细,于是不适合结合硬件;
相比之下,Java确实是更加智能。
五、字符型常量和字符串常量的区别
1、形式上:字符常量是单引号引起的一个字符,字符串常量是双引号引起的若干个字符;
2、含义上:字符常量相当于一个整形值(ASCII值),可以参加表达式运算,字符串常量代表一个地址值;
3、内存大小:字符常量占两个字节,字符串占若干个字节。
我是把字符串看作是一个类,因此可以调用各种方法。
六、关于构造器Constructor
父类的私有属性和构造方法不能被继承,所以Constructor不能被(重写)override,但是可以被(重载)overload。一个类里面可以有多个构造函数。
七、重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出异常范围小于等于父类,访问修饰符大于等于父类。
八、String StringBuffer和StringBuilder
可变性:String类中使用final关键字字符数组保存字符串,private final char value[] ,所以String对象是不可变的。而StringBuffer和StringBuilder继承自AbstractStringBuilder类,也是用char value[] 保存字符串,没有用final关键字修饰,所以这两种对象都是可变的。
线程安全:
String的对象不可变,线程安全;
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,因此线程安全;
StringBuilder没有对方法加同步锁,因此非线程安全。
性能:
每次对String类型进行改变时,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对StringBuffer本身进行操作,而不是生成新的对象宾改变对象引用。相同情况下使用StringBuilder相比使用StringBuffer可以获得10%-15%的性能提升,但是会冒多线程不安全的风险。
Java为了保证线程安全提供了很多部件,包括提供繁多的数据结构的类型,确实提供一些便利但是也算是Java设计的一个问题。
九、自动装箱和拆箱
装箱:将基本数据类型用他们对应的引用类型包装起来;
拆箱:将包装类型转变为基本数据类型。
十、接口与抽象类的区别
1. 接口的方法默认是public,所有的方法在接口中不能有实现,抽象类可以有抽象的方法;
2. 接口的实例变量默认是final类型的,而抽象类则不一定;
3. 一个类可以实现多个接口,但最多只能实现一个抽象类;
4. 一个类实现接口就要实现接口的所有方法,而抽象类不一定;
5. 接口不能用new实例化,但是可以声明,但是必须引用一个实现该接口的对象。从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范
十一、==与equals
==的作用是判断两个对象的地址是不是相等。也就是判断两个对象是不是同一个对象;
equals有两种使用情况:
1. 类没有覆盖equals方法。则通过equals比较该类的两个对象时,等价于通过“==”比较这两个对象;
2. 如果类覆盖了equals方法,可以实现两者内容相等则返回true。
说明:
String中的equals方法是被重写过的,object中的equals比较的是对象的地址,而String中的equals比较的是对象的值。
那么Java中有运算符重载么?还是一般通过这种方式实现?