沈益达Java基础总结

作者: 沈益达 | 来源:发表于2016-03-30 23:09 被阅读147次

          java是一门强类型语言(变量的使用要严格符合定义,所有变量都必须先定义后使用),java的内存结构是栈内存、堆内存、方法区。栈(用于局部变量,当数据使用完,所占空间会自动释放),堆(存放数组和对象,通过new建立实例,每一个实体都具有内存地址值,实体的变量都有默认初始化值,实体不被使用时会被垃圾回收器回收)共同特点都具备自己释放内存。Java中描述事物通过类的形式提现,类是具体事物的抽象,概念上的定义。在java中只支持单继承,不支持多继承{关于java中多继承困惑解答(类定义属性和方法描述某一类事物的抽象,接口定义的是行为并不限于任何具体意向)接口与接口的关系称为实现比称为继承更为贴切}。java对传输数据操作通过流的方式,用于操作流的对象都在IO包中。

    1.函数的特点:定义函数可以将功能代码进行封装,便于对该功能进行复用(提高代码复用性),函数之间只能调用函数,不可以在函数内部定义函数。

    2.数组:数组就是一个容器。

    3.面向对象(万物皆对象思想):基于面向过程创立而成,将功能封装进对象,强调具备了功能的对象。它符合人们的思考习惯,将复杂的事情简单化。面向对象叫做方法,而面向过程叫做函数

    3.1—封装(encapsulation):指隐藏对象的属性和实现细节,仅对外提供公共的访问方式,更好的将变化隔离,便于使用,提高重用性和安全性。

    3.2—继承(inheritance):指子类获得父类非私有属性和行为,继承提高了代码复用性,让类与类之间产生关系,提供了多态的前提和条件。继承中存在覆盖时,子类方法权限一定要大于等于父类方法权限。Final可以修饰类、方法、变量,修饰的类不可以被继承,修饰的方法不可以被覆盖,修饰的变量是一个常量,只能被赋值一次,内部类只能访问被final修饰的局部变量。关于抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。抽象类与普通类的区别就是抽象类是用abstract修饰的,抽象类可以有抽象方法也可以有普通方法,抽象类有构造器,但是抽象类本身却不能够被实例化,抽象类的构造方法就是给子类实例化时初始化使用的,因为初始化一个子类对象时会先调用super关键字对父类进行初始化。定义抽象类就是为了给子类继承,所以抽象类不能为final修饰的最终类,抽象方法不能为static,而抽象方法的权限至少为protected(或者是public)子类可以访问的。抽象类与接口区别:接口比抽象类更加抽象,接口中不能有抽象方法,抽象类只有单继承而接口可以多继承,接口中只能有public的抽象方法和public的变量。

    3.3多态(polymorphism):指某一类事物的多种存在形态,它的存在提高了程序扩展性和后期可维护性,前提是需要存在继承或者实现关系,而且要有覆盖操作。

    4.异常:throws(标识)用在函数上,后跟着异常类名、throw(抛)用在函数内,后面跟着异常对象。如果在处理异常时,之前执行了System.exit(0)操作,那么Finally代码块则不会被执行。一个方法被覆盖时,方法必须抛出相同的异常或者异常之类。

    5.多线程:通过继承Thread类方法创建线程,通过实现Runnable接口创建线程。Wait();和sleep();两者的区别:wait释放这个线程锁占用的系统资源到线程池中休息,而线程池的设计亨元模式,是自带队列的,如果去找它会找到后进去休息的线程,如果不去找它,它就会一直线程池中休息,从而占用喜用资源,而sleep是原地休息,不进线程池,所以不释放占用的系统资源。多线程安全问题,多个线程操作同一片资源的时候,极可能造成资源数据错乱,所以就需要使用到线程同步锁,同步锁就是把共享的资源加同步,只有一个线程能够对这片数据进行操作,当这个线程结束对数据的操作,就会释放同步让别的线程来操作数据,就不会造成数据的错乱。

           单例设计模式就是为了保证一个类的对象在内存的唯一性,单例设计模式有4种方式,其中两种比较早的方式是饿汉式与懒汉式。饿汉式线程同步效率高,但是在类被加载进内存时就会初始化对象,因此不能延迟加载(如果这个对象占用内存资源较多),就会比较浪费资源,并且无法防反射破解。懒汉式是可以达到延迟加载,但是线程不同步,如果懒汉式加了同步锁,调用效率就会比较低,并且也无法防反射破解。因此有了两种新的方式取代饿汉式与懒汉式。枚举式取代了饿汉式,枚举式就是天然的单例,并且它是由虚拟机底层创建的,天然防反射破解,调用效率高,可惜不能延迟加载。私有静态内部类式取代了懒汉式,定义一个静态内部类,需要时在内部类创建外部类对象,内部类创建对象数据局部变量,不会再类加载时就被初始化,因此达到延迟加载,并且线程同步,但是遗憾的是它也无法防反射,只能认为的在单例类构造器中做些手脚来防止反射破解。

    6.集合(Collection):就是对多个对象进行操作和存储。问数组和集合类同是容器,有何不同?数组长度固定且只能存储基本数据类型,而集合长度可变但只能存储对象。它的接口List(列表):可存放重复元素,元素存取是有序的、Set(集):不可存放重复元素,元素存放是无序的。ArrayList():线程不安全,查询速度快、LinkedList:链表结构,增删速度快。集合的迭代就是取出集合中的元素的一种方式,Collection中有Iterator方法所以每一个子类集合对象都具备迭代器,迭代器在集合接口中是通用的,它替代了Vector类中的Enumeration(枚举),next方法是自动向下取元素,要避免出现NoSuchElementException,返回值类型是Object记得要转换类型。Set集合元素唯一性原因:HashSet通过equals方法和hashCode方法来保证,TreeSet通过compareTo或compare方法来保证。泛型的特点提高了程序安全性,将运行期遇到的问题转移到了编译期,省去了类型强转的麻烦,优化了程序的设计。Map集合常用类HashMap:线程不安全,速度快,允许存放null值,null键、TreeMap:对键进行排序,原理与TreeSet相同。

    7.IO(Input、Output)流:处理设备之间数据传输是通过IO流来完成,按操作数据分为:字节流和字符流,按流向分为:输入流和输出流。缓冲区提高了对数据的读写效率。BufferedReader是装饰设计,用于增强同一个体系中的Reader的子类。装饰设计模式中的装饰类通常跟被装饰类是在同一个体系中,但是两者间不存在直接关系,都是通过组合、多态的方式,让增强类持有被增强类的父类或者接口引用,在需要增强被增强类时,就把被增强类的对象传给增强类,装饰设计模式避免了继承体系膨胀的好处,但是也带来小对象过多的弊端。

    8.GUI(图形化界面):事件监听机制就是确定事件源,通过事件源对象addXXXXListener()方法接收XXXListener的子类对象,一般用匿名内部类来表示。网络通信就是Socket间的通信,Socket是网络服务提供的一种机制,数据在两个Socket间通过IO传输。


    扩展内容:

       在GOF23设计模式中接口、组合跟多态都是一起使用的,例如行为模式中的状态模式,设置一个状态接口,然后许多种状态类实现那个状态接口,真实对象持有这个状态接口的引用,真实对象再通过多态达到不同状态的切换。

    问:int与Integer的区别:

    int是基本数据类型,直接用来存数值,而Integer是一个类,int的初始化参数为0,而Integer是null。

    问:泛型有什么作用:

    在数据类型不明确的时候可以使用泛型。java是解释型语言,一个程序运行分两个步骤,一个是编译时,一个是运行时,而泛型就是在编译时进行参数类型的安全检查,所有的强制类型转换都是自动的和隐式的,提高代码的重用率。泛型不能使用在静态属性跟静态的方法上,泛型也不存在多态。

    问:说说暴力反射与反射的区别:

    java的一个程序运行分为运行时和编译时,反射就是在运行时加载某个对象在内存中唯一的字节码文件,并且获取该字节码文件中的各种属性,把字节码文件中的各种属性拆分成各种java类, 而暴力反射就是把语言访问检查setAccessible开关设为true,这样虚拟机在反射时就会取消安全访问检查,提高了反射速度,并且可以对私有属性进行访问。

    问:正则表达式的利弊:

    正则表达式用一些符号对字符串进行操作,简化了书写,但是很多符号乱糟糟的聚集在一起很大程度降低了阅读性。

    相关文章

      网友评论

        本文标题:沈益达Java基础总结

        本文链接:https://www.haomeiwen.com/subject/ipkelttx.html