JAVA_SE_笔记整理(面向对象四(接口,包,内部类))
面向对象四(接口,包,内部类)
1、接口:
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征(声明)没有方法的实现(体),因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口就是提供一种统一的”协议”,而接口中的属性也属于“协议”中的成员。
接口特点:
接口用关键字interface表示
格式:interface 接口名{}
类实现接口用implements表示
格式:class 类名 implements 接口名{}
接口不能实例化:
那么接口如何实例化?按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。
接口的子类:
要么是抽象类
要么重写接口中所有抽象方法的类。
接口的子:
接口,接口之间可以继承。extends
接口成员特点:
成员变量:
只能是常量,默认修饰符为public static final
构造方法
没有,因为接口注意是扩展功能的,而没有具体存在。
成员方法
只能是抽象方法
默认修饰符为 public abstract
2、类与类,类与接口,接口与接口的关系
类与类:extends继承关系,只能是单继承,但可以多层继承。
类与接口:Implements实现关系,可以单实现,也可以多实现(一个类中可以同时实现多个接口)。还可以在继承一个类的同时实现多个接口。
接口与接口:extends继承关系,可以单继承,也可以多继承
3、抽象类和接口的区别:
成员区别:
抽象类:变量,常量;有抽象方法,非抽象方法
接口:常量,抽象方法
关系区别:
类与类,继承,单继承,多层继承
类与接口,实现,单实现,多实现
接口与接口,继承,单继承,多继承。
设计理念区别:
抽象类,被继承体现的是:“is a”的关系,共性功能。
接口,被实现体的是:“like a”的关系,扩展功能。
总结区别:
1、抽象类,单继承。接口,多实现
2、抽象类,可以有变量,常量,抽象方法,非抽象方法。接口,只有常量,抽象方法。
3、abstract class表示的是"is-a"关系,interface表示的是"like-a"关系
4、抽象类中可以有非抽象方法。接口中则不能有实现方法。
5、接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6、抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7、接口中的方法默认都是 public,abstract 类型的。
4、参数和返回值问题
类、抽象类和接口类型作为形式参数:
类:需要的是该类的对象。
抽象类:需要该抽象类的子类的对象。
接口:需要该接口的实现类的对象。
类、抽象类和接口类型作为返回值:
类:其实返回的是该类的对象
抽象类:其实返回的是该抽象类的子类的对象(自行完成)
接口:其实返回的是该接口实现类的对象(自行完成)。
链式编程:是将多个操作(多行代码)通过点号“.”链接在一起成为一句代码。
例如:s.setAge(18).setName("张三").show();
5、包
包的概述:其实就是文件夹,用来对类进分类管理。
包的定义以及注意事项:
package 包名;
多级包用”.”分开即可
注意事项:
package 语句必须是程序的第一条可执行代码;
package 语句在java文件中只能有一个
如果没有package,默认表示无包名。
带包编译,运行:
手动式:
a、javac 编译当前java文件
b、手动创建包对应的文件夹
c、把a步骤得到的class文件,放到b得到的最后一个文件夹中。
d、通过java命令执行。注意的是:需要带包名称执行。
java com.tx.lyt.HelloWorld
自动式:
a、javac编译的时候带上参数 –d 即可
javac –d 目录 文件.java
javac –d . HelloWorld.java
这里的目录指:当编译完成后,带包的class存放的位置。
b:通过java命令执行。和手动式一样的。
不同包下,类之间的访问
定义两个类:Demo, Test
Demo 求和方法
Test 测试main方法
1、错误:找不到Demo 必须带包名
2、com.tx.Demo 不存在 没有编译Demo
3、com.tx.Demo 不是公共的 Demo不是public的
6、导包
导包概述:不同包下的类之间的访问,我们发现,每次使用不同包下的类的时候,都需要加包的全路径。比较麻烦。这时候,java提供了导包的功能。
导包格式:
import 包名;
注意:
这种方式导入是类的名称。
虽然可以最后写*,但是不建议。
7、类及其组成可以用的修饰符
类:
可以,public final abstract
自己定义:public居多
成员变量:
四种权限修饰符均可,final, static
自己定义:private居多,
构造方法:
四种权限修饰均可,其他不可
自己定义:public居多
成员方法:
四种权限修饰均可,final,static,abstract
自己定义:public居多
面向对象四(内部类)
1、内部类概述:
把类定义在其他类的内部,这个类就被称为内部类。
举例:在类A中定义了一个类B,类B就是内部类。
内部类的访问特点:
内部类可以直接访问外部类的成员,包括私有。
外部类要访问内部类的成员,必须创建对象。
内部类的位置:
按照内部类在类中定义的位置不同,可以分为如下两种格式:
成员位置(成员内部类)
局部位置(局部内部类)
2、成员内部类:
外界如何创建对象
外部类名.内部类名 对象名 = 外部类对象.new 内部类名();
把内部类拿出了使用。在实际开发中是不会这样使用的。因为一般内部类就是不让外界直接访问的。例如:电脑和cpu
成员内部类的常见修饰符
private 为了保证数据的安全性
static 为了让数据访问更加方便
内部类被静态修饰后:方法都为静态方法
3、局部内部类:
可以直接访问外部类成员
可以创建内部类对象,通过对象调用内部类方法,用局部内部类功能
4、匿名内部类
就是内部类的简化写法
前提:存在一个类或者接口。
格式:
new 类名或者接口名(){
实现未实现的方法
};
本质:是一个继承了类或者实现了接口的子匿名对象。
匿名内部类在开发中的使用
首先回顾我们曾经讲过的方法的形式参数是引用类型的情况,重点是接口的情况,我们知道这里需要一个子类对象。而匿名内部类就是一个子类匿名对象,所以,可以使用匿名内部类改进以前的做法。
java常用类
1、API概述
API(Application Programming Interface):应用程序编程接口
编写一个机器人程序去控制机器人踢足球,程序就需要向机器人发出向前跑、向后跑、射门、抢球等各种命令,没有编过程序的人很难想象这样的程序如何编写。但是对于有经验的开发人员来说,知道机器人厂商一定会提供一些用于控制机器人的Java类,这些类中定义好了操作机器人各种动作的方法。其实,这些Java类就是机器人厂商提供给应用程序编程的接口,大家把这些类称为Xxx Robot API。本章涉及的Java API指的就是JDK中提供的各种功能的Java类。
Java API就是Java提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
我们可以通过查帮助文档来了解Java提供的API如何使用
2、Object 类
Object是所有类的父类,都直接或间接的继承了该类。
构造方法:
public Object(); 只有这一种构造方法
子类的构造方法默认访问的是父类的无参构造方法
Object 类的成员方法
public int hashCode() // 返回对象的地址值。
返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
不同对象的,hashCode()一般来说不会相同,但是,同一个对象的hashCode()值肯定相同
不是对象的实际地址值,可以理解为逻辑地址值
public final Class getClass() // 表示此对象运行时类的 Class 对象
可以通过Class类中的一个方法,获取对象的真实类的全名称
public String toString() // 该对象的字符串表示
以字符串形式显示该对象:getClass().getName() + '@' + Integer.toHexString(hashCode())
默认情况下:toString()没有意义,需要子类重写该方法。
// 输出该对象,会调用toString方法,然后进行输出。
public boolean equals(Object obj) // 指示其他某个对象是否与此对象“相等”。
指示其他某个对象是否与此对象“相等”
默认情况下比较的是对象的引用是否相同
由于比较对象的引用没有意义,一般建议重写该方法
protected void finalize() //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
垃圾回收器不会马上回收垃圾,但是我们可以建议它尽快回收垃圾。(System.gc()方法)
主要针对堆内存
protected Object clone() // 此实例的一个副本。
创建并返回此对象的一个副本,这种克隆机制十分高效,而且二者之间完全隔离。
克隆和两个引用指向同一个对象的区别,克隆是将一个对象复制了一份,所有堆内存中有两个对象。引用:两个变量指向同一个对象的地址。
Object类clone()方法虽然简单,易用,但仅仅是一种”浅克隆”,它只克隆该对象所有的Field值,不会。对引用类型的Field所引用的对象进行克隆。开发中,我们也可以实现对象的”深度克隆”。
3、Scanner类概述及其构造方法
Scanner类概述:JDK5以后用于获取用户的键盘输入。
构造方法
public Scanner(InputStream source);
成员方法:
基本格式:hasNextXxx()判断下一个输入项是否为Xxx类型的数据,如果是返回true,不是为false。例外(String类型,省掉Xxx或者说HasNext就是判断String类型的)
nextXxx() 获取下一个输入项。Xxx的含义和上个方法中的Xxx相同
默认情况下,Scanner使用空格,回车等作为分隔符
常用方法:
public int nextInt(); // 接收一个Int类型的数据
public String nextLine(); // 接收一行数据。用字符串进行返回。
问题:
先nextInt()然后nextLine()的问题。
原因:nextInt只接受整型值,而回车被nextLine接收了,解决办法,就是都以字符串进行接收。
4、String 类
字符串是由多个字符组成的一串数据(字符序列)
字符串可以看成是字符数组
构造方法
public String()
public String(byte[] bytes)
public String(byte[] bytes,int offset,int length)
public String(char[] value)
public String(char[] value,int offset,int count)
public String(String original)
在实际开发中,字符串的操作是最常见的操作,没有之一。
而Java没有内置的字符串类型,所以,就在Java类库中提供了一个类String 供我们来使用。
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
注意:
String s = “helloworld”;
s也是一个对象。
String类的特点及面试题
字符串是常量,它的值在创建之后不能更改(字符串常量池:方法区)
String s = “hello”; s+=”world”, s的结构?
字符串直接复制的方式是先到字符串常量池中去找,如果有就直接返回,没有就创建并返回。
面试题
String s = new String(“hello”)和String s = “hello”;的区别?
前者两个对象,后者一个对象。
String类的判断功能
boolean equals(Object obj) // 比较字符串内容
boolean equalsIgnoreCase(String str)// 忽略大小写,比较字符串内容
boolean contains(String str) // 查找子串
boolean startsWith(String str) // 是不是以参数开头的字符串
boolean endsWith(String str) // 是不是以参数结尾的字符串
boolean isEmpty() // 是不是空字符串; 当且仅当 length() 为 0 时返回 true。
int length() // 获取长度
char charAt(int index) // 将对于下标的字符进行返回。
int indexOf(int ch) // 找字符表所对应的字符,找到返回下标,找不到返回-1
int indexOf(String str) //找字符串对应的下标,找不到-1
int indexOf(int ch,int fromIndex) // 找什么,从什么地方开始找。
int indexOf(String str,int fromIndex) // 找什么字符串,从什么地方开始找。
String substring(int start) // 从哪里开始截取
String substring(int start,int end) // 从哪里开始,到哪里结束。截取
byte[] getBytes() //将String转换为byte[]
char[] toCharArray() //将String转换为char[]
static String valueOf(char[] chs) //将char[]转换为String
static String valueOf(int i) //将int转为为String
String toLowerCase() //将字符串转为为小写
String toUpperCase() //将字符串转为为大写。
String concat(String str) //字符串拼接
String replace(char old,char new) //替换字符串中的字符
String replace(String old,String new) // 替换字符串中的子字符串
String trim() // 去除前后空格
int compareTo(String str) // 比较字符串大小
int compareToIgnoreCase(String str) // 忽略大小写,比较字符串大小
java 常用类ii
1、StringBuffer概述:
我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题
线程安全的可变字符串序列。
String和StringBuffer的区别?
String长度不可变,存在于方法区中的常量池中。
StringBuffer:线程安全的可变字符序列。
构造方法:
public StringBuffer()
public StringBuffer(int capacity)
public StringBuffer(String str)
// 设置容量
// 设置负数,默认什么都不干。
// 设置正数,小于等于原来容量,容量不变
// 设置正数,大于原来容量,小于等于原来容量2倍加2,设置为原来容量2倍加2
// 设置正数,大于等于原来容量2倍加2,设置为该正数
public void ensureCapacity(int minimumCapacity)
// 根据长度,设置容量。尝试减少用于字符序列的存储空间。
public synchronized void trimToSize()
2、StringBuffer类的成员方法
添加功能:
public StringBuffer append(String str)
字符串表示形式追加到序列
public StringBuffer insert(int offset,String str)
指定位置,字符串表示形式插入到序列
删除功能
public StringBuffer deleteCharAt(int index)
移除此序列指定位置的 char。此序列将缩短一个 char的长度,容量不变
public StringBuffer delete(int start,int end)
移除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符,如果不存在这种字符,则一直到序列尾部。如果 start 等于 end,则不发生任何更改。
替换功能:
public StringBuffer replace(int start,int end,String str)
从start开始,到end-1结束的字符串被str替换。
反转功能:
public StringBuffer reverse()
将字符串进行反转,改变原串
// 截取 将StringBuffer中指定位置,进行截取,并且以String类型进行返回。原StringBuffer没有发生变化
public String substring(int start)
public String substring(int start,int end)
3、Arrays类概述
针对数组进行操作的工具类。
提供了排序,查找等功能。
成员方法:
public static String toString(int[] a) // 将数组以字符串形式返回。要求懂源代码
public static void sort(int[] a) // 排序采用快速排序
public static int binarySearch(int[] a,int key) // 查找,采用二分查找。要求懂源代码
4、基本类型包装类概述:
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。
常用的操作之一:用于基本数据类型与字符串之间的转换。
基本类型和包装类的对应
Byte, byte
Short short
Integer int
Long long
Float float
Double double
Character char
Boolean Boolean
Integer类概述及其构造方法
Integer 类在对象中包装了一个基本类型 int 的值
该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法
构造方法
public Integer(int value)
public Integer(String s)
成员方法
int类型和String类型的相互转换
int – String
String – int
public int intValue() // 将integer对象转换为int
public static int parseInt(String s) // 将字符串转换为int
public static String toString(int i) // 将int转换为String
public static Integer valueOf(int i) // 将int转为Integer
public static Integer valueOf(String s) // 将String转换为integer
常用的基本进制转换
public static String toBinaryString(int i) // 将int类型的数字,转为二进制的数
public static String toOctalString(int i) // 将int类型的数字,转为八进制
public static String toHexString(int i) // 将int类中的数字,转换为十六进制
十进制到其他进制
public static String toString(int i,int radix) // 将十进制转到其他进制。第二个参数指定进制。基数。
其他进制到十进制
public static int parseInt(String s,int radix) // 将其他进制转换为十进制。第二个参数表示基数。
JDK5的新特性:
Integer x = new Integer(4); // 可以直接写成
Integer x = 4; // 自动装箱。
x = x + 5; //自动拆箱。通过intValue方法。
需要注意:
使用时,Integer x = null; 上面代码会报错。NullPointerException
Integer i = 1;
i += 1;
做了哪些事情:将1变为Integer类型,赋值给i,i+=1就相等于i=i+1,将Integer类型的i转换为int类型的1,做加法,然后将和在转换为Integer类型。
Integer.valueOf() // 在-128-+127之间,直接反回,integer对象。否则,new一个新的Integer对象。
Character类概述及其构造方法
Character类概述
Character 类在对象中包装一个基本类型 char 的值
此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反之亦然
构造方法
public Character(char value)
成员方法
public static boolean isUpperCase(char ch) // 是不是大写
public static boolean isLowerCase(char ch) // 是不是小写
public static boolean isDigit(char ch) // 是不是数字
public static char toUpperCase(char ch) // 转换为大写
public static char toLowerCase(char ch) // 转换为小写
常用类(三)
1、正则表达式
正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
举例:校验qq号码。
1、5-15数字。
2、0不能开头。
正则表达式的组成规则:
常见组成规则:
字符
字符类
预定义字符类
边界匹配器
数量词
Pattern 规则字符在java.util.regex Pattern类中
正则表达式的应用
判断功能
public boolean matches(String regex)
分割功能
public String[] split(String regex)
替换功能
public String replaceAll(String regex,String replacement)
获取功能
Pattern和Matcher类的使用
2、Math类
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
成员方法
public static int abs(int a) // 取绝对值
public static double ceil(double a) // 向上取整
public static double floor(double a) // 向下取整
public static int max(int a,int b) min自学 // 取最大值/最小值
public static double pow(double a,double b) // a^b
public static double random() // 获取[0,1)
public static int round(float a) 参数为double的自学 // 四舍五入
public static double sqrt(double a) // 平方根
3、Random类
Random类概述
此类用于产生随机数
如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。
构造方法
public Random()
public Random(long seed)
成员方法:
public int nextInt() 生成int范围内的随机数
public int nextInt(int n) 生成0到参数之间的随机数
4、System类
System类概述
System 类包含一些有用的类字段和方法。它不能被实例化。
成员方法
public static void gc() // 运行垃圾回收器
public static void exit(int status) // 终止虚拟机
public static long currentTimeMillis() //当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) //复制数组
1、原数组
2、从原数组哪开始
3、目标数组(接收数据的数组)
4、从目标数组哪开始
5、复制几个
复制的数量必须小于原数组长度-开始位置(复制的数量小于可以复制的数量)
5、BigInteger类
BigInteger类概述
可以让超过Integer范围内的数据进行运算
BigInteger 理论上没有位数限制,受限于程序可用的内存。
构造方法:
public BigInteger(String val) // 获取大整型对象
成员方法:
public BigInteger add(BigInteger val) // +
public BigInteger subtract(BigInteger val) // -
public BigInteger multiply(BigInteger val) // *
public BigInteger divide(BigInteger val) // /
public BigInteger[] divideAndRemainder(BigInteger val) // / %
6、BigDecimal类
由于在运算的时候,float类型和double很容易丢失精度,演示案例。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal
BigDecimal类概述
不可变的、任意精度的有符号十进制数。
构造方法
public BigDecimal(String val)
成员方法:
public BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor)
除数 保留位数 舍入方式
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
7、Date类
Date类概述:类 Date 表示特定的瞬间,精确到毫秒。
构造方法
public Date()
public Date(long date)
成员方法
public long getTime()
public void setTime(long time)
8、DateFormat抽象类
DateFormat类概述
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。是抽象类,所以使用其子类SimpleDateFormat
SimpleDateFormat :格式化处理日期
构造方法:
public SimpleDateFormat() // 获取SimpleDateFormat对象不设置日期格式
public SimpleDateFormat(String pattern) // 设置日期格式。
成员方法
public final String format(Date date) // 将日期对象,转换为日期字符串
public Date parse(String source) // 将日期字符串,转换为日期对象
9、Runtime
每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 应用程序不能创建自己的 Runtime 类实例
Process exec(String command) // 执行dos命令