面向对象的特征主要有:抽象、封装、继承、多态。
其各自的好处个人粗略理解为:
抽象:将各种逻辑抽象为客观处在的事物,这样便于人们的思维理解与操作。
封装:将数据与操作封装起来,保护数据不被外界干扰和随意修改,便于维护。
继承:便于代码重用,只需从一个类衍生到另一个类,并做稍微修改就能重用该类。
多态:类与函数的多种信息状态,使代码的编写更加灵活也便于代码重用。
属性的多重指针的引用牺牲了系统性能。
类和继承等特点使得程序会多很多指针操作来定位函数入口和自身要维护虚拟方法表等额外的工作,程序的处理效率相对要低(但程序开发效率高)。所以现在单纯的C语言还是大为用武之地的。
但随着科技的进步,CPU和内存的性能也突发猛进。由原来的1核到8核,内存16M和现在的16G,所以程序的效率多多少少会随着硬件的性能变得更好。你可以发现很多大的项目也开始由C转而变成让c++和JAVA等面向对象来写了。
1.概念:
取值范围小的数据或者变量,可以直接赋值给取值范围大的变量(小萝卜可以放入大坑中)
2.特点
(1)不需要进行代码的特殊处理
(2)byte/short/char数据,只要参加运算,就会自动转换成int类型
(3)整个表达式最终的数据类型,一定是表达式中取值范围最大的那个类型
byte、short、char-->int-->long-->float-->double
1.概念:
取值范围大的数据或者变量不能直接赋值给取值范围小的变量(大萝卜不能直接放入小坑中)
解决方案:
(1)坑变大
(2)萝卜变小,强制类型转换
强烈注意
- 浮点转成整数,直接取消小数点,可能造成数据损失精度。
- int 强制转成short 砍掉2个字节,可能造成数据丢失。
- long 强制转成int 砍掉4个字节,可能造成数据丢失。
范围小的类型向范围大的类型提升, byte、short、char 运算时直接提升为 int 。
byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double
这个链接和下面配合着看更容易理解
java是值传递,没有引用传递
而对于引用类型来说,变量存的是实例对象的地址,如上图也画的0x10一样,它指向实例对象。一般称这种变量为"引用"
。对于我们的String str = “MDove"来说,str就是这个引用,这个引用指向了"MDove”。
由上图,我们可以看出,对于基本类型来说,count = 666;是直接进行赋值。而str = “MDove is cool.”;则是重新开辟了一块空间,然后将这块空间的地址赋值给str变量(引用)。
对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)
字节码文件是经过编译器预处理过的一种文件,是JAVA的执行文件存在形式,
Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。
它本身是二进制文件,但是不可以被系统直接执行,而是需要虚拟机解释执行,由于被预处理过,所以比一般的解释代码要快,但是仍然会比系统直接执行的慢。
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
java源程序先经过javac编译器编译成二进制的.class字节码文件(java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。
最后解释下机器码和字节码的区别:
一,机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的0 1代码 意思也可能是不同的~换句话说,根本不存在跨平台性~比如~不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~
二,我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论哪种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~
/*
JDK= JRE+开发工具包
JRE = JVM+核心类库rt包
JVM 保证java跨平台
类加载器 用来加载类 的
就是把类.class加载到内存中,并生成Class对象。
只要使用了类就加载!
三种类加载器
引导类加载器
bootClassLoader
rt包下的 java的核心类库
扩展类加载器
ext包下的
ExtClassLoader
应用类加载器
appClassLoader
第三方jar包 自己写的类
如果一个类在内存中了那么它必然 被某一个类加载器加载
字节码文件对象 Class 运行时的类
类名.class 对象名.getClass
getClassLoader() 负责该类的加载器
类会被加载 而且 只被加载一次
全盘委托 负责机制
负责 谁用谁加载
A类{
B类
}
加载A类的加载器 负责加载B类的加载。
全盘委托
在加载B类之前,询问 扩展类加载器 有没有加载过B类。
询问 引导类加载器 没有
*/
public class ClassLoaderDemo {
public static void main(String[] args) {
// ClassLoader classLoader = String.class.getClassLoader();
//
// System.out.println(classLoader);
//扩展类加载器
// ClassLoader classLoader = DNSNameService.class.getClassLoader();
// System.out.println(classLoader);
//应用类加载器
ClassLoader classLoader = ClassLoaderDemo.class.getClassLoader();
System.out.println(classLoader);
}
}
部分知识引用自:
https://baijiahao.baidu.com/s?id=1614769568984126810&wfr=spider&for=pc(java的方法中是引用传递还是值传递)
https://www.nowcoder.com/questionTerminal/a90230b35b5f4a7287f779ecdd88841d
https://blog.csdn.net/u010945925/article/details/9050917