目录
1、什么是对象
1.1类为对象定义属性和方法
类是对象的定义,对象从类创建。
* 对象的属性通过数据域(成员变量)来定义
* 对象的行为通过方法定义
类的设计原则:
内聚性
一致性
封装性
清晰性
完整性
实例和静态
继承与聚合
接口和抽象类。
1.2属性:
* 属性:通过成员变量进行定义
* 实例变量:绑定到某个特定的实例上的。
2、构造方法:
* 1、构造方法必须具备所在类相同的名称(和类名同名)
* 2、构造方法没有返回类型,连void都没有
* 3、构造方法在创建对象实例时被调用,一般用作对象的初始化操作
* 如果类中没有定义构造方法,编译器会默认添加一个 公共的 无参的默认构造方法;如果已经定义,编译器不在添加
*
* 构造方法是可以重载的。
*
* 构造方法在创建对象实例时被调用,一般用作对象的初始化操作
行为:
* 行为:通过成员方法来进行定义
2.1构造器:
1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名)
2.每个类可以有一个以上的构造器
3.构造器可以有0个、1个或1个以上的参数
4.构造器没有返回值
5.构造器总是伴随着new操作一起调用
6.不添加任何构造器会默认有空的构造器
3、static:
静态的,不依赖于具体的实例。
常量是一般被所有的对象所共享,所以一般声明为public static。
实例变量(成员变量),绑定到某个特定的实例上的。
3.1static全局变量与普通的全局变量
static全局变量只初使化一次,作用域被限制在该变量的源文件内有效,防止在其他文件单元中被引用
3.2static局部变量和普通局部变量
static局部变量只被初始化一次,下一次依据上一次结果值
3.3static函数与普通函数
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执 行过程中始终存在,但是在它作用域之外不能使用。
3.4静态代码块
随着类的加载而加载执行,只执行一次。
* javac---->class
* ------->classLoader装载进JVM
* 只执行一次,一般用于初始化(环境初始化等,比如网络资源,读取文件等)
3.5 静态方法(类方法):
不依赖于具体的实例
* 静态方法只能访问静态值,不能访问非静态方法及变量。
4、访问修饰符
* 访问修饰符 本类 同一个包 子类 其他类
* private √
* √ √
* protected √ √ √
* public √ √ √ √
5、方法传递参数
* 向方法传递对象参数
* 对象,传递的是一个引用
6、Random类:
* 可以使用Random对象创建随机数
* Random(); 使用系统当前时间作为种子创建random实例
* Random(long seed);使用种子seed创建Random对象
*
* 如果两个random对象的种子数相同,那么生成的随机序列也是相同的。
//创建Random对象时,需要指定种子,如果没有指定,默认使用系统当前时间的毫秒数作为种子
7、Date类:
//创建系统当前日期和时间的Date实例
Date date = new Date();
//日期转字符串
/*
* pattern:
* y:年
* M:月
* d:日
* D:星期
* H:24小时制小时
* h:12小时制小时
* m:分钟
* s:秒
* S:毫秒
*
*/
//格式化字符串
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ret = format.format(date);//将Date转为知道格式的字符串
System.out.println(ret);//打印输出
//将对应格式的字符串转为Date对象
String time = "2008-12-20 10:30:58";
Date d = format.parse(time);
//jdk1.8以后明确了时间类库
//获取指定日期
LocalDate currentDate = LocalDate.now();
System.out.println(currentDate);
//日期 + 时间 =====>LocalDateTime
LocalDateTime currentTime = LocalDateTime.now();
8、关联
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联关系分为单向关联和双向关联。在java中,单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。
9、聚合
聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。
10、this关键字:
this:
(1)this调用本类中的属性,也就是类中的成员变量;
(2)this调用本类中的构造方法;
(3)this调用本类中的其他构造方法,调用其他构造方法时要放在构造方法的首行。
11、装箱和拆箱:
装箱:(将基本数据类型转为包装类型)
拆箱:(将包装类型转为基本数据类型)
自动装箱
int value = 10;
//Integer number = new Integer(value);
Integer number = Integer.valueOf(value);
System.out.println(number.compareTo(20));//自动装箱
自动拆箱
String str = "200";
Integer i2 = Integer.valueOf(str);
Integer.parseInt(str);//返回基本数据类型
System.out.println(i2 + 20); //自动拆箱
关键题目
int num1 = 100;
int num2 = 200;
Integer num3 = Integer.valueOf(100);
Integer num4 = Integer.valueOf(100);//-128 - 127
Integer num5 = Integer.valueOf(200);
Integer num6 = Integer.valueOf(200);
Integer num7 = num1;
Integer num8 = num2;
// == 比较的是两个对象是否是同一个引用
System.out.println(num1 == num2);//基本数据类型比较的是值 false
System.out.println(num1 == num3);//true
System.out.println(num3 == num4);//true
System.out.println(num5 == num6);//false
System.out.println(num3 == num7);//true
System.out.println(num5 == num8);//false
12、==和equals的区别
* 用于对象的比较,equals默认使用的==,用于比较两个对象是否相等。
* 某些特定对象或者基于业务需要,可以重写equals方法用于实现比较逻辑。
13、String的一些方法
* String的简单方法
* length()返回字符串长度
* charAt(index):返回字符串汇总指定索引位置index出的字符(index基于0)
* concat(str):字符串连接,由于太常见,使用+进行字符串拼接
* toUpperCase():将字符串中所有的字符转为大写字符
* toLowerCase():将字符串中所有的字符转为小写字符
* trim():去掉字符串前后空格
*====================比较方法=================
*String 重写了equals()方法,用于比较字符串的字面值
* equals(str):
*equalsIgnoreCase
*compareTo:以字典顺序比较两个字符串的顺序,如果在前返回小于0
*startsWith(prefix)
*endsWith(suffix)
*contains(substr)
*===========字符串的查找=========
*indexOf()
*lastIndexOf()
*=============字符串的截取==========
*substring(index):
*substring(start,end):----->limit函数
格式化字符串:
// 将String 转化为Date
String str = "2011-05-17 11:39:00";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(str);
// 将date转化为String
String s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
System.out.println(s);
13.1 String的常用操作
public int length():获取字符串当中含有的字符个数,返回字符串长度。
public String concat(String str):将当前字符串和参数字符串str连接,返回值新的字符串。
public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始。)
public String toUpperCase():返回所有字母大写的新字符串
public String toLowerCase():返回所有字母小写的新字符串
public String trim(): 返回去掉两边空白字符的新字符串。
//字符串比较
public boolean equals(String str):如果该字符串等于字符串str,返回true
public boolean equalsIgnoreCase(String str):如果该字符串等于字符串str,返回true.不区分大小写
public int compareTo(String str):返回一个大于0、等于0、小于0的整数,表明一个字符串是否大于、等于或者小于str
public int compareToIgnoreCase(String str):返回一个大于0、等于0、小于0的整数,表明一个字符串是否大于、等于或者小于str。不区分大小写
public boolean startsWith(String prefix): 返回字符串是否以前缀prefix开头
public boolean endsWith(String suffix): 返回字符串是否以后缀suffix结束
public boolean contains(String str): 检查字符串中是否包含子串str
//字符串截取
public String substring(int begin):截取字符串,从特定位置begin的字符开始到字符串结尾。
public String substring(int begin,int end):截取字符串,从特定位置begin的字符开始到end-1的字符。(长度为end - begin)
//字符串查找,提供了几个版本的indexOf和lastIndexOf方法
public int indexOf(String str):查找参数字符串在本字符串当中首次出现str的索引位置,如果没有返回-1值。
public int indexOf(String str,int fromIndex):查找参数字符串在本字符串当中fromIndex之后首次出现str的索引位置,如果没有返回-1值。
public int lastIndexOf(String str):查找参数字符串在本字符串当中最后一个出现str的索引位置,如果没有返回-1值。
public int lastIndexOf(String str,int fromIndex):查找参数字符串在本字符串当中fromIndex之前出现最后一个str的索引位置,如果没有返回-1值。
13.2 字符串的替换和分割
public String replace(String oldString,String newString):将字符串中所有匹配的子串old String替换为新串newString
public String replaceAll(String oldString,String newString):将字符串中所有匹配的子串old String替换为新串newString。支持模式匹配(正则表达式)
public String[] split(String delimiter):从一个指定分隔符的字符串中提取标识,返回标识字符串数组
String token = "赵老师是一个好老师,你喜欢赵老师吗?"; //将所有的赵老师替换为Miss Cang String info = token.replace("赵老师", "Miss Cang"); System.out.println(info); //替换第一个找到的赵老师 System.out.println(token.replaceFirst("赵老师", "Miss Cang")); //替换全部,支持模式匹配(正则表达式) System.out.println(token.replaceAll("赵老师", "Miss Cang"));
//分割String[] tokens = "Linux@Java@Spring".split("@");for(String token : tokens) System.out.println(token);
13.3依照模式匹配、替换和分割
String str = "java in action";
System.out.println(str.matches("java.*"));
System.out.println("========================");
String reg = "^1[358]\\d{9}$";
System.out.println("110".matches(reg));
System.out.println("1300".matches(reg));
System.out.println("17300001111".matches(reg));
System.out.println("15300001121".matches(reg));
13.4 字符串与数组之间的转换
//字符串和字符数组进行转换
char[] letters = token.toCharArray();
System.out.println(letters.length);
new String(letters);
//
System.out.println(new String(letters,0,3));
13.5将字符和数值转换成字符串
回顾下,可以使用Double.parseDouble(str)或者Integer.parseInt(str)将一个字符串转为一个double或者int值,也可以使用字符串的连接操作符将字符或者数值转换为字符串。另外一种将数字转为字符串的方法是使用重载的静态valueOf方法。
格式化字符串
String.format(format,item1,item2,...,itemn)
StringBuffer和StringBuilder
StringBuffer和StringBuilder类似于String类,区别在于String类是不可改变的。一般来说,只要使用字符串的 地方,都可以使用StringBuffer/StringBuilder类.StringBuffer和StringBuilder比String更加灵活。可以给一个StringBuffer和StringBuilder中添加、插入或追加新的内容,但是String对象一旦创建,它的值就固定了。
除了StringBuffer中修改缓冲区的方法是同步的(只有一个任务被允许执行),StringBuffer与StringBuilder类是很相似的。如果是多任务并发访问,就使用StringBuffer,可以防止StringBuffer崩溃。而如果是单任务访问,使用StringBuilder会更有效。StringBuffer和StringBuilder中的构造方法和其它方法机会是完全一样的