Java基础回顾
Java 特点1.面向对象一切行为方法都是以对象为单位更加容易维护和重用。2.平台无关性只要编写一次编译器可以将源代码编译成字节码只要安装了虚拟机就可以运行。3.支持多线程c需要调用操作系统来实现多线程java自己就提供4.内存管理有垃圾回收机制自动管理内存回收不再使用的对象Java的缺点1.没有python简洁开发效率有点低2.jvm本身占内存资源有限的话不是很友好3.严格的面向对象对一些简单的程序反而麻烦。JVMJDKJRE关系jvm是java虚拟机使得java支持跨平台jvm提供内存管理垃圾回收安全性等功能jdk是java开发工具包是开发java所需要的工具集合包含jvm编译器调试器提供了开发编译调试运行的工具和环境。jre是运行时候的环境包括jvm和java核心库。java的值传递1.首先java传递参数只有值传递java数据类型分为基本数据类型和引用数据类型。2.基本数据类型就和c里面的数据类型是一样的所以方法调用只是在方法里面改变了当方法结束时候原来的值并没有改变。3.引用数据类型相当于c里面的指针是一个对象的地址方法里面若是obj.name Bob的语句则是通过地址已经修改了name在堆上的数据而对于这样的obj new Person(Charlie);是修改了obj的值obj本身记录的是指针所以当方法结束这个值并没有改变仍然指向原来的对象。数据类型转换方式1.显式转换大范围转小范围容易发生精度丢失和数据溢出精度丢失float转doubledouble转int。2.隐式转化小范围转大范围自动转换3.字符串转换将字符串转换成数值型4.数值转换数值类型之间的转换。BigDecimal因为使用浮点数运算时候很容易参数精度丢失误差使用BigDecimal是精确计算建立对象时候使用字符串作为参数。装箱拆箱1.将基本数据类型和对应的包装类相互转换主要在赋值和方法调用时候回发生java1.5之前是手动后面都是自动由编译器转换。2.自动装箱的坏处在某些循环由于没有正确声明变量类型会导致创建很多无用的对象会加重垃圾回收工作量。Java为什么要有Integer1.Integer是int基本数据类型的包装类因为java很多的方法是以对象为单位比如ArrayList、HashMap只能存对象泛型必须是引用类型只有对象可以是null转化成String类型也只能用包装类。2.Integer作为包装类可以让一个int值有属性和方法结合在一起专门处理int型数据。Integer缓存Java在启动的时候提前创建好了一批常用的Integer对象-128 到 127放在内存里可以直接从内存中取出不用新建对象。Integer a 100;但是超过了-128~127后还是要新建。理解面向对象1.面向对象是一种编程范式一切事物都抽象成对象以对象为中心。2.对象包含他的属性还有行为具有灵活性和可拓展性。多态的各个方面方法重载同一个类里面有多个同名的方法不同的参数列表。方法重写子类具体重写实现父类中的的同名方法。接口与实现多个类实现同一个接口用接口的类型的引用(Animal animal)来调用类里面实现了接口的方法。animal.eat();向上转型和向下转型父类的引用指向子类对象把父类的引用转为子类引用(强制).面型对象设计原则单一职责原则一个类只负责一项职责与他无关的属性和方法不应该写入类里面里氏替换原则但凡父类对象使用的地方子类对象都可以代替开放封闭原则软件实体对拓展开放对修改关闭接口隔离原则接口一般设计成小而专让类不依赖它不需要的接口。依赖倒置原则高层不依赖低层模块两者依赖于抽象细节依赖于抽象抽象不依赖细节最少知识原则一个对象对其他对象有最少的了解。重写和重载的区别重载一个类里面有多个同名的方法但有不同的参数列表。重写子类可以重新写父类中的方法但是方法名参数列表都要一样。抽象类和普通类的区别普通类可以实例化不能有未实现的方法。抽象类不能实例化可以有实现和为实现的方法。java抽象类和接口的区别1.首先实现的关键字不同接口是implements继承是extends2.一个类可以实现多个接口但是只能继承一个类3.接口只能定义default方法体不能有其他的方法实现而抽象类里面可以有实现的方法4.接口的成员默认为public static final 必须赋初值且不能修改抽象类中成员变量默认是default而且子类可以重新定义赋值接口中可以定义哪些方法抽象方法默认方法静态方法私有方法抽象类有构造函数接口没有构造函数的原因1.抽象类本质还是类他可能会有属性子类在继承抽象类时候会调用构造方法初始化父类属性2.接口只能有静态常量不需要初始化所以不要构造方法。静态变量和静态方法静态变量:被所有类的实例所共享在类加载时初始化可直接通过类名访问静态方法没有创建实例也可以调用只能访问静态变量和静态方法不能访问非静态成员静态方法不支持重写但可以被隐藏。非静态内部类和静态内部类区别1.和静态非静态方法差不多是一样的只是一个是类一个是方法2.非静态内部类依赖于外部类的实例而静态内部类不依赖非静态可以访问外部类的实例变量和方法静态的不行非静态不能定义静态成员静态可以非静态内部类在外部类实例化后才能实例化而静态内部类可以直接实例化非静态内部类可以访问外部类的私有成员静态内部类不能直接访问私有成员需要实例化外部类来访问静态内部类只能访问外部类静态的。非静态内部类如何做到直接访问外部方法编译器在生成字节码的时候为非静态内部类维护了一个指向外部类实例的引用在编译器生成内部类构造函数时候将外部类实例作为参数传入。关键字final修饰类类不能被继承方法不能被重写变量一旦赋值不能改变static核心作用将成员与类本身关联而不是和实例关联修饰变量和方法之前提到过修饰代码块时候在类加载时就执行且执行一次且先于非静态代码块和构造方法深拷贝和浅拷贝浅拷贝是两个对象指向同一个引用对象深拷贝不是共享引用会生成一个全新的引用对象。深拷贝的三种方法实现Cloneable接口并重写clone()方法使用序列化让对象成为字节流和反序列化来实现深拷贝手动递归复制对象及其引用类型字段