十三 控制访问权限修饰词
private 修饰属性 属性只能在当前类中被调用修饰方法 方法也只能在本类中被调用
可以修饰内部类
default 修饰属性 在本类可以使用,在同一包下可以被使用
修饰方法 一样
protected 修饰属性 本类 同一包下 子类中可见
修饰方法 一样
public 本类 同一包 子类中 其他地方都可用
javaBean规范:属性尽可能的私有化,为了其他类中可以访问值,需要提供相应的get,set方法。方法要public修饰。
static修饰词:修饰属性 这个属性就不是对象的属性了,属于类的属性,是公有的资源。任何对象都可以访问。
final关键字:修饰属性 只能声明时赋值或者在构造器中赋值 之后不能再重新被赋值了(只能赋一次值)
修饰方法 不能被子类重写。
修饰的类 不能被继承,不能有子类。
十四 抽象类
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
用abstract修饰的类就是抽象类 不能被实例化 但是存在构造器。
方法可以没有方法体,但是必须使用abstract修饰,叫抽象方法
抽象类与类的区别
抽象类中可以有抽象方法和普通方法 可以有构造器 可以有属性。
类中不能有抽象方法
有抽象方法的类一定是抽象类 但是抽象类中不一定有抽象方法
抽象类可以被继承 如果子类是一个普通的 类 那么应该重写父类抽象方法
如果子类是抽象类 符合抽象类的特点即可。
static不能修饰抽象方法。
抽象类是被用来创建继承层级里子类的模板。
简单点来说,所谓的抽象类呢,就是带有抽象方法的类.比较适用需要运用多态,并且某些方法在子类中必须重定义时。
十五 接口
接口,特殊的抽象类,如果有方法一定是抽象方法。在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这
些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
Java语言只能单继承,但通过接口可以实现多继承(在Java中,一个抽象类只能继承一个抽象类,但一个接口却可以使用extends关键字同时继承多个接口(但接口不能继承抽象类))。
接口的使用
由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化。接口的使用原则如下:
(1)接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口;
(2)接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法;
(3)接口的对象可以利用子类对象的向上转型进行实例化。
对于子类而言,除了实现接口外,还可以继承抽象类。若既要继承抽象类,同时还要实现接口的话,使用一下语法格式:
class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}
对于接口,里面的组成只有抽象方法和全局常量,所以很多时候为了书写简单,可以不用写public abstract 或者public static final。并且,接口中的访问权限只有一种:public,
即:定义接口方法和全局常量的时候就算没有写上public,那么最终的访问权限也是public,注意不是default。
例如:USB接口、打印接口、充电接口等等。
如果要进行开发,要先开发出USB接口标准,然后设备厂商才可以设计出USB设备。
现在假设每一个USB设备只有两个功能:安装驱动程序、工作。
定义一个USB的标准:
interface USB { // 操作标准
public void install() ;
public void work() ;
}
定义USB设备—手机:
class Phone implements USB {
public void install() {
System.out.println("安装手机驱动程序。") ;
}
public void work() {
System.out.println("手机与电脑进行工作。") ;
}
}
定义USB设备—打印机:
class Print implements USB {
public void install() {
System.out.println("安装打印机驱动程序。") ;
}
public void work() {
System.out.println("进行文件打印。") ;
}
}
十六 正则表达式
正则表达式正则表达式,又称规则表达式。计算机科学的一个概念,正则表通常被用来检索、替换那些符合某个模式(规则)的文本。简单来说有时候需要这样的需求 对字符串需要匹配 查找 替换等操作
正则表达式其实是一个特殊的字符串 是一组规则字符串
常用符号:
.:是代替任何字符
[abc]:匹配abc中的任意一个
[^abc]:除了abc
[0-9]--->[\d]:
[\D]:匹配非数字
[\W]:匹配非单词字符
[\s]:匹配空格
[x]*:匹配0个以上的x
[x]?:匹配0个或1个x
[x]+:匹配一个以上的x
[x]{n}:匹配n个x
[x]{n,}:匹配n个以上的x
[x]{n,m}:匹配n到m个x
^:表示从头开始校验
比如:美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式
[0-9]{4}[A-Z]{2} 匹配典型的美国汽车牌照号码,如8836KV
比如:假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式
[a-z]* \s+ [0-9]{1,2},\s* [0-9]{4}
String支持正则表达式
matchs(String reg):
参数为正则表达式 用来判断字符串是否匹配正则表达式
匹配:返回true
不匹配:返回false
split(String reg):
用来拆分字符串:用符合正则表达式的子字符串拆分 返回值类型是字符串数组
replaceAll(String str,String new)
作用是使用new这个字符串替换符合reg的子串
十七 Object类型
是所有引用类型的父类 在引用类型的顶端他的引用变量可以指向任何类型的一个对象
Object obj="aaaa";
obj=new int[3];
obj=new Scanner(System.in);
比如:怎么使用数组存一些类型不同的数据
用Object定义一个数组
Object[] arr=new Object[3];
arr[0]="aaa";
arr[1]=new int[3];
arr[2]=new Scanner(System.in);
Object类型中的常用方法:
toString():
在Object类型中,方法的返回为"类全名@散列码"
在自定义类型时 如果不手写继承Object 系统默认继承Object
toString()方法就会被继承
继承后的方法返回的字符串没有意义。我们应该重写toString()方法
用来描述new出来的对象信息
重写toString():默认规则
"类全名[属性名=属性值,属性名=属性值]"
toString():当想输出显示对象信息时,会默认调用这个方法
equals():
在Object类型中 equals()相当于== 比较的是地址
在大多数情况下 我们不比较是不是同一个对象 而应该比较两个对象的内容是否一样
自定义的类继承过来的方法就不满足要求 应该重写equals()
重写规则:
public boolean equals(Object obj){
}
1 应该判断传进来的参数是不是null
2 判断传进来的参数是不是自己
3 判断传进来的参数是不是本类型 如果是同一类型 再去比较属性
hashCode():
用于加速查找,实现索引查找(查询算法,存储算法)
hashCode的两个原则:
1.两个对象equals()方法比较返回值为true时,那么他们的hashCode()方法也要保证返回值相同。
2.对象中用equals()来比较使用的属性,都应该用来计算hashCode()。
需求:
1.hashCode()返回值相同,equals()返回值也一定要相同。
2.重写hashCode()使用啦什么属性,在equals()方法中也要使用什么属性。
所以我们写类时需要重写上面三个方法。
十八 包装类 八大基本数据类型
每个基本类型在java.lang包中都有一个相应的包装类把基本数据类型的数值转换成对象
byte---java.lang.Byte
short---java.lang.Short
int---java.lang.Integer
long---java.lang.Long
float---java.lang.Float
double---java.lang.Double
char---java.lang.Character
boolean---java.lang.Boolean
集合不允许存放基本数据类型数据,存放数字时,要用包装类型
所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例
除Character类外,其他包装类可将一个字符串作为参数构造它们的实例
常用方法
Integer.valueOf(int val)
会将int的值转换Integer类型的对象
Double.valueOf(double val)
会将double的值转换Double类型的对象
...
装箱操作 基本数据类型--->包装类
intValue();
doubleValue();
拆箱操作 将包装类对象转换成相应的基本数据类型
在做运算时 包装类的对象都会转换成相应的基本数据类型再计算
在jdk1.5版本以后 支持自动拆箱和装箱
Integer num=5;--->Integer num=Integer.valueOf(5);
装箱操作
int a=new Integer("5");--->int a=new Integer(5).intValue();
拆箱操作
reg:
Integer a=5;
Integer b=6;
Integer c=a+b;//先拆箱 计算出结果再装箱
Integer.parseInt(String str)
将字符串转换成包装类
int a=Integer.parseInt("12");
int b=Integer.parseInt("abc");这种情况出现异常
NumberFormatException 数字格式化异常---程序运行时异常
十九 日期类型
java.util.Datejava语言中支持的日期操作 Date用来计算时间的分量
但是Date类中的方法大多数已经过时 被Calendar类型取代
java.text.SimpleDateFormat
作用:通常都是用来对时间格式化 或者将字符串转换成时间格式
构造器
SimpleDateFormat(String pattern)
pattern:用来定义日期格式
y:年 M:月
format(Date date); String
将日期转换成字符串
parse(String str); Date
将字符串转换成日期类型
有可能出现 ParseException :转换异常---编译期间
比如获取当前系统时间 按照一定格式显示出来
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String r=sdf.format(date);
System.out.println(r);