java基础概念笔记整理

面向对象的特征

  1. 抽象 :
    抽象就是忽略一个主题中与当前目标无关的哪些方面 , 以便更充分的注意与当前目标有关的方面 , 抽象并不打算解决全部问题 , 而只是选择其中一部分 , 暂时不用部分细节 , 抽象包括两个方面 : 一是过程抽象 , 二是数据抽象
  2. 继承 :
    继承是一种联结类的层次模型 , 并且允许和鼓励类的重用 , 它提供了一种明确表数共性的方法 , 对象的一个新类可以从现有的类中派生 , 这个过程称为类的继承 , 新类继承了原始类的特性 , 新类称为原始类的派生类 ( 子类 ) , 而原始类称为新类的基类 ( 父类 ) , 派生类可以从它的基类那里继承方法和实例变量 , 并且类可以修改或增加新的方法是指更适合特殊的需要
  3. 封装 :
    封装是把过程和数据包围起来 , 对数据的访问只能通过已定以的界面 , 面向对象计算始于这个基本概念 , 即现实世界可以被描述成一系列完全自治 封装的对象 , 这些对象通过一个受保护的接口访问其他对象
  4. 多态 :
    多态是指允许不同类的对象对同一信息作出响应 , 多态性包括参数化多态性和包含多态性 多态语句具有灵活 抽象 行为共享 代码共享的优势 , 很好的解决了应用程序函数同名问题

类和对象的定义
类和对象都是面向对象方法的核心概念
类(class) : 面对某一类事务的具体描述 , 是抽象的 概念上的定义
对象(object) : 实际存在的该类事务的个体 , 因而也可以称为实例(Instance)

封装的定义和目的
定义 : 通过将类的寸成员变量声明为私有的(private) , 在提供一个或多个公有(public)方法对该成员变量的访问或修改 , 这种方式即称为封装
目的 :

  1. 隐藏类的实现细节
  2. 让使用者只能通过实现定制好的方法来访问数据 , 可以方便地加入控制逻辑 , 限制对属性的不合理操作
  3. 便于修改 , 增加代码的可维护性
  4. 可进行数据检查

什么是强内聚弱耦合
强内聚 : 许多功能尽量在类的内部独立完成 , 不让外面干预
弱耦合 : 提供给外部尽量少的方法调用

构造函数的功能和特征
功能 :

  1. 给当前类的对象分配内存
  2. 进行初始化
    特征 :
  3. 具有与类相同的名称
  4. 不含返回值 , 不能在方法中用return语句返回一个值
  5. 只能在实例化对象时在new后调用
  6. 如果没有显式地给一个类定义一个构造函数 , 系统给他分配默认的无参的方法体为空的构造函数

this指什么
this指当前类的一个当前对象

参数传递的类型和过程
Java语句在给被调用方法的参数赋值时 , 只采用传值的方式 , 所以基本类型数据传递的是该数据值的本身 , 引用数据类型传递的也是这个变量的值 , 即对象的引用而非对象本身 , 通过方法调用可以改变对象的内容 , 但是对象的引用是不能改变的 对于数组 , 也属于引用类型 , 将数组对象作为参数传递

什么时候使用static
有时候 , 我们希望无论是否产生了对象或无论产生了多少对象的情况下 , 某些特定的数据在内存空间里只有一份时 , 这时候可以考虑用到static

static修饰什么
静态变量 , 静态方法 , 静态代码块

static修饰静态方法时需要注意什么

  1. 在静态方法里只能直接调用同类中的其他静态成员(包括方法和变量) , 而不能直接访问类中的非静态成员 , 这是因为对于非静态的方法和变量需要先创建类的实例对象后才能使用 , 而静态方法在使用前不用创建任何对象
  2. 静态方法不能以任何方法引用this和super关键字 , 与上面的逻辑一样 , 因为静态方法在用用前不用创建任何实例对象 , 当静态方法被引用时 , this的对象根本没有产生
  3. main()方法是静态方法 , 因此jvm在执行main()方法时不创建main方法所在的类的实例对象 , 因而在main()方法中 , 不能直接访问该类的非静态成员 , 必须创建该类的一个实例对象后 , 才能通过这个对象取访问类中的非静态成员

面向对象编程的设计步骤

  1. 作实体类
  2. 在含有主函数的演示类中做一个对象
  3. 对象初始化
  4. 调用相应的行为状态完成功能需求

java程序设计中如何调用类的成员

  1. 成员方法可以无条件直接调用本类的其他成员
  2. 其他类中调用一个类的成员时 , 必须采用"对象.成员"的形式调用

成员方法被调用时的执行步骤

  1. 首先当被调用的方法有形参时 , 要先给形参分配内存空间
  2. 进行实参到形参的值传递
  3. 顺序执行方法体内的语句
  4. 释放局部变量的内存空间

return关键字的两个功能

  1. 在方法体内部使用 , 返回一个"返回值"
  2. 让函数从当前语句结束执行 , 返回主调函数

使用匿名对象的两种情况

  1. 如果对一个对象只需要进行依次方法调用 , 那么就可以使用匿名对象
  2. 将匿名对象作为实参传递给一个函数调用

float型 float f = 1.1 是否正确
不正确 , 精通不准确 , 应该使用强制类型转换 如 : float f = (float)1.1

注释的类型
单行注释 : //
多行注释 : /.../
文档注释 : /**...*/

标识符的定义规则

  1. 标识符要以单词组成 , 类名首字母大写
  2. 函数名首字母大写
  3. 函数名及变量首字母小写 , 以后每一个单词的首字母大写
  4. 包名全部小写
  5. 常量名全部大写
  6. 类名和变量主要以名词组成

java的变量类型(数据类型)
基本数据类型 :
数值型 : 整数类型 byte short int long
浮点型 : float double
字符型 : char
布尔型 : boolean
引用数据类型
类 : class
接口 : interface

java中有几种运算符

  1. 算术运算符
  2. 赋值运算符
  3. 比较运算符
  4. 逻辑运算符
  5. 位移运算符

函数的重载(定义)
函数的重载就是在同一个类中允许同时存在一个以上同名函数 , 只要它们的参数个数 , 或类型不同即可

什么时候使用内部类
当一个类中的程序代码要用到另一个类的实例对象而另一个类中的代码又要访问第一个类中的成员 , 就要将另外一个类作为第一个类的内部类

抽象类的定义规则

  1. 抽象类必须使用abstract关键字修饰 , 抽象方法也必须使用abstract修饰
  2. 抽象类不能实例化 , 也不能使用new关键字产生对象
  3. 抽象方法只需声明 , 不需实现
  4. 含有抽象方法的类必须被声明为抽象类 , 抽象类的子类必须覆盖所有的抽象方法后才能被初始化 , 否则这个子类还是抽象类

抽象类的作用

  1. 降低接口实现类对接口实现过程的难度
  2. 将接口中不需要使用的抽象方法交给抽象类进行完成
  3. 这样接口实现类只需要对接口需要的方法进行重写

java中public protected default private四个访问控制修饰的作用

作用域 当前类 统一package 子孙类 其他package 访问权限
public 能被所有类访问
protected × 本类和其他子类访问 , 同一包中的所有类
friendly × × 可以被本类和同一包中的的其他类访问
private × × × 只能在本类中访问
不写时默认为friendly

两种创建线程的方法对比分析
实现Runnable接口相对于继承Thread类来说 , 有如下显著好处 :

  1. 适合多个相同程序代码的线程去处理同一资源的情况 , 把虚拟CPU(纯种)同程序的代码 数据有效分离 , 较好的体现了面向对象的设计思想
  2. 可以避免有序java的单继承特性带来的局限
  3. 有利于程序的健壮性 , 代码能够被多个线程共享 , 代码与数据之间相互独立

接口实现及特点

  1. 实现一个接口就是要实现接口的所有方法(抽象类除外)
  2. 接口中的方法都是抽象的
  3. 多个无关的类可以实现同一个接口 , 一个类可以实现多个无关的接口

多态的四种形式

  1. 接口
  2. 方法覆盖
  3. 方法重载
  4. 子类转换父类

继承的特点

  1. 通过继承可以简化类的定义
  2. java支持单继承不允许多继承
  3. 可以有多层继承
  4. 子类继承父类的所有成员变量和成员方法 , 但不继承父类的构造方法
  5. 如果子类的构造方法没有显式地调用父类的构造方法 , 则系统默认调用父类的构造方法

子类对象的实例化过程

  1. 分配成员的存储空间进行默认的初始化
  2. 绑定构造方法参数
  3. 如果有this()调用 , 则调用相应的重载构造方法(被调用的构造方法从开始执行这些流程)被调用的重载构造方法的执行流程结束之后 , 回到当前构造方法 , 当前构造方法直接跳到步骤(6)执行
  4. 显式或隐式追溯调用父类的构造方法
  5. 进行实力变量的显式初始化操作
  6. 执行当前构造体中的程序代码

垃圾回收的优点和原理 并考虑两种回收机制
Java语言中一个显著的特点就是引入了垃圾回收机制 , 使c++程序员最头痛的内存管理问题迎刃而解 , 它使得Java程序员在编写程序的时候不用再考虑内存管理 , 由于有垃圾回收机制 , 它使得Java中的对象不再具有"作用域"的概念 , 只有对象的引用才有"作用域" , 垃圾回收可以有效的防止内存泄漏 , 有效的时候可以使用的内存 , 垃圾回收器通常是作为一个单独的低级别的线程运行 , 不可预知的情况下对内存中一经死亡或长时间没有使用的对象进行清除和回收 , 程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收 , 回收机制有分代复制垃圾回收和标记垃圾回收 , 增量垃圾回收

覆盖方法的访问权限
覆盖方法时 , 不能使用比父类中被覆盖方法更严格的访问权限

final关键字的5点

  1. 在java中的声明类 , 属性 , 方法时 , 可以使用final关键字修饰
  2. final标记的类不能被继承
  3. final标记的方法不能被子类重写
  4. final标记的变量只能赋值一次
  5. 方法中定义的内置类只能访问方法内的final类型的局部变量

Java中的变量如何初始化
在讨论如何初始化之前需要先明白Java中有哪些变量

  1. 类的属性 , 或叫值域
  2. 方法里的局部变量
  3. 方法的参数

对于第一种变量 , Java虚拟机会自动进行初始化 , 如果给出了初始值则初始化为该初始值 , 如果没有给出 , 则自动初始化为该类型变量的默认初始值
int类型默认初始值为0
float类型默认初始值为0.0f
double类型默认初始值为0.0
boolean类型默认初始值为false
char类型默认初始值为0(ASCII码)
long类型默认初始值为0
所有对象引用类型变量默认初始值为null , 即不指向任何对象 , 注意数组本身也是对象 , 所有没有初始化的数组在引用在自动初始化之后值也是null

通过ObjectOutputStream向一个文件中多次以追加的方式写入object , 为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException
使用缺省的serializetion的实现时 , 一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应 , ObjectOutputStream的构造函数会向输出流中写入一个标识头 , 而ObjectInputStream会首先读入这个标识头 , 因此多次以追加方式向一个文件中写入object时 , 该文件会包含多个标识头 , 所以用ObjectInputStream来deseralize这个ObjectOutputStream时 , 将产生StreamCorruptedException , 一种解决方式是可以构造一个ObjectOutputStream的子类 , 并覆盖writeStreamHeader()方法 , 被覆盖后的writeStreamHeader()方法应该判断是否为首次向文件中写入object , 若是则调用super.writeStreamHeader() ; 若否 , 即以追加的方式写入object , 则应调用ObjectOutputStream.reset()方法

Java包中的概念与作用
Java中的"包"是一个比较重要的概念 , package是这样定义的 : 一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合 , 使用包的目的就是使类容易查找使用 , 防止命名冲突 , 以及控制访问

Anonymous Inner Class(匿名内部类)是否可以extend(继承)其他类 , 是否可以implents(实现)interface(接口)
匿名内部类是没有名字的内部类 , 不能extends(继承)其他类 , 但是一个内部类可以作为一个接口 , 由另一个内部类实现

&和&&的区别*
&是位移运算符 , &&是布尔逻辑运算符

sleep()和wait()由什么区别
sleep()方法是线程停止一段时间 , 在sleep时间间隔期满之后 , 线程不一定立即恢复执行 , 这是因为在那个时刻 , 其他线程可能正在运行且没有被调度为放弃执行 , 除非(a)"醒来"的线程具有更高的优先级 , (b)正在运行的线程因为其他原因而阻塞
wait()是线程交互时 , 如果线程对一个同步对象x发出一个wait()调用 , 该线程会暂停执行 , 被调用对象引入等待状态 , 直到被唤醒或等待时间到

Overload和Override的区别 , Overload的方法是否可以改变返回值的类型
方法的重写Overrideing和重载Overloading是Java多态性的不同表现
重写Overriding是父类与子类之间多态性的一种表现 , 重载Overloading是一个类中多态性的一种表现 , 如果子类中定义某方法与父类有相同的名称和参数 , 我们称该方法被重写(Overriding) , 子类的对象使用了这个方法时 , 将调用子类中的定义 , 对它而言 , 父类中的定义如同被"屏蔽" , 如果在一个类中定义了多个同名的方法 , 他们之间有不同的参数个数或有不同的参数类型 , 则称为方法的重载(Overloading) , Overload的方法可以改变返回值类型

erro和exception有什么区别
erro表示恢复不是不可能但很困单的情况下的一种严重问题 , 比如说内存溢出 , 不可能指望程序能处理这样的问题
exception表示一种设计或实现问题 , 也就是说 , 他表示如果程序运行正常从不会发生的情况

abstract class和interface有什么区别
声明方法的存在而不去实现它类叫做抽象类(abstract class) , 它用于创建一个体现某些基本行为的类 , 并为该类声明方法 , 但不能在该类中实现该类的情况 , abstract类的实例不能被创建 , 然而可以创建一个该类的变量 , 其类型是一个抽象类 , 并让它指向具体子类的一个实例 , 抽象类中不能有抽象构造函数或抽象静态方法 , Abstract类的子类为它们父类中所有抽象方法提供实现 , 否则它们也是抽象类 , 进而由它们的子类实现该方法 , 知道其行为的其他类可以在类中实现这些方法
接口(interface)是抽象类的变体 , 在接口中 , 所有方法都是抽象的 , 多继承性可以通过实现这样的接口获得 , 接口中的的所有方法都是抽象的 , 没有一个由程序体 , 借口只可以定义static final成员变量 , 接口的实现与子类相似 , 除了该实现类不能从接口定义中继承行为 , 当类实现特殊接口时 , 它定义(即程序体给予)所有这种接口的方法 , 然后它可以在实现该接口的类的任何对象上调用接口的方法 , 由于抽象类的存在 , 他允许使用接口名作为引用变量的类型 , 通常的动态联编将生效 , 引用可以转换到接口类型或从接口类型转换 , instanceof运算符可以用来决定某对象的类是否实现了接口

接口是否可以继承 抽象类是否可以实现(implements)接口 抽象类是否可以继承实体类(concrete class)
接口可以继承接口 , 抽象类可以实现(implements)接口 , 抽象类是否可继承实体类 , 前提是实体类必须有明确的构造函数

启动一个线程是用run()还是start()
启动一个线程是调用strat()方法 , 使线程所代表的虚拟处理机处于可运行状态 , 这意味着它可以由JVM调度并执行 , 这并不意味着线程就会立即执行 , run()方法可以产生必须退出的标志来停止一个线程

当一个对象被当做参数传递到一个方法后 , 此方法可改变这个对象的属性 , 并返回变化后的结果 , 那么这里到底是值传递还是引用传递
是值传递 , Java编程语言只由值传递参数 , 当一个对象实例作为一个参数被传递到方法中时 , 参数的值就是对该对象的引用 , 对象的内容可以在被调用的方法中改变 , 单对象的引用是永远不会改变的

什么是线程同步
当有个线程在对内存进行操作时 , 其他线程不能对这个内存地址进行操作 , 直到该线程操作完毕 , 其他线程才能对该内存地址进行操作 , 而其他线程又处于等待状态

所有线程同步的方法
synchronized关键字 : 修饰方法或代码块 , 由于java的每个对象都有一个内置锁 , 当用此关键字修饰方法或代码块时 , 内置锁会保护synchronized修饰的部分 , 在调用该方法前需要获得内置锁 , 否则就处于阻塞状态 , 当synchronized修饰静态方法时 , 如果调用该静态方法 , 将会锁住整个类
wait() : 使一个线程处于等待状态 , 并释放所持有的对象的lock
sleep() : 使一个正在运行的线程处于睡眠状态 , 是一个静态方法 , 调用此方法要捕捉InterruptedException异常
notify() : 唤醒一个处于等待状态的线程 , 注意的是在调用此方法的时候 , 并不能确切的唤醒某一个等待状态里的线程 , 而是由JVM确定唤醒哪个线程 , 而不是按照优先级

final finally finalize的区别
final修饰符(关键字)如果一个类被声明为final , 意味着它不能再派生出新的子类 , 不能作为父类被继承 , 因此一个类不能即声明为abstract又被声明为final , 将变量或方法声明为final , 可以保证它们在使用中不被改变 , 被声明为final的变量必须在声明时给定初值 , 而在以后的引用中只能读取 , 不能修改 , 被声明为final的方法同样只能使用 , 不能重载
finally在异常处理时提供finally块来执行任何清除操作 , 如果抛出一个异常 , 那么相匹配的catch子句就会执行 , 然后控制就会进入finally块(如果有的话)
finalize方法名 Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前作必要的清理操作 , 这个方法由垃圾收集器在确定这个对象没有被引用时对这个对象调用 , 它在Object类中定义 , 因此所有类都继承了它 , 子类覆盖finalize()方法以整理系统资源或执行其他清理工作 , finalize()方法是在垃圾收集器删除对象之前对这个对象调用

ArratList与Vector的区别
两者区别主要在于两方面 :
一. 同步性 : Vector是线程安全的 , 也就是同步的 , 而ArrayList是线程不安全的 , 不是同步的
二. 数组增长 : 当需要增加长度时 , Vector默认增长为原来的一倍 , 而ArrayList却是原来的一半

char型变量能不能存储一个中文汉字 为什么
能够定义为一个中文汉字 , 因为java中以unicode编码 , 一个char占16个字节 , 可以存下一个中文

int于integer的区别
Java提供两种不同的类型 : 引用数据类型和原始类型(也称内置类型) , int是java的原始数据类型 , Integer是java为int提供的封装类 , java为每个原始类性都提供了封装类

原始类性 封装类型
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
引用类型和原始类型的行为完全不同 , 并且它们具有不同的语义 , 引用类型和原始类性具有不同的特征和用法 , 它们包括 : 大小和速度问题 , 这种类型以那种类型的数据结构存储 , 当引用类型和原始类性作为某个类的实例数据时所指定的缺省值 , 对象引用实例变量的缺省值为null , 而原始类性实例变量的缺省值与它们的类型有关

Java中的异常处理机制的简单原理和应用
当JAVA程序违反了Java语义的规则时 , Java虚拟机就会将发生的错误表示为一个异常 , 违反语义包括2中情况 , 一种是Java类库内置的语义检查 , 例如数组下标越界 , 会引发IndexOutofBoundsException ; 访问null对象时会引发NullPointException , 另一种情况就是Java允许程序员拓展这种语义检查 , 程序员可以创建自己的异常 , 并自由选择在何时用throw关键字引发异常 , 所有的异常都是java.lang.Thowable的子类

String和StringBuffer的区别
Java平台提供了两个类String和StringBuffer , 它们可以存储和操作字符串 , 即包含了多个字符的字符数据 , String类提供了数值不可改变的字符串 , 而StringBuffer类提供字符串可以进行修改 , 例如当字符数据需要改变时可以使用StringBuffer

什么是异步
异步与同步相对 , 当一个异步过程调用发出后 , 调用者在没有得到结果之前 , 就可以继续执行后续操作

同步与异步有何异同 , 什么情况下使用它们 , 举例说明
如果数据在线程间共享 , 例如正在写的数据以后能被另一个线程读到 , 或者正在读的数据已经被另一个线程写过了 , 那么这些数据就是共享数据 , 必须使用同步存取 , 当应用程序在对象上调用了一个需要很长时间来执行的方法 , 并且不希望程序等待方法的返回时 , 就应该使用异步编程 , 很多情况下采用异步途径往往更有效率

posted @ 2021-05-04 21:36  小_Leo  阅读(140)  评论(0编辑  收藏  举报