zoukankan      html  css  js  c++  java
  • JAVA基础知识总结

    JAVA基础知识总结

    什么是方法(函数):就是完成特定功能的代码块。函数就是方法,方法就是函数。如果非要说区别的话,方法应该是面向对象编程的产物,因为对象才具有某种方法,但是在具体表现上,两者没有任何区别。
    
    方法重载:在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表(参数个数和参数类型)不同,与返回值无关。
    
    数组:是存储同一种数据类型多个元素的集合,也可以看成是一个容器。
    
    栈:存放的是局部变量(是在方法定义中或者方法声明上的变量)。
    
    堆:存放的是所有new出来的东西。
    
    面向对象:是把功能类似的封装在一起,用的时候,找到对应的类。
    
    属性:就是该事物的描述信息。——》成员变量
    
    行为:就是该事物能够做什么。——》成员方法
    
    类:是一组相关的属性和行为的集合。(类是该事物的描述信息)
    
    对象:是该事物的具体体现。
    
    成员变量和局部变量的区别:(1)在类中的位置不同:成员变量在类中,方法外;局部变量在方法定义中或者方法声明上。(2)在内存中的位置不同:成员变量在堆内存;局部变量在栈内存。(3)生命周期不同:成员变量随着对象的创建而存在,随着对象的消失而消失;局部变量随着方法的调用而存在,随着方法的完毕而消失。(4)初始化值不同:成员变量有默认初始化值;局部变量没有默认初始化值,必须定义,赋值,然后才能使用。注:局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
    
    形式参数:基本类型的形式参数的改变不影响实际参数;引用类型的形式参数的改变直接影响实际参数。
    
    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。好处:隐藏实现细节,提供公共访问方式;提高代码的复用性;提高安全性。
    
    private关键字特点:是一个权限修饰符;可以修饰成员变量和成员方法;被其修饰的成员只能在本类中被访问。
    
    this关键字特点:是当前类的对象引用。(代表当前类的一个对象。this是随着对象的创建而创建。)
    
    构造方法:是创建对象,给对象中的成员进行初始化。特点:方法名与类名相同;没有返回值类型,连void都没有;没有具体的返回值。
    
    static关键字特点:随着类的加载而加载;优先于对象存在;被类的所有对象共享;可以通过类名调用,本身也可以通过对象名调用。注:在静态方法中是没有this关键字的,因为this代表当前对象,而静态时,有可能没有对象,static是优先于对象,所以this无法使用。静态只能访问静态,而非静态可以访问静态和非静态。
    
    静态变量和成员变量的区别:(1)所属不同:静态变量属于类,所以也称为类变量;成员变量属于对象,所以也称为实例变量(对象变量)。(2)内存中位置不同:静态变量存储于方法区的静态区;成员变量存储于堆内存。(3)内存出现时间不同:静态变量随着类的加载而加载,随着类的消失而消失;成员变量随着对象的创建而存在,随着对象的消失而消失。(4)调用不同:静态变量可以通过类名调用,也可以通过对象名调用;成员变量只能通过对象名调用。
    
    代码块:是在Java中,使用{}括起来的代码。
    
    常见代码块的应用:(1)局部代码块:在方法中出现,限定变量生命周期,及早释放,提高内存利用率。(2)构造代码块:在类中方法外出现,多个构造方法,方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行。(3)静态代码块:在类中方法外出现,加上static修饰,用于给类进行初始化,在加载的时候执行,并且只执行一次。
    
    继承:多个类中存在相同属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无需在定义这些属性和行为,只要继承那个类即可。好处:提高代码复用性、维护性;让类与类之间产生了关系。
    
    JAVA中类的继承特点:只支持单继承,不支持多继承,但是支持多层继承。
    
    super关键字:是子类局部范围访问父类成员变量。
    
    this和super的区别:this代表的是本类对象的引用;super代表的父类的引用,可以操作父类的成员。
    
    方法重写:子类中出现了和父类中一模一样的方法声明(方法名、参数列表、返回值类型),也被称为方法覆盖,方法重写。
    
    方法重写(Override)和方法重载(Overload)的区别?方法重载能改变返回值类型吗?
    答:区别:重写存在于子父类,或者子父接口中,方法声明相同;重载是同一个类中,方法名相同,参数列表不同。方法重载可以改变返回值的类型,因为它与返回值类型无关。 final关键字:是最终的意思,可以修饰类、变量、成员方法。 为什么会有final:由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法。 final特点:被修饰的类不能被继承;被修饰的方法不能被重写;被修饰的变量不能被重新赋值,因为这个量其实是一个常量。 多态:是某一个事物,在不同时刻表现出来的不同状态。好处:提高代码的维护性(继承保证)和扩展性(多态保证)。 抽象类:是如果一个父类中没有给出具体体现,而需要其它具体的子类来继承父类。(在JAVA中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类) 抽象类特点:(1)抽象类和抽象方法必须用abstract关键字修饰;(2)抽象类不一定有抽象方法,有抽象方法的类一定是抽象类;(3)抽象类中可以有构造方法,抽象类不能进行实例化,需要构造方法用于子类访问父类数据时的初始化作用;(4)抽象类不能直接实例化,需要间接实例化是按照多态的方式,由具体的的子类实例化。其实也是多态的一种,抽象类多态;(5)抽象类子类要么是抽象类,要么重写抽象类中的所有抽象方法。 一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?答:可以。定义为抽象类后不能创建对象。 接口:是为了体现事物功能的扩展性。JAVA中提供了接口来定义这些额外的功能,并不需要给出具体实现,将来那些需要实现,只需要把这部分的额外的功能实现即可。 接口特点:(1)接口用关键字interface表示;(2)类实现接口用implements表示;(3)接口不能直接实例化,但是可以通过多态的形式对其进行间接实例化;(4)接口的子类可以是抽象类,但意义不大,可以是具体类,需要重写接口中的所有抽象方法。 抽象类和接口的区别:(1)抽象类的成员变量可以是变量也可以是常量,接口的成员变量只可以是常量;(2)抽象类有构造方法,接口没有构造方法;(3)抽象类的成员方法可以抽象也可以非抽象,接口的成员方法只可以抽象;(4)抽象类只能被继承,接口需要用implements实现;(5)设计理念不同,抽象类是“is a”,接口是“like a”;(6)一个类只能继承一个抽象类,而一个类却可以实现多个接口。 内部类:是把类定义在其它类的内部。访问特点:(1)内部类可以直接访问外部类的成员,包括私有的;(2)外部类要访问内部类的成员,必须要创建对象。 匿名内部类:就是定义在局部位置的类,是局部内部类的简化写法。前提:是存在一个类或者接口,这里的类可以是具体类也可以是抽象类。本质:是一个继承了该类或者实现了该接口的子类匿名对象。 Object类:是类层次结构的根类,所有类都直接或者间接的继承自该类。 ==和equals的区别:==可以比较基本数据类型,也可以比较引用数据类型,但是比较引用数据类型的时候比较的是地址值;equals只能比较引用数据类型,默认比较的是地址值。 String概述:字符串是由多个字符组成的一串数据(字符序列),字符串可以看成是字符数组。 String s = new String(“hello”);和String s = “hello”;的区别:第一个是创建一个s对象,在堆内存中;第二个是创建一个s常量,在方法区中的常量池。 StringBuffer概述:是一个线程安全(这里指的是可以保证数据安全性,效率较低)的可变的字符序列。 StringBuffer和String的区别:StringBuffer是可变的字符序列;String是一个不可以被改变的字符序列。 StringBuilder概述:是一个可变的字符序列,线程不安全,效率高。单线程环境用。 StringBuilder,StringBuffer,String的区别:StringBuilder线程不安全,效率高,如果单线程环境,建议使用;StringBuffer线程安全,效率低;String是一个不可变的字符序列,而StringBuilder,StringBuffer是可变的字符序列。 冒泡排序原理:相邻元素两两比较,大的往后放,第一次完毕,最大值出现在最大索引处。 选择排序原理:从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在最小索引处。 二分查找原理:每一次都查中间的那个元素,比较大或者小就能减少一半的元素。前提:数组元素必须有序。 对象数组:就是用来存储对象的数组。 集合由来:是为方便对多个对象的操作。 数组和集合区别:(1)数组的长度是固定的,而集合的长度是可变的;(2)数组可以存储基本数据类型的元素,也可以存储引用数据类型的元素,而集合只能存储引用数据类型的元素;(3)数组只能存储同一种数据类型元素,而集合可以存储多种数据类型的元素。 Collection:是根接口,单列集合。 List:元素有序(指的是存储和取出的顺序一致),并且每一个元素都存在整数索引,元素可以重复。 ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。 Vector:底层数据结构是数组,查询快,增删慢。线程安全,效率低。 LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。 Set:无序(指的是存储和取出的顺序不一致),可以保证元素唯一性。 HashSet:底层数据结构是哈希表,保证元素唯一性,需要重写hashCode方法和equals方法。 TreeSet:底层数据结构是二叉树,元素唯一性,并且可以对元素进行排序,排序有两种方式,自然排序和比较器排序。 Map:将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射一个值。 Map集合和Collection集合的区别:(1)Map集合是双列集合,Collection集合是单列集合;(2)Map集合的键是唯一的,而Collection集合中的Set集合可以保证元素的唯一性;(3)Map集合的数据结构只针对键有效,跟值无关,而Collection集合的数据结构和元素有效。 HashMap:底层数据结构是哈希表,保证元素唯一性,需要重写hashCode方法和equals方法。线程不安全,效率高。 TreeMap:底层数据结构是二叉树,元素唯一性,并且可以对元素进行排序,排序有两种方式,自然排序和比较器排序。线程是不安全的,效率比较高。 HashMap和Hashtable区别:HashMap底层数据结构是哈希表,线程不安全效率高,允许null值或者null键;Hashtable底层数据结构是哈希表,线程安全效率低,不允许null值或者null键。 扩展:1)数组:操作数据(增加)是将原数组的数据复制一份,再加上增加的对应位置的数据,形成一个新的数组,所以较慢;查找数据的数组是有下标的,根据下标进行查找。2)链表:一个链表的数据单元,结构是存储着一个数据,以及下一个链表单元数据的地址。3)哈希表:是数组和链表的结合体。 异常:就是在程序的编译或者运行过程中可能出现的问题。分类:严重问题(Error)(不予处理,不能解决,如:内存溢出)和非严重问题(Exception)(编译期异常(非RuntimeException的异常,必须处理)和运行期异常)。 JVM(JAVA虚拟机)默认是如何处理异常:main方法接收到问题后,自己可以处理和自己处理不了,交由调用者。 throw概述:在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。 throw和throws的区别:(1)throw用在方法体内,跟的是异常对象名;只能抛出一个异常对象名;表示抛出异常,由方法体内的语句处理;throw则是抛出异常,执行throw则一定抛出了某种异常。(2)throws用在方法声明后,跟的是异常类名;可以跟多个异常类名,用逗号隔开;表示抛出异常,由该方法的调用者来处理;throws表示出现异常的一种可能性,并不一定会发生这些异常。 finally特点:被finally控制的语句体一定会执行。 final,finally和finalize的区别:final是一个状态修饰符,可以用来修饰类、变量、成员方法,被修饰的类不能被子类继承,被修饰的变量其实是一个常量不能被再次赋值,被修饰的成员方法不能被子类重写;finally是用在try...catch语句中,作用是释放资源,特点是始终被执行;finalize是Object类中的一个方法,用来回收垃圾。 递归:是方法定义中调用方法本身的现象。 IO流:是用来处理设备之间的数据传输。流是一个抽象的概念。流的工作原理是通过二进制方式输入或输出。 flush和close的区别:flush作用是刷新缓冲区,刷新完毕以后流对象可以继续使用;close方法是关闭流对象,但是在关闭之前需要刷新缓冲区,并且关闭以后流对象就不能再次使用。 进程:就是正在运行的程序,是系统进行资源分配和调用的独立单位,每一个进程都有它自己的内存空间和系统资源。 线程:在一个进程内部又可以执行多个任务,而这每一个任务就可以看成是一个线程。线程是程序使用CPU的基本单位。 多线程(随机性):的意义是为了提高应用程序的使用率。 并行:是在逻辑上同时发生,指在某一个时间内同时运行多个程序。 并发:是在物理上同时发生,指在某一个时间点同时运行多个程序。 JAVA程序运行原理:JAVA命令会启动JVM,等于启动一个应用程序,也就是启动了一个进程,该进程会自动启动一个主线程,然后主线程去调用某个类的main方法,所以main方法运行在主线程中。 实现多线程的方式:(1)继承Thread、实现Runnable接口;无返回值,重写run方法。 (2)通过Callable(接口,实现call方法)和FutureTask创建线程;通过线程池创建线程;有返回值。 同步有两种方式:(1)使用同步代码块;(2)同步方法 解决多线程安全问题:把多个语句操作共享数据的代码锁起来,让任意时刻只能有一个线程执行即可。 死锁:如果出现同步嵌套,就容易产生死锁问题。两个或者两个以上的线程,在抢占CPU的执行权的时候,都处于等待状态。 线程池:就是一个具有指定数量线程的一个池子。 对象的六大原则:(七大原则) 1.单一职责原则(Single Responsibility Principle SRP):一个类只负责一个功能领域中的相应职责。 2.开闭原则(Open Close Principle OCP):软件实体应尽量在不修改原有代码的情况下进行扩展。 3.里氏替换原则(Liskov Substitution Principle LSP):所有引用父类(基类)的地方必须能透明的使用其子类的对象。 4.依赖倒转原则(Dependence Inversion Principle DIP):要针对接口编程,而不是针对实现编程。 5.接口隔离原则(Interface Segregation Principle ISP):使用多个专门的接口,而不使用单一的总接口。 6.迪米特原则 (Least Knowledge Principle LKP):一个软件实体应尽可能少地与其他实体发生相互作用。 7.组合/聚合复用原则(哈姆雷特):在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。 设计模式(Design pattern):是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的总结。 设计模式分类(23种): 创建型模式(创建对象的):单例模式、工厂模式、抽象工厂模式、原型模式、建造者模式 结构型模式(对象的组成):代理模式、装饰模式、适配器模式、外观模式、桥接模式、组合模式、享元模式 行为型模式(对象的功能):迭代器模式、命令模式、观察者模式、策略模式、解释器模式、模版方法模式、中介者模式、备忘录模式、状态模式、职责链模式、访问者模式 单例模式思想:保证类在内存中只有一个对象,并提供一个访问它的全局访问点。单例模式之饿汉式是在加载的时候,实例就已经创建;单例模式之懒汉式是当程序第一次访问实例才进行创建。 工厂模式:定义一个创建对象的接口,让其子类自己决定实例化那一个工厂类,工厂模式使其创建延迟到子类进行。 抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 代理模式:为其它对象提供一种代理以控制对这个对象的访问。 装饰模式:动态的给一个对象添加一些额外的职责。 适配器模式:将一个类的接口转换成客户希望的另外一个接口。 外观模式:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一系统更加容易使用。 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。 组合模式:让客户可以一致地使用组合结构和单个对象。 享元模式:运用共享技术有效地支持大量细粒度的对象。如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时,可以考虑使用享元模式。 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。 命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。正则表达式就是一种应用。 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。该模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个判断逻辑很简单,那就没必要用“状态模式”了。 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。 访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。如果一个系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式比较合适。 类加载器:就是负责将.class文件加载到内存中,并为之生成对应的Class对象。 反射:就是获取运行在JVM中的类的Class对象,然后对Class对象的各个组成部分进行剖析,将各个组成部分抽取映射成独立的JAVA类也就是独立的对象。
  • 相关阅读:
    项目Alpha冲刺(团队)-代码规范、冲刺任务与计划
    团队Github实战训练
    项目系统设计与数据库设计
    项目需求分析
    项目原型设计
    项目Alpha冲刺(团队)-第六天冲刺
    项目Alpha冲刺(团队)-第五天冲刺
    项目Alpha冲刺(团队)-第四天冲刺
    项目Alpha冲刺(团队)-第三天冲刺
    项目Alpha冲刺(团队)-第二天冲刺
  • 原文地址:https://www.cnblogs.com/wanghuaqiang/p/13645695.html
Copyright © 2011-2022 走看看