publicclassOtherStudentDao{//集合容器privatestaticArrayList<Student> stus =newArrayList<>();static{Student stu1 =newStudent("heima001","张三","23","1999-11-11");Student stu2 =newStudent("heima002","李四","24","2000-11-11");
stus.add(stu1);
stus.add(stu2);}//添加学生方法publicbooleanaddStudent(Student stu){
stus.add(stu);returntrue;}//查看学生方法publicStudent[]findAllStudent(){Student[] students =newStudent[stus.size()];for(int i =0; i < students.length; i++){
students[i]= stus.get(i);}return students;}publicvoiddeleteStudentById(String delId){//查找id在容器中所在索引位置int index =getIndex(delId);
stus.remove(index);}publicintgetIndex(String id){int index =-1;for(int i =0; i < stus.size();i++){Student stu = stus.get(i);if(stu !=null&& stu.getId().equals(id)){
index = i;break;}}return index;}publicvoidupdateStudent(String updateId,Student newStu){//查找updateId,在容器中索引位置int index =getIndex(updateId);
stus.set(index,newStu);}}
publicclassTestInterface{/*
成员变量:只能是常量,系统会默认加入三个关键字
public static final
构造方法:没有
成员方法:只能是抽象方法,系统会默认加入两个关键字
public abstract
*/publicstaticvoidmain(String[] args){System.out.println(Inter.NUM);}}
classAnimal{publicvoideat(){System.out.println("动物吃饭");}}----------------------------------------classCatextendsAnimal{@Overridepublicvoideat(){System.out.println("猫吃鱼");}}------------------------------------------publicclassTestPolymorphic{/*
多态的前提:
1.要有(继承/实现)关系
2.要有方法重写
3.要有父类引用,指向子类对象
*/publicstaticvoidmain(String[] args){//当前事物,是一只猫Cat c =newCat();//当前事物,是一只动物Animal a =newCat();
a.eat();}}
3.2、多态中的成员访问特点
成员访问特点
成员变量
编译看父类,运行看父类
成员方法
编译看父类,运行看子类
代码演示
classFu{int num =10;publicvoidmethod(){System.out.println("Fu...method");}}--------------------------------classZiextendsFu{int num =20;publicvoidmethod(){System.out.println("Zi...method");}}-----------------------------------publicclassTest2Polymorpic{/*
多态的成员访问特点:
成员变量:编译看左边(父类),运行看右边(父类)
成员方法:编译看左边(父类),运行看右边(子类)
*/publicstaticvoidmain(String[] args){Fu f =newZi();System.out.println(f.num);
f.method();}}
3.3、多态的好处和弊端
好处
提供程序的扩展性。定义方法的时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
不能使用子类特有的成员
3.4、多态中的转型
向上转型
父类引用指向子类对象就是向上转型
向下转型
格式:子类型 对象名 = (子类型)父类引用;
代码演示
classFu{publicvoidshow(){System.out.println("Fu..show..");}}-----------------------------------------classZiextendsFu{@Overridepublicvoidshow(){System.out.println("Zi..show..");}publicvoidmethod(){System.out.println("我是子类特有的方法,method");}}--------------------------------------------------publicclassTest3Polymorpic{publicstaticvoidmain(String[] args){//向上转型:父类引用指向子类对象Fu f =newZi();
f.show();//多态的弊端:不能调用子类特有的成员//f.method();//A:直接创建子类对象//B:向下转型//向下转型:从父类型,转换会子类类型Zi z =(Zi)f;
z.method();}}
变量名 instance of 类型
通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果
代码演示
abstractclassAnimal{publicabstractvoideat();}----------------------------classDogextendsAnimal{publicvoideat(){System.out.println("狗吃肉");}publicvoidwatchHome(){System.out.println("看家");}}-------------------------------classCatextendsAnimal{publicvoideat(){System.out.println("猫吃鱼");}}---------------------------------------publicclassTest4Polymorpic{publicstaticvoidmain(String[] args){useAnimal(newDog());useAnimal(newCat());}publicstaticvoiduseAnimal(Animal a){//Animal a = new Dog();//Animal a = new Cat();
a.eat();//a.watchHome();//Dog dog = (Dog)a;
dog.watchHome();//ClassCastException 类型转换异常//判断a变量记录的类型,是否是Dogif(a instanceofDog){Dog dog =(Dog)a;
dog.watchHome();}}}
publicclassStudentService{//创建StudentDao(库管)//private OtherStudentDao StudentDao = new OherStudentDao();//通过学生库管工厂类,获取库管对象privateBaseStudentDao studentDao =StudentDaoFactory.getStudentDao();}
4、内部类
4.1、内部类的基本使用
内部类的概念
在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类
内部类定义格式
格式&举例:
/*
格式:
class 外部类名{
修饰符 class 内部类名{
}
}
*/classOuter{publicclassInner{}}
内部类访问特点
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
示例代码
/*
内部类访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
*/publicclassOuter{privateint num =10;publicclassInner{publicvoidshow(){System.out.println(num);}}publicvoidmethod(){Inner i =newInner();
i.show();}}
classOuter{privateint num =10;privateclassInner{publicvoidshow(){System.out.println(num);}}publicvoidmethod(){Inner i =newInner();
i.show();}}publicclassInnerDemo{publicstaticvoidmain(String[] args){//Outer.Inner oi = new Outer().new Inner();//oi.show();Outer o =newOuter();
o.method();}}
静态成员内部类
静态成员内部类访问格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
静态成员内部类中的静态方法:外部类名.内部类名.方法名();
示例代码
classOuter{staticclassInner{publicvoidshow(){System.out.println("Inner..show");}publicstaticvoidmethod(){System.out.println("Inner..method");}}}--------------------------------------publicclassTest3Innerclass{/*
静态成员内部类演示
*/publicstaticvoidmain(String[] args){//外部类名.内部类名 对象名 = new 外部类名.内部类名();Outer.Inner oi =newOuter.Inner();
oi.show();Outer.Inner.method();}}
2.3、局部内部类
局部内部类定义位置
局部内部类 是在方法中定义的类
局部内部类方式
局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量
示例代码
classOuter{privateint num =10;publicvoidmethod(){int num2 =20;classInner{publicvoidshow(){System.out.println(num);System.out.println(num2);}}Inner i =newInner();
i.show();}}publicclassOuterDemo{publicstaticvoidmain(String[] args){Outer o =newOuter();
o.method();}}
2.4、匿名内部类
匿名内部类的前提
存在一个类或者接口,这里的类可以是具体的也可以是抽象类
匿名内部类的格式
格式:new 类名(){重写方法} new 接口名(){重写方法}
举例
newInner(){@Overridepublicvoidmethod(){}}
匿名内部类的本质
本质:是一个继承了该类或者实现了该接口的子类匿名对象
匿名内部类的细节
匿名内部类可以通过多态的形式接收
Inner i =newInner(){@Overridepublicvoidmethod(){}}