day12–this和super调用
this调用构造方法
方法之间调用,可通过方法名进行调用。
构造方法之间的调用,可以通过this关键字来完成。
构造方法调用格式:this(参数列表);//必须在第一行
class Person {
private int age;
private String name;
Person() {
}
Person(String nm) {
name = nm;
}
Person(String nm, int a) {
this(nm);//必须在第一行
age = a;
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("张三", 23);
}
}
super关键字
当父类中没有空参数构造方法时,子类的构造方法必须有显示的super语句,指定要访问的父类有参数构造方法。
public class Test {
public static void main(String[] args) {
new Zi();
}
}
class Fu{
int num ;
Fu(){
System.out.println("Fu构造方法"+num);
num = 4;
}
}
class Zi extends Fu{
Zi(){
//super(); 调用父类空参数构造方法
System.out.println("Zi构造方法"+num);
}
}
//执行结果:
//Fu构造方法0
//Zi构造方法4
PS:如果子类的构造方法第一行写了this调用了本类其他构造方法,那么super调用父类的语句还有吗?
这时是没有的,因为this()或者super(),只能定义在构造方法的第一行,因为初始化动作要先执行。
知识点总结
this关键字,本类对象的引用
this是在方法中使用的,哪个对象调用了该方法,那么,this就代表调用该方法的对象引用
this什么时候存在的?当创建对象的时候,this存在的
this的作用:用来区别同名的成员变量与局部变量(this.成员变量)
public void setName(String name) {
this.name = name;
}
构造方法: 用来给类的成员进行初始化操作
格式:
修饰符 类名 (参数列表) {
…
}
构造方法的特点:
1, 方法名与类名相同
2,没有返回值,也没有返回值类型,连void也没有
构造方法什么时候会被调用执行?
只有在创建对象的时候才可以被调用
super: 指的是父类的存储空间(理解为父类的引用)
调用父类的成员变量:
super.成员变量;
调用父类的构造方法:
super(参数);
调用方法的成员方法:
super.成员方法();
继承中的构造方法注意事项:
1,如果我们手动给出了构造方法,编译器不会在给我们提供默认的空参数构造方法
如果我们没写任何的构造方法,编译器提供给我们一个空参数构造方法
3, 当父类中没有空参数构造方法的时候,怎么办?
a: 通过 super(参数) 访问父类有参数的构造方法
b: 通过 this(参数) 访问本类中其他构造方法
注意:[本类中的其他构造方法已经能够正常访问父类构造方法]
4, super(参数) 与 this(参数) 不能同时在构造方法中存在
day13
引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改。
final Person p = new Person();
Person p2 = new Person();
p = p2; //final修饰的变量p,所记录的地址值不能改变
p.name = "小明";//可以更改p对象中name属性值
//p不能为别的对象,而p对象中的name或age属性值可更改。
final成员变量,需在创建的时候一起赋值,不然就在构造方法里面赋值,否则报错。
class Demo {
//直接赋值
final int m = 100;
//final修饰的成员变量,需要在创建对象前赋值,否则报错。
final int n;
public Demo(){
//可以在创建对象时所调用的构造方法中,为变量n赋值
n = 2016;
}
}
被static修饰的成员变量属于类,不属于这个类的某个对象。(多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量)
被static修饰的成员可以并且建议通过类名直接访问。
格式:
类名.静态成员变量名
类名.静态成员方法名(参数)
对象名.静态成员变量名 ——不建议使用该方式,会出现警告
对象名.静态成员方法名(参数) ——不建议使用该方式,会出现警告
class Demo {
//静态成员变量
public static int num = 100;
//静态方法
public static void method(){
System.out.println("静态方法");
}
}
class Test {
public static void main(String[] args) {
System.out.println(Demo.num);
Demo.method();
}
}
静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
class Demo {
//成员变量
public int num = 100;
//静态成员变量
public static int count = 200;
//静态方法
public static void method(){
//System.out.println(num); 静态方法中,只能访问静态成员变量或静态成员方法
System.out.println(count);
}
}
//创建一个普通对象
Person p = new Person();
//创建一个匿名对象
new Person();
匿名内部类的作用与格式
作用:匿名内部类是创建某个类型子类对象的快捷方式。
//已经存在的父类:
public abstract class Person{
public abstract void eat();
}
//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
Person p = new Person(){
public void eat() {
System.out.println(“我吃了”);
}
};
//调用eat方法
p.eat();
//使用匿名对象的方式,
//将定义子类与创建子类对象两个步骤由一个格式一次完成。
//虽然是两个步骤,但是两个步骤是连在一起完成的。
//匿名内部类如果不定义变量引用,则也是匿名对象。代码如下:
new Person(){
public void eat() {
System.out.println(“我吃了”);
}
}.eat();
构造代码块是定义在类中成员位置的代码块
特点:
1.优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作
2.每创建一个对象均会执行一次构造代码块。
public class Person {
private String name;
private int age;
//构造代码块
{
System.out.println("构造代码块执行了");
}
}
静态代码块是定义在成员位置,使用static修饰的代码块。
特点:
1.它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
2.该类不管创建多少对象,静态代码块只执行一次。
3.可用于给静态变量赋值,用来给类进行初始化。
public class Person {
private String name;
private int age;
//静态代码块
static{
System.out.println("静态代码块执行了");
}
}
day14
不同修饰符的使用
类,最常使用public修饰
成员变量,最常使用private修饰
成员方法,最常使用public修饰
day15
Object: 它是所有类的超类,祖宗类。java中所有的类都直接或间接的继承这个类
方法
public String toString() 返回当前对象中的内容, 对于Object类默认操作来说,返回的对象的类型+@+内存地址值
public boolean equals(Object obj) 比较两个对象内容是否相同,对于Object类默认操作来说,比较的是地址值
String: 字符串类,字符串是常量;它们的值在创建之后不能更改
方法
boolean equals(Object obj) 判断两个字符串中的内容是否相同
boolean equalsIgnoreCase(String str) 判断两个字符串中的内容是否相同, 忽略大小写
boolean contains(String str) 判断该字符串中 是否包含给定的字符串
boolean startsWith(String str) 判断该字符串 是否以给定的字符串开头
boolean endsWith(String str) 判断该字符串 是否以给定的字符串结尾
boolean isEmpty() 判断该字符串的内容是否为空的字符串 “”
int length() 获取该字符串的长度
char charAt(int index) 获取该字符串中指定位置上的字符
String substring(int start) 从指定位置开始,到末尾结束,截取该字符串,返回新字符串
String substring(int start,int end) 从指定位置开始,到指定位置结束,截取该字符串,返回新字符串
int indexOf(int ch ) 获取给定的字符,在该字符串中第一次出现的位置
int indexOf(String str) 获取给定的字符串,在该字符串中第一次出现的位置
int indexOf(int ch,int fromIndex) 从指定位置开始,获取给定的字符,在该字符
byte[] getBytes() 把该字符串 转换成 字节数组
char[] toCharArray() 把该字符串 转换成 字符数组
String replace(char old,char new) 在该字符串中,将给定的旧字符,用新字符替换
String replace(String old,String new) 在该字符串中, 将给定的旧字符串,用新字符串替换
String trim() 去除字符串两端空格,中间的不会去除,返回一个新字符串
String toLowerCase() 把该字符串转换成 小写字符串
String toUpperCase() 把该字符串转换成 大写字符串
int indexOf(String str,int fromIndex) 从指定位置开始,获取给定的字符串,在该字符串中第一次出现的位置
StringBuffer/StringBuilder:
方法
public StringBuffer append(String str) 在原有字符串缓冲区内容基础上,在末尾追加新数据
public StringBuffer insert(int offset,String str) 在原有字符串缓冲区内容基础上,在指定位置插入新数据
public StringBuffer deleteCharAt(int index) 在原有字符串缓冲区内容基础上,删除指定位置上的字符
public StringBuffer delete(int start,int end) 在原有字符串缓冲区内容基础上,删除指定范围内的多个字符
public StringBuffer replace(int start,int end,String str)在原有字符串缓冲区内容基础上,将指定范围内的多个字符 用给定的字符串替换
public StringBuffer reverse() 将字符串缓冲区的内容 反转 “abc”—-“cba”
public String substring(int start) 从指定位置开始,到末尾结束,截取该字符串缓冲区,返回新字符串
public String substring(int start,int end) 从指定位置开始,到指定位置结束,截取该字符串缓冲区,返回新字符串
day16
正则表达式:用来定义匹配规则,匹配一系列符合某个句法规则的字符串。
正则表达式的常用方法:
public boolean matches(String regex) //判断字符串是否匹配给定的规则
public String[] split(String regex) //根据给定正则表达式的匹配规则,拆分此字符串
public String replaceAll(String regex,String replacement) //将符合规则的字符串内容,全部替换为新字符串
Date: 日期/时间类
构造方法:
public Date()// 系统当前日期时间
public Date(long date) 得到一个1970年1月1日 0点这个时间基础上,加上参数date 毫秒值对应的日期时间
方法:
public long getTime() 获取日期所对应的毫秒值
DateFormat:是日期/时间格式化子类的抽象类, 使用其子类SimpleDateFormat 实例化
构造方法:
public SimpleDateFormat() 默认的格式化操作
public SimpleDateFormat(String pattern) 按照指定的格式,进行日期格式化
日期和时间模式
M 年中的月份 (0-11)
H 一天中的小时数(0-23)
S 毫秒数
方法:
public final String format(Date date) 把日期 格式化成字符串
public Date parse(String source) 把日期字符串 转换成 日期对象
Calendar:日历类,可获取日期中指定字段的值
方法:
public static Calendar getInstance() //获取日期对象
public int get(int field) //获取时间字段值
public void add(int field,int amount) //指定字段增加某值
public final void set(int field,int value)//设置指定字段的值
public final Date getTime() //获取该日历对象转成的日期对象
day18
集合中存储的元素必须是引用类型数据
创建对象时,确定泛型的类型
泛型相当于传进去一个final参数
学习Java中三种长度表现形式
* 数组.length 属性 返回值 int
* 字符串.length() 方法,返回值int
* 集合.size()方法, 返回值int
/*
* Collection接口方法
* boolean contains(Object o) 判断对象是否存在于集合中,对象存在返回true
* 方法参数是Object类型
*/
private static void function_1() {
Collection<String> coll = new ArrayList<String>();
coll.add("abc");
coll.add("itcast");
coll.add("itheima");
coll.add("money");
coll.add("123");
boolean b = coll.contains("itcast");
System.out.println(b);
}
迭代器的实现原理
/*
* 集合中的迭代器:
* 获取集合中元素方式
* 接口 Iterator : 两个抽象方法
* boolean hasNext() 判断集合中还有没有可以被取出的元素,如果有返回true
* next() 取出集合中的下一个元素
*
* Iterator接口,找实现类.
* Collection接口定义方法
* Iterator iterator()
* ArrayList 重写方法 iterator(),返回了Iterator接口的实现类的对象
* 使用ArrayList集合的对象
* Iterator it =array.iterator(),运行结果就是Iterator接口的实现类的对象
* it是接口的实现类对象,调用方法 hasNext 和 next 集合元素迭代
*/
/*
* 将的酒店员工,厨师,服务员,经理,分别存储到3个集合中
* 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法
*/
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest {
public static void main(String[] args) {
//创建3个集合对象
ArrayList<ChuShi> cs = new ArrayList<ChuShi>();
ArrayList<FuWuYuan> fwy = new ArrayList<FuWuYuan>();
ArrayList<JingLi> jl = new ArrayList<JingLi>();
//每个集合存储自己的元素
cs.add(new ChuShi("张三", "后厨001"));
cs.add(new ChuShi("李四", "后厨002"));
fwy.add(new FuWuYuan("翠花", "服务部001"));
fwy.add(new FuWuYuan("酸菜", "服务部002"));
jl.add(new JingLi("小名", "董事会001", 123456789.32));
jl.add(new JingLi("小强", "董事会002", 123456789.33));
// ArrayList<String> arrayString = new ArrayList<String>();
iterator(jl);
iterator(fwy);
iterator(cs);
}
/*
* 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 work
* ? 通配符,迭代器it.next()方法取出来的是Object类型,怎么调用work方法
* 强制转换:it.next()=Object o ==> Employee
* 方法参数: 控制,可以传递Employee对象,也可以传递Employee的子类的对象
* 泛型的限定 本案例,父类固定Employee,但是子类可以无限?
* ? extends Employee 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象
* ? super Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象
*/
public static void iterator(ArrayList<? extends Employee> array){
Iterator<? extends Employee> it = array.iterator();
while(it.hasNext()){
//获取出的next() 数据类型,是什么Employee
Employee e = it.next();
e.work();
}
}
}
day19
List:
它是一个有序的集合(元素存与取的顺序相同)
它可以存储重复的元素
Set:
它是一个无序的集合(元素存与取的顺序可能不同)
它不能存储重复的元素
List集合中的特有方法
void add(int index, Object element) 将指定的元素,添加到该集合中的指定位置上
Object get(int index)返回集合中指定位置的元素。
Object remove(int index) 移除列表中指定位置的元素, 返回的是被移除的元素
Object set(int index, Object element)用指定元素替换集合中指定位置的元素,返回值的更新前的元素
ArrayList:
底层数据结构是数组,查询快,增删慢
LinkedList:
底层数据结构是链表,查询慢,增删快
HashSet:
元素唯一,不能重复
底层结构是 哈希表结构
元素的存与取的顺序不能保证一致
如何保证元素的唯一的?重写hashCode() 与 equals()方法
LinkedHashSet:
元素唯一不能重复
底层结构是 哈希表结构 + 链表结构
元素的存与取的顺序一致
day20
Map集合:
map集合中的元素都是成对出现,成对存储的
map集合中的元素都是以一对键和值的形式组成存在的,称为键值对,理解为夫妻对
map集合中的键不能重复存储,值可以重复
map集合中的每一个键 对应着一个值
方法:
V put(K key, V value) 把指定的键与指定的值添加到Map集合中
V remove(Object key) 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值
Set< Map.Entry< K,V>> entrySet() 获取到Map集合中所有的键值对对象的集合(Set集合)
V get(Object key) 根据指定的键,在Map集合中获取对应的值
Set< K > keySet() 获取Map集合中所有的键,存储到Set集合中
Map集合遍历的两种方式
方式1:根据键找值的方式
//a, 获取到Map集合中所有的键,返回对应的Set集合
//b, 遍历键的集合,获取到每一个键
//c, 通过键,找到对应的值
//获取到Map集合中所有的键,返回对应的Set集合
Set<String> keys = map.keySet();
//遍历键的集合,获取到每一个键
for (String key : keys) {
//通过键,找到对应的值
Student s = map.get(key);
System.out.println( key + "..." + s.getName() + "..." + s.getAge() );
}
方式2:根据键值对对象找键和值的方式
//a, 获取Map集合中所有的键值对元素,返回对应的Set集合
//b, 遍历键值对元素集合,获取到每一个键值对元素对象
//c, 通过键值对元素对象,获取对应的键,和对应的值
//获取Map集合中所有的键值对元素,返回对应的Set集合
Set< Map.Entry<String, Student>> entrySet = map.entrySet();
//遍历键值对元素集合,获取到每一个键值对元素对象
for (Map.Entry<String, Student> entry : entrySet) {
//通过键值对元素对象,获取对应的键,和对应的值
//找键
String key = entry.getKey();
//找值
Student s = entry.getValue();
//打印
System.out.println( key+"..."+s.getName()+"..."+s.getAge() );
}
HashMap:
特点:
是Map集合的子集合
底层采用哈希表结构
HashMap集合中的key不能重复,通过重写hashCode() 与 equals()方法来保证键的唯一。
不能保证元素存与取的顺序完全一致
LinkedHashMap:
特点:
是HashMap集合的子集合
底层采用哈希表+链表结构
LinkedHashMap集合中的key不能重复,通过重写hashCode() 与 equals()方法来保证键的唯一。
Collections中的方法:
public static < T> void sort(List< T> list) 排序
public static void shuffle(List