向上转型 Fu fu = new Zi()
成员变量:编译看左,运行看左
成员方法:编译看左,运行看右
访问子类的的特有方法 :向下转型
Zi zi = (Zi) fu ;
1.2 台灯
设计一个台灯类(Lamp)其中台灯有灯泡类(Buble)这个属性,
还有开灯(on)这个方法。设计一个灯泡类(Buble),
灯泡类有发亮的方法,其中有红灯泡类(RedBuble)和绿灯泡类(GreenBuble)
他们都继承灯泡类(Buble)一个发亮的方法,请设计出一段代码可以使台灯开启灯泡发亮
红灯泡发红光,绿灯泡发绿光!(多态)
public class Lamp{
Buble buble ; //灯泡类
public void on(Buble buble){
buble.shine();
}
}
public class Buble {
//定义一个发亮的方法
public void shine(){
System.out.println("灯泡可以发亮了...") ;
}
}
public class RedBuble extends Buble {
@Override
public void shine() {
super.shine();
System.out.println("红灯泡发红光");
}
}
public class GreenBuble extends Buble{
@Override
public void shine() {
super.shine();
System.out.println("绿灯泡发绿光");
}
}
public class LampTest{
public static void main(String[] args) {
Lamp lamp = new Lamp() ;
Buble buble = new RedBuble();
Lamp.on(buble);
Buble buble1 = new GreenBuble();
Lamp.on(buble1);
}
}
1.3 猫狗的多态案例
定义一个动物类,里面有一个方法voice(),
定义一个类Cat,实现voice方法
然后增加一种新的动物类型:Pig(猪),实现voice()方法。
定义一个Dog类,实现voice方法
定义一个Store(宠物店)类的getInstance方法:
如果传入的参数是字符串dog,则返回一个Dog对象;
如果传入pig,则返回一个Pig对象;否则,返回一个Cat对象。
提示:字符串进行判断 通过equals(字符串)方法
public class Animal {
public void voice(){
System.out.println("voice方法");
}
}
public class Dog extends Animal {
@Override
public void voice() {
System.out.println("汪汪");
}
}
public class Pig extends Animal{
@Override
public void voice() {
System.out.println("哼哼");
}
}
public class Cat extends Animal{
@Override
public void voice() {
System.out.println("喵喵");
}
}
public class Store extends Animal{
public Animal getInstance(String name){
if(name.equals(dog)){
return new Dog() ;
}else if(name.equals(name)){
return new Pig();
}else{
return new Cat();
}
}
}
public class AnimalTest(){
public static void main(String[] args){
Stroe store = new Store();
Animal animal = store.getInstanc("dog");
animal.voice();
animal = store.getInstanc("pig");
animal.voice();
}
}
形参问题:方法的形式参数传递是基本数据类型和引用数据类型 基本数据类型传递数据值 引用数据类型传递空间地址值 形式参数是引用类型,实际参数需要传递实际参数,就是形式参数类型的空间地址值1.如果形参是具体类 1)第一步:创建工具类对象 2)调用工具类的有返回值类型方法 3)创建具体类的对象 4)传入工具类2.如果形参是抽象类型 父类引用指向子类对象 Fu fu = new Zi() 传入fu3.如果形参是接口 创建子实现类的对象 接口名 变量 = new 子实现类名();返回值是引用类型问题:1.返回值是具体类----返回当前类的对象 public Student method(){ Student student = new Student(); return student ; }2.如果返回值类型是抽象类 创建子类对象,返回子类对象3.如果返回值类是接口 创建接口的子实现类,创建子类对象,返回子类对象
3. 内部类()不做重点,了解–属于"设计层面"
定义:一个类A中定义一个类B,B称为A的内部类,A称为B的外部类
3.1 成员内部类和局部内部类
成员内部类:在外部类的成员位置定义的类;局部内部类:在外部类的成员方法位置定义的类;
3.2 内部类的应用场景
3.3 成员内部类的访问特点
1.成员内部类的成员可以访问外部类的成员变量包括私有;2.外部类的成员方法如何调用成员内部类的方法? 1)创建成员内部类的对象去访问内部类的方法; 间接方法 2)就是将外部类的成员内部类--当做是外部类的成员 直接访问 前提条件:当前的成员内部类是非静态的的 外部类名.内部类名 对象名=new 外部类对象.new 内部类对象 ; 对象名.内部类方法名 public class StaticDemo { private int num = 10 ; int num2 = 20 ; public class Inner{ public void show(){ System.out.println(num); } } public void method(){ Inner inner = new Inner(); inner.show(); } } public class InnerClassDemo { public static void main(String[] args) {//测试类 Outer outer = new Outer() ; //方式一:间接访问 outer.method(); system.out.println("--------------------");方式二:直接访问 Outer.Inner s = new Outer().new Inner();//外部类名.内部类名 对象名=new 外部类对象.new 内部类对象 ; s.show(); //对象名.内部类方法名 }}3.如果成员内部类是静态的,那么只能访问外部类的静态成员变量,与成员内部类的成员方法是否静态无关 成员外部类的成员方法访问静态的成员内部类的成员方法,那么将成员内部类看做成员外部类的静态成员, 1)外部类名.内部类名 对象名=new 外部类名.内部类名();//不推荐 2)外部类名.内部类名.方法名class Outer3{//外部类 public int num = 10 ; public static int num2 = 20 ; static class Inner3{ public void show(){ System.out.println(num); System.out.println(num2); } public static void show2(){ System.out.println(num2) ; } }}//测试类public class InnerClassDemo3 { public static void main(String[] args) { //外部类名.内部类名 对象名 = new 外部类名.内部类对象() ; Outer3.Inner3 oi = new Outer3.Inner3(); oi.show(); oi.show2() ; //不推荐,不出来,得自己补全,因为show2()静态方法 System.out.println("-------------------------------"); Outer3.Inner3.show2();方式二,推荐 }}
object类:作为超类,所有类的父类 所有的类都默认继承超类; 常用方法: 1)public final class getClass():表示 获取当前正在运行的Class类对象(字节码文件); 我们运行结果是字节码文件---class类对象 所以返回:class 包名.类名;
6.1 常用方法 getClass()
public final class getClass():表示 获取当前正在运行的Class类对象(字节码文件);Class类中,public String getName():获取当前类或者接口的名称,字符串形式----包名.类名--->称为"类的全限定名称 获取字节码文件的方式一:我们运行结果是字节码文件---class类对象 所以返回:class 包名.类名; 方式二:类名.class public class ObjectDemo { public static void main(String[] args) { Student s1= new Student(); Student s2 = new Student();//空间地址值 System.out.println(s1==s2);//false Class c1 = s1.getClass();//接受返回值 System.out.println(c1);//结果 class com.test2.Student Class c2 =s2.getClass();//接收返回值 System.out.println(c2);//结果 class com.test2.Student System.out.println(c1==c2);//ture }}public class Student extends Object { public static void main(String[] args) { }}
6.2 哈希码值 hashCode
public int hashCode(): "一个地址值",不是实际意义的地址值,它是经过底层的哈希算法(hash)算出来的 一般情况下,不同的对象它的哈希码值是不一样的,有些中文除外 System.out.println(s1.hashCode());//356573597 System.out.println(s2.hashCode());//1735600054 System.out.println("刘宝寿".hashCode());//20946970 System.out.println("王东磊".hashCode());//29076217
6.3 public String toString()
返回对象是字符串表现形式(地址值),返回结果应该是简明扼要,容易读懂的,建议所有子类重写该方法;重写toString方法:idea自动生成alt+ins键----->tostring 没有重写toString之前,返回的是地址值 重写后,返回的是重写后的关系表达式;public class Student { private String name; private int age; public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; }}public class ObjectDemo { public static void main(String[] args) { Student s1 = new Student("高圆圆",42);//Student{name='高圆圆', age=42} Student s2 = new Student("赵又廷",45);// Student{name='赵又廷', age=45} System.out.println(s1);//Student{name='高圆圆', age=42} System.out.println(s2);//Student{name='赵又廷', age=45} }}
6.3 equals方法
public boolean equals(Object obj):引用该类型比较的是地址值是否相同1.==和equals的区别: ==如果连接的引用类型,比较的是地址值是否相等. 如果连接的是基本数据类型,比较的是数据值是否相等 如果我们不重写Object的equals方法,默认比较的是两个引用类型的地址值是否相同,如果重写了equals方法而且同时重写了hashCode()比较的是成员信息是否相同! public boolean equals(Object obj) { return (this == obj); } 快捷键:alt+enter---eauals and hashCode---->
String类的获取功能(都必须掌握)public char charAt(int index)获取指定索引出的字符值 public String concat(String str):拼接功能--->获取新的字符串 最传统的拼接使用+:字符串拼接符号public int indexOf(int ch)返回指定字符第一次出现的字符串内的索引public int indexOf(String str):返回指定字符串中字符串第一次出现索引值public int lastIndexOf(int ch):返回指定字符最后一次出现的索引String substring(int beginIndex) :从指定位置开始默认截取到末尾--->返回一个新的字符串String substring(int beginIndex, int endIndex) :从指定位置开始截取到指定位置结束 包前,不包后(只能取到endIndex-1处),返回的一个字符串;左闭右开public String[] split(String regex):按照指定的分割符号--拆分成字符串数组 String str = "JavaEE-Python-Php-Go-R-Hadoop-C" ; String[] strArray = str.split("-"); for (int i = 0; i <strArray.length ; i++) { System.out.println(strArray[i]);
8.4 String的转换功能
public char[] toCharArray():将字符串转换为字符数组public byte[] getBytes():将字符串转换成字节数组---使用平台默认字符集编码 String的构造方法---String(byte[] bytes):使用平台默认字符集解码 public String toLowerCase():将字符串转换成小写 public String toUpperCase():将字符串转换成大写 public static String : String valueOf(int/double/float/char[]/Object i);万能方法:将任何数据类型转换成String类型
StringBuffer:字符串缓冲区-->里面存储的是可变的字符序列,但是它的类型StringBuffer类型 StringBuffer s = new StringBuffer();返回s返回的是字符序列值; int length():获取字符串缓冲区的长度(里面实际的字符序列的长度); public int capacity():获取缓冲区的容量大小=16(默认缓冲区容量)+字符序列长度 字符串缓冲区默认16个初始容器里(英文字符)
方式一;无参构造赋值public class StringBufferDemo1 { public static void main(String[] args) { String str = "helloWorld"; StringBuffer s = new StringBuffer();//无参构造 s =s.append(str);//返回的是字符串缓冲区的字符序列,还是他本身 System.out.println(s); System.out.println("----------------");方式二:有参构造赋值 StringBuffer s2 = new StringBuffer(str);//有参构造赋值 System.out.println(s2); }}
10.2 StringBuffer---->String
方式一:toString:返回当前对象的字符串 StringBuffer().toString();方式二: StringBuffer s3 = new StringBuffer("javase"); String string = new String(s3); System.out.println(string);//String类型的javase
11.Integer类
Integer类定义:Integer是引用类型,nteger类在对象中包装了一个基本类型 int 的值,是int类型和String类型相互转换的桥梁parseXXX(String str)方法:将String类型的数据转变为XXX;Int类型的取值范围:Integer类的静态的自定义常量;public static final int MAX_VALUE ;最大值//2147483647public static final int MIN_VALUE ;最小值//-2147483648
11.1 Integer的构造方法
1)Integer(int value)--->可以将基本类型数据转换为Integer类型 2)Integer(String s)throws NumberFormatException :将String转换为Integer类型,但是String必须是"数字字符串",否则会出现数字化格式异常; 1)Integer i = new Integer(100) 2)Integer integer = new Integer("20") ;
1)String类型转为int类型(基本类型):ParseInt(String str)---->int类型,其他基本类型同理; public class IntegerDemo2 { public static void main(String[] args) { String str = "50" ; int i = Integer.parseInt(str); System.out.println(i);//int类型的50 }}2)int类型(基本类型)转为String类型 int x = 100 ; Integer ii = new Integer(x).toString(); System.out.println(ii);
12.Character类
定义:char类型保证类型构造方法:Character(char value) 包含 char类型的值 Character character = new Character('a') ;转为引用类型a character的三个判断功能:public static boolean isDigit(char ch):是否数字字符public static boolean isLowerCase(char ch):是否为小写字母字符public static boolean isUpperCase(char ch):是否为大写字母字符 char[] ch=str.chatAt(int index);:获取字符串的字符 Character.isDigit(ch):判断是否是数字字符
13. Date类
java.util.Date:表示日期对象,精确到毫秒!Date日期 格式:Thu Jan 13 22:19:23 CST 2022字符串文本格式:"yyyy-mm-dd"
13.1 构造方法(重点)
无参构造方法:Date date = new Date() ;
13.2 String类型日期与java.util.Date类型转换(重点)
注意: 转换的类:DateFormat:日期格式化类:他是抽象类,不能new对象,所以使用它的子类SimpleDateFormat.public final String format(Date date):格式化 Date-->Stringpublic Date parse(String source) throws ParseException:String--Date:解析parse这个方法本身就存在异常,throws ParseException:String:抛出异常,谁用谁抛出;格式化方法:public SimpleDateFormat(String pattern):并且String的日期格式有固定模板yyyy-MM-dd public class Test { public static void main(String[] args) throws ParseException { //String ---->Date Date date = new Date(); System.out.println(date); // 创建转换桥梁SimpleDateFormat SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd"); //子类SimpleDateFormat继承父类DateFormatd的方法 String format = s.format(date);//Thu Jan 13 22:42:11 CST 2022 System.out.println(format);//2022-01-13 System.out.println("--------------------------------------------"); //Date --------->String String str = "1995-9-22"; //创建转换桥梁SimpleDateFormat,如果如果String类型的格式 // 和SimpleDate这里面的模式不一致的话,就出现解析异常 SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd"); Date parse = s2.parse(str);//调用parse方法本身就有异常;谁调用谁处理,否则编译报错 //理--throws 继续抛出在main方法上,或者捕获try...catch(开发中业务层代码处理异常捕获) System.out.println(parse);//Fri Sep 22 00:00:00 CST 1995 }}
使用工具类:public class DateDemo2 { private DateDemo2(){}; //String----Date public static Date string2Date(String source,String pattern) throws ParseException { return new SimpleDateFormat(pattern).parse(source); //Date--->String } public static String date2String(String pattern,Date date){ return new SimpleDateFormat(pattern).format(date); }}class test{ public static void main(String[] args) throws ParseException { String str = "1995-09-22"; Date date1 = DateDemo2.string2Date(str, "yyyy-MM-dd"); System.out.println(date1); Date date = new Date(); String string = DateDemo2.date2String("yyyy-MM-dd", date); System.out.println(string); }}
14. System类
14.1 System的类字段(成员变量)
1.public static final InputStream int:标准输入流public static final PrintStream out ; 标准输出流public static final PrintStream err ;标准的错误输出流
14.2 System的功能
public static void exit(int status):参数为0,表示正常终止jvm
ListIterator:接口:列表迭代器正向遍历: boolean hasNext():判断是有更多下一个元素可以迭代(遍历) E next()获取下一个可以遍历元素反向遍历: boolean hasPrevious():判断是否有更多的上一个元素可以迭代(遍历) E previous():获取上一个可以遍历的元素
22.3 关于并发修改异常出现的原因
就是在描述使用迭代器去遍历元素的时候,不能使用元素去操作元素,否则就会出现并发修改异常:ConcurrentModificationException解决方案:1)使用迭代器去遍历元素,迭代器添加元素---使用列表迭代器ListIteator遍历且添加元素添加位置:列表迭代器在指定的位置后面添加元素 while (it.hasNext()) { //获取元素 String s = it.next();//ConcurrentModificationException //判断 if ("world".equals(s)) { //给集合中新添加一个元素"javaee" it.add("javaee"); } } System.out.println(list);//[hello, world, javaee, java]2>使用list的特有遍历功能E get(int index)+size()de 方式遍历,在集合最后添加 for(int x = 0 ; x<list.size();x++){ String s = list.get(x); if("world".equals(s)){ list.add("javaee"); } } System.out.println(list);3>加强for就是简化的顺序迭代器 for(String s : list){ if("world".equals(s)){ list.add("javaee"); } } System.out.println(list);//ConcurrentModificationException
22.4 选择排序
核心思想:从0位开始,依次和所有元素比较大小,最小值放前面2)比较的次数=数组长度-1public class ArrayList { public static void main(String[] args) { int[] arr = {11, 25, 15, 26, 45}; System.out.println("排序前"); printArray(arr); System.out.println("排序后"); select(arr); printArray(arr); }public static void select(int[]arr){ for(int x = 0;x<arr.length-1;x++){ for(int y = x+1; y<arr .length;y++){ if(arr[x]>arr[y]){ int temp = arr[x]; arr[x]=arr[y]; arr[y]=temp; } }}} public static void printArray(int[] array) { StringBuffer s = new StringBuffer(); s.append("["); for(int x=0;x<array.length;x++){ if(x==array.length-1){ s.append(array[x]); }else{ s.append(array[x]+","); } } s.append("]"); System.out.println(s); }}
22.4 List集合的去重问题
方式一:建立一个空集合思想,遍历以前的集合,如果以前集合中的元素在新集合中不包含,那么添加到新集合中;public class ListDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("hello"); list.add("world"); list.add("java"); list.add("world"); list.add("hello"); List<String> list2 = new ArrayList<>(); for (String s : list) { if(!list2.contains(s)){ list2.add(s); } } System.out.println(list2); }}方式二:使用选择排序的核心思想,使用前面角标的元素和后面元素依次比较,如果重复,则把后边的重复元素删掉; 此时用到list的另一个功能:public objet <>remove(int index) public class ListDemo3 { public static void main(String[] args) { List<String> list = new ArrayList<>() ; //模拟添加一些重复性的字符串数据 list.add("hello") ; list.add("world") ; list.add("hello") ; list.add("hello") ; list.add("java") ; list.add("java") ; list.add("world") ; list.add("android") ; list.add("android") ; list.add("JavaEE") ; list.add("JavaEE") ; list.add("hello") ; list.add("Python") ; list.add("Python") ; //选择排序的代码 for(int x = 0 ;x < list.size() -1; x++){//比较次数 for(int y = x +1 ; y < list.size() ; y ++){//中间元素比较 //如果后面的元素和前面的元素重复了,将后面角标对应的元素删除,角标-- if(list.get(y).equals(list.get(x))){ //将后面的元素 删除 list.remove(y) ; y--; } } } //遍历集合 for(String s:list){ System.out.println(s); } }}
本周内容day 141.多态的经典题1.1 孔子装爹–经典的多态的成员访问特点向上转型 Fu fu = new Zi()成员变量:编译看左,运行看左成员方法:编译看左,运行看右访问子类的的特有方法 :向下转型 Zi zi = (Zi) fu ;1.2 台灯设计一个台灯类(Lamp)其中台灯有灯泡类(Buble)这个属性,还有开灯(on)这个方法。设计一个灯泡类(Buble),灯泡类有发亮的方法,其中有红灯泡类(RedBuble)和绿灯泡类(GreenBuble)他们都继承灯泡