Java-基础

Java-基本程序设计结构

简单的Java程序需要注意的基本
区分大小写
程序从main函数开始进行,类名与文件名要对应
使用(.)去进行函数调用
严格要求命名的规范化
空白符会被Java编译器忽略
每个句子要分号结束

注释:三种注释方法
以"//"双斜杠为单行注释
以"/* */"为多行注释
以"/** */"为自动生成文档注释

数据类型
Java是强类型语言,必须为每一个变量声明一种类型
8种基本类型:
1.byte => 8 bit
2.char => 16 bit
3.short => 32 bit
4.int => 32 bit
5.float => 32 bit
6.long => 64 bit
7.double => 64 bit
8.boolean ~
boolean 有true\false,但是没有具体的大小限制,JVM在编译的时候会将boolean类型转换为int,所以最后占位32bit,但boolean数组占位为8bit,具体具体还要看虚拟机实现是否按照规范来,所以8bit32bit都是有可能的。

字符串
String类对象是不可变字符串(编译器可以让字符串共享)
检测字符串相等用equal(),不用==是因为+或substring等操作产生的结果并不是共享的,所以所指向的地址并不一致。
StringBuilder用于频繁构建字符串的场景,调用toString方法可以获得String。

大数值:BigInteger(整型)、BigDecimal(浮点型)

Java-类和对象

所有类源于Object(超类)
面向对象程序设计(OOP)是当今主流的程序设计范型
面向对象程序是由对象组成的
类是构造对象的模板或蓝图
由类构造对象称创建类的实例
封装(数据隐藏)是对象的一个重要概念,提高重用性可靠性

封装的关键在于我们只需要知道怎样调用方法?
传什么参数?
有什么作用?
而不必知道内部实现,具有黑盒属性

类之间的关系
1.依赖(use-a)
2.聚合(has-a)
3.继承(is-a)

对象:对象的行为、状态、标识

对象的声明以及初始化
声明变量而不引用对象:

Date dealine;//dealine只是一个变量
//让变量引用对象,既初始化对象
//dealine只是引用对象,此时dealine是一个对象变量
dealine=new Date();

在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类

方法参数
按值调用:不会改变参数值
按引用调用:可以改变参数值(Java对象采用的)

方法签名
组成:方法名+参数类型

系统会默认提供无参构造方法,但是前提是没有构造方法

构造器第一行用this()调用其它构造器(同一个类的

初始化块{},只要构造类的对象,这些块会被执行,初始化块运行后再运行构造器主体

类设计技巧
保证数据私有
对数据进行初始化
不要过多使用基本类型
不是所有域都需要更改器访问器
分解过多职责的类
类名方法名要规范:名词、形容词修饰名词、动名词修饰名词
优先使用不可变的类,线程安全

Java-继承

段落引用使用super去调用父类的方法
多态:一个对象变量可以指示多种实际类型的现象
动态绑定:在运行时能够自动地选择调用哪个方法的现象
静态绑定:如果是private、static、final或者构造器

hasCode
每个对象默认有一个hasCode,其值是对象的地址
字符串的hasCode()经过覆写:

public  int hashCode() {
    int h = hash;
    if (h  0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

ArrayList
自动调节数组容量
泛型容器
当确定大小不会变了,可以调用trimToSize()告诉GC回收多余空间

对象包装器和自动装箱
包装:把基本类型转化为类:如int-->Integer
包装器值是不可更改
final修饰包装器,不允许有子类
包装器有null,注意空指针异常
自动拆装箱(编译器认可)

多参数:(Object... objs)

枚举
定义:这个声明定义了含四个实例的类

public enum  Size {
    SMALL,MEDIUM,LARGE,EXTRA_LARGE
}

比较两个枚举的值不需要用equals,直接用==
枚举类型可以添加构造器,成员变量,方法等
方法:

static Enum valueOf(Class ec,String name)//返回枚举常量
String toString()//返回枚举常量名
int ordinal()//返回枚举常量声明的位置

反射
作用:在设计或运行中添加新类,能够动态地查询新添加类的能力(分析类)
Class:获取Class类的方法
全限定名:Class.forName(类全限定名);
对象:对象.getClass()
Class的方法:

getFields:获取私有域
getMethods:方法
getConstructors:构造器
getDeclareFields:全部域
getDeclareMethods:全部方法
getDeclareConstructors:全部构造器
newInstance():调用类的默认构造器初始化创建对象,没有默认构造器将抛出异常

反射是脆弱的,编写应用程序不建议使用

Java-接口、Lambda
接口

定义:对类的一组需求描述
所有接口方法默认public

接口的特性:
不能用new去实例化一个接口
能够声明接口变量:Comparable c;
接口变量必须引用实现了接口的类对象
接口可以包含常量

默认方法:
用default修饰接口内的方法,标识这个方法是默认实现
默认方法的优先级
超类优先:超类提供的签名相同的具体方法优先级最高

接口冲突:如果超接口提供一个默认方法,另一个接口也有同样的方法,则需要覆盖这个方法来解决

Lambda

定义:可传递的代码块
目的:使Java支持函数式编程,既传递代码块
形式:参数,箭头(->),表达式
Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

异常、断言、日志

异常
目的
出现异常的时候,返回安全状态,并能让用户进行其他操作
允许用户保存所有操作的结果,并以妥善的方式终止程序

常见错误:

  • 用户输入错误
  • 设备错误
  • 物理限制
  • 代码错误

类型:派生于Throwable
Error:运行时系统内部错误和资源耗尽错误

Exception

  • RuntimeException:程序错误导致的异常(程序员的错误)
  • 错误类型转换
  • 数组越界
  • null指针
  • ...:程序没有问题,由IO错误等导致的异常
  • 在文件尾部后面读取数据
  • 打开不存在的文件
  • 通过字符串去查找Class对象,但不存在

使用异常的技巧

  • 异常处理不能代替简单的测试
  • 不要过分细化异常
  • 利用异常层次结构
  • 不要压制异常
  • 在检测错误时,苛刻要比放任更好
  • 早抛出,晚捕获
  • 在异常出现的根源处抛出异常
  • 在最进行用户的层面进行异常的捕获处理

断言
断言机制能够在测试阶段向代码插入一些检查语句,在代码发布时,这些插入的语句将会自动移走

Assert关键字:
assert 条件;
assert 条件:表达式;

可以设置是否启动断言:这是类加载器的功能
java -enableeassertions 程序(启动断言)
只运用在开发阶段和测试阶段

记录日志
目的:缓解日志语句的频繁增删问题

优点:

  • 可以很容易关闭所有日志,或者开启关闭某个级别的日志
    可以禁止日志输出
  • 可以将日志定向到不同的地方,如控制台,或文件
  • 可以对日志进行过滤
  • 可以格式化日志,如xml或纯文本等
  • 可以使用配置文件配置日志系统

基本日志

//全局日志记录器
Logger.getGlobal().info("...")
//取消日志
Logger.getGlobal().setLevel(Level.OFF);

高级日志

//自定义日志
Logger.getLogger("com.jnxj.web_01.App");

日志级别:

  • SERVRE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

Java-泛型

编写多类型的程序
优点:可以指定类型参数,不必使用Object进行类型转换,指定类型,能够在编译器阶段减少出错
类型变量使用大写形式,且比较短,如T,E,K,V,U,S等
泛型类:

class Book{
    private T name;
    public setName(T name){
        this.name=name;
    }
}

泛型类可看作普通类的工厂
泛型方法:类型变量放在修饰符后面,返回值前面,如

public static  T getCount(T name){
    return name;
}
public static  String getCount(U name){
    return "肥欣";
}

当形参要使用泛型,前面的一定得定义,否则T不被识别为泛型

类型变量的限制
,T必须是实现Comparable接口的类型,类或接口都是用extends关键字
,多限定用&符号

类型擦除
类型变量都会被擦除,有限定用限定类型替换,没有限定类型用Object替代
多个限定类型,使用第一个进行类型替换

几点注意

  • 虚拟机中没有泛型,只有普通类和方法
  • 所有类型参数都用限定类型替换
  • 桥方法被合成来保持多态
  • 为保持类型安全性,必要时插入强制类型转换

Java-集合

队列Queue接口
定义

  • 先进先出
  • 只能在头部删除元素
  • 只能在尾部插入元素
  • 可以获取长度

队列实现
循环数组:已实现:ArrayDeque
链表:LinkedList

Collection接口
集合类的基本接口,集合不允许含有重复的元素
声明的方法

boolean add(E element);//添加元素
Iterator iterator();
...

AbstractCollection抽象类已经实现Collection一些方法,子类只要关注没有实现的几个方法就ok了

Iterator迭代器
定义

public interface Iterator {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
   }
    default void forEachRemaining(Consumer action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

Collection接口拓展了Iterator接口,所以所有集合都可以使用foreach循环
调用next()会越过元素并返回元素引用,和读取输入流一样的道理
调用remove()前必须调用next()

集合框架中的接口
集合有两个基本接口Collection和Map
List是有序集合,可以通过整数索引来访问,是随机访问

链表
目的:解决数组中删除元素导致后面元素移动的代价大的问题
实现类:LinkedList

数组
ArrayList:线程不安全的动态分配数组
Vector:线程安全

Java-基础_第1张图片

你可能感兴趣的:(Java-基础)