新手上路 -- 02
作者:互联网
包
在java中主要表示类所在的位置,用于区别同名类。
关键字:
- package——用于class文件首行,申明所在包;
- import——导包语句,便于使用类
常用的包:
注意:包名不能以java—源生包,javax—扩展包,org—第三方包
类
类是对象的抽象,对象是类的实现。
每一个class类代表一类对象的特征和行为,具体表现为类中的属性和方法,而每一个类的实现,可以通过构造方法对类的属性赋值和初始化。即一个类基本构成——构造方法、属性、方法,其中构造不写默认有个无参的。
- Java是一门面向对象的语言。在java中有两个特殊的对象——this和super。
- 特殊的类——抽象类(abstract class——extends)、接口(interface——implement)和内部类。
常玩的类
- 祖宗类——Object——clone()【Cloneable】、equals()、hashCode()、getClass()、toString()…
- 基本类型的包装类——Byte、Short、Intrger、Long、Double、Float、Character、Boolean——自动装箱、拆箱
- 其他——String(final类)【每个字符串都是常量】/StringBuilder/StringBuffer、Pattern(“1$”从头到尾包含)【捕获组】、Math、Date/DateFormat(日期)–SimpleDateFormat、Calendar(日历)–GregorianCalendar
- 异常——Throwable:
面向对象
封装
面向对象的基础,把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。封装是一种信息隐藏技术。
实现——方法、属性私有化、内部类
继承
Java是单继承多实现,继承主要和向上造型相关,而实现一般是与规范相关。
多态
多态是指允许不同类的对象对同一消息做出不同的响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式。主要是为了解耦。
多态主要针对对象的行为即方法,而不是对象的属性。主要包括:
- 编译时多态——重载
- 运行时多态——重写和向上造型
方法
定义格式 :
如:
修饰符:
权限修饰符:
本类 | 子类 | 同包类 | 其他类 |
---|---|---|---|
public | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 可以 |
默认 | 可以 | 同包子类可以 | 不可以 |
private | 可以 | 不可以 | 不可以 |
其他修饰符:
名字 | 英文 | 修饰对象 | 重点 |
---|---|---|---|
静态 | static | 代码、属性、方法、类 | 与类同级 |
最终 | final | 属性、方法、类 | 不可改变 |
抽象 | abstract | 方法、类 | 等着被重写 |
重写、重载、递归
- 方法重写需要遵循“两等两小一大”
- 方法重载是同一个类中只有参数列表不同的多个方法
- 方法递归指方法内部逻辑调用了方法本身
方法传参
- 方法传入的参数是基本类型,则传入的是拷贝值,怎么改变与原变量无关;
- 方法传入的参数是引用类型,则传入的是地址,如果方法内部通过原有地址改变了参数的属性,则原参数也改变。
不懂就画图,栈、堆、方法区
集合框架 – Collection
集合框架:包括集合、数组、映射和操作它们的工具类。
主要API有增删改查、获取迭代器iterator()、判断equals(Object o)、转换如toArray()等。下面的几个都是接口规范了几个大类,具体实现看实现类。
List
元素有序,容量可变,但是内存是否连续看实现类。对于扩容,除了ArrayList基于原容量右移1位,即0.5倍加1,其他都是默认为原容量的一倍。
- LinkedKist
- ArrayList
- Vector/Stack
向量是线程安全的最早集合,初始容量为10;
栈是继承Vector的,先进先出或者后进先出(LIFO)。
Queue
队列遵循先进先出的原则。
Set
主要特点元素不重复且无序;可以使元素有序,实现Comparator接口或者其他方法。添加重复元素是保留原有的元素(可以通过“a”和new String(“a”)对比验证)。
- HashSet–LinkedHashSet
- TreeSet
红黑树:
https://baike.baidu.com/item/红黑树
Map
基础单元是Entry,存储的是键值对模式。无序且键不重复,重复键录入新值会覆盖后值;一般都是通过增强for循环遍历for(String key : keys){}。
- HashMap
- HashTable – 线程安全
– Properties映射:继承了HashTable;key和value都只能是String,而且是可以持久化。和我们常用的配置文件相关——必须存储在”.properties”文件中。 - ConcurrentMap —— java_util_concurrent
Comparator
一个接口,主要包括compareTo(T o1,T o2)和equals(object obj)两个方法;
重写compare方法,将比较规则写到compare方法中—根据返回值的正负来确定大小;如果返回值是正数,表示第一个参数排到第二个参数之后;反之表示第一个参数排到第二个参数之前。
如果没有指定排序规则,这个时候要求集合中的元素对应的类必须实现Comparable,比较规则是写在compareTo方法中。
Collections–工具类
是一个操作集合的工具类,提供一系列的操作集合的静态方法。Collections的构造方法都是私有的,只能通过本类对象或者类名+“.”调用。
线程
运行一个程序或一串代码就是开启一个进程,而一个进程最少包含了一个线程。而线程多了会形成资源争抢,即线程安全问题。
创建方式
- 继承线程的顶级父类——Thread
- 实现Runnable接口
两种方法本质都是重写run方法 - 实现callable接口【java.util.concurrent】——重写call方法
启动
我们知道要把执行的任务逻辑放到run方法中,调用start方法可以开启线程,现在在main方法中使用start方法来启动线程和直接调用run方法有什么区别?
- run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接调用,而不是由应用代码进行调用。
相应的调用t.run(),只是调用一个实例的方法而已,并未启动线程,因此run()会被立即执行。- start()的作用是启动相应的线程。启动一个线程实际是请求Java虚拟机运行相应的线程,而这个线程何时能够运行是由线程调度器决定的。
start()调用结束并不表示相应线程已经开始运行,这个线程可能稍后运行,也可能永远也不会运行。
线程状态
https://www.cnblogs.com/reality-soul/p/7871786.html
new、start、wait/sleep、notify
多线程的并发安全问题
线程执行顺序:线程的执行不存在先后,相互抢占执行的;
抢占并不是在发生在线程执行的开始,而是发生在线程执行的每一步过程中。
- 关于守护线程的问题,t.setDeamon(ture);优先级问题,1-10越大优先级越高。
说明:现在有小红和小绿两条线程,两条线程同时到大while循环,满足条件进入循环后,两条线程拿到的值都是100,进行减1操作后,值都为99,接着两条线程去执行,输出语句,所以就会产生打印数字重复。
线程安全方法
- 原子性 —— atomic原子操作/synchronized同步机制/CAS无锁机制
- 可见性 —— volatile、synchronized
- 有序性 —— 线程池+阻塞队列
反射
通过类或对象解剖类属性和方法,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
通过反射可以获取的解剖类:Class类的类、Field属性的类、Method方法的类、Constructor构造方法的类、Package 代表包的类、Annotation 代表注解的类。
作用
反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射提供封装程序集、模块和类型对象。
反射其实是解剖类,分析类的字节码。产生类所对应的实例对象。
实现解耦操作,便于模块化开发。
应用
- Object类的clone()方法
其他01——泛型<>
DK1.5特性之一。泛型使得代码可以适应多种类型。像容器,List< T >,大量使用了泛型,它的主要目的之一就是用来指定容器要持有什么类型的对象。
- 泛型的上限: <? extends 类/接口>
- 泛型的下限: <? super 类/接口>
☆泛型的擦除☆
用具体类型来替换泛型的过程叫泛型的擦除;发生在编译期,即定义是进行了泛型的擦除,后面对元素的操作需要满足具体类型。
总览:https://www.cnblogs.com/justinli/p/generic.html
其他02——迭代器Iterable
如果一个对象允许用增强for循环来遍历,那么这个对象对应的类必须实现Iterable 接口,增强for(foreach)循环本质上就是在进行迭代遍历。增强for循环不允许对原集合进行增删操作。
主要实现就是Iterator:
// 获取迭代器对象
Iterator<String> it = set.iterator();
// 判断是否有下一个元素
while (it.hasNext()) {
// 挪动指针,获取元素
String s = it.next();
System.out.println(s);
// 表示移除在迭代的元素
// it.remove();}
// 在迭代过程中不允许对原集合进行增删操作
// set.remove(s); //报错
其他03——注解
- 注解:给机器看的解释说明
- 注释:给编程人员看的解释说明
Annotation(注解)概述
从JDK5.0开始, Java增加了对元数据(MetaData)的支持,也就是 Annotation(注解)。 Annotation其实就是代码里的特殊标记,它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。
掌握注解技术的要点:
- 如何定义注解。
- 如何反射注解,并根据反射的注解信息,决定如何去运行类。
定义
- 定义注解的类用@interface修饰;
- 属性默认被public stataic final修饰,方式如:int i();
a) 属性类型只能是基本类型、String、枚举、Class字节码、注解以及他们的一位数组形式;
例如
- @Override — 标记方法重写
- @SuppressWarnings — 压制警告
a)“unchecked” — 泛型的强转
b)“rawtypes” — 需要泛型但是没有指定
c)“unused” — 定义了没有使用的变量
d) “deprecation” — 已过时,
e)“static-access” — 表示通过对象调用了
- 静态属性或者静态方法
a)“null” — 表示可能通过值为null的对象调用了属性或者方法- @Deprecated — 已过时 元注解 — 对注解进行限制的注解 @Target — 限定注解的使用范围
@Retention — 限定注解的生命周期
@Documented — 表示让当前注解生成到文档中
@Inherited
— 表示允许当前注解也限制子类 — 注解一般只限制当前的类而不限制子类
注解的反射
c ↩︎
标签:02,对象,手上,线程,泛型,注解,方法,属性 来源: https://blog.csdn.net/free_puppet/article/details/96632200