1.内部类可以在java中定义另一个类中的一个类。我们称其为内部类,外部类为外部类。一个类内部有一个完整的结构,这个内部结构只为外部类提供服务。内部类可以更方便的访问外部类的成员,内部类提供了更好的封装,可以用权限修饰符更好的控制。//formatpublicclassclassname{//内部类权限修饰符[static]classinnerclassname{...}}1.1静态内部类staticinnerclass是用static修饰的类,是外部类的一部分。他的特性和普通班一样,只是位置不同而已。//格式publicclassOuter{publicstaticclassInner{...}}publicclassStaticInnerClass1{publicstaticStringstr="Version1.0";公共静态整数=10;私有字符串名称;publicstaticclassInner{私有字符串类型;私人年龄;publicInner(){}publicInner(Stringtype,intage){this.type=type;这个。年龄=年龄;}publicvoidshow(){System.out.println(str);System.out.println(num);}publicStringgetType(){返回类型;}publicvoidsetType(Stringtype){this.type=type;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}公共站ticvoidmain(String[]args){//内部类实例化StaticInnerClass1.Innerinner=newStaticInnerClass1.Inner();inner.show();}}注意:静态内部类可以直接访问外部类的静态成员staticinnerClasses不能直接访问外部实例成员1.2成员内部类成员内部类类似于静态内部类,只是没有static关键字修饰符,不能访问静态成员jdk1.6之前定义在成员内部类中,以后的版本可以定义。//格式修饰类类名{...修饰类内部类类名{...}}//成员内部类调用外部类。内部类对象名=newouterclassconstructor().newinnerclassConstructor()//示例publicclassMemberInnerClass{publicstaticintflag=0;私有字符串名称;私人年龄;publicMemberInnerClass(){}publicMemberInnerClass(Stringname,intage){this.name=name;这。年龄=年龄;}publicclassInner{privateStringsex;私人整数;publicInner(){}publicInner(Stringsex,intnum){this.sex=sex;这个.num=num;}publicvoidshow(){System.out.println(flag);System.out.println(名字);System.out.println(年龄);System.out.println(性别);System.out.println(num);}publicStringgetSex(){返回性别;}publicvoidsetSex(Stringsex){this.sex=sex;}公共intgetNum(){返回数字;}publicvoidsetNum(intnum){这个。数=数;}}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){这个。名字=名字;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicstaticvoidmain(String[]args){MemberInnerClass.Innerinner=newMemberInnerClass("张三",18).newInner("男",1);inner.show();}}特点:属于外部类的对象,符合类特性,不能创建静态成员,静态成员需要使用final直接访问外部成员和静态成员1.3部分内部类这是一个比较奇怪的语法,很少使用在正常情况下。只理解局部内部类放在代码块、构造函数、方法中。//示例publicclassPartialInnerClass{{classDog{}Dogdog=newDog();}publicPartialInnerClass(){classCat{}Catcat=newCat();}publicstaticvoidmain(String[]args){classPig{}Pigpig=newPig();}}1.4匿名内部类匿名内部类本质上是一个没有名字的局部内部类,主要定义在方法和代码块中。主要目标是简化代码。//格式new(class|abstractclass|interface){...}特点:匿名内部类是没有名字的内部类。编写匿名内部类时,会创建一个匿名对象。匿名内部类被创建为当前类的子类。类//示例公共接口AnonymousInnerClass{voidshow();staticvoidmain(String[]args){AnonymousInnerClassanonymousInnerClass=newAnonymousInnerClass(){@Overridepublicvoidshow(){System.out.println("匿名类创建");}};anonymousInnerClass.show();}}从上面可以看出AnonymousInnerClass好像是直接创建对象,其实不然。anonymousInnerClass实例得到的对象其实就是接口的实现类或者子类。这是匿名内部类的一个特点,创建一个子类。子类对象可以直接赋值给父类,这就是对象的三大特性之一的多态性,这部分我们接下来会介绍。1.5内部类示例下面的示例演示如何调用局部变量、成员变量和外部类成员变量publicclassOther{privateintnumber=10;publicclassInner{privateintnumber=5;publicvoidshow(){intnumber=2;//2System.out.println(数字);//5System.out.println(this.number);//10System.out.println(Other.this.number);}}publicstaticvoidmain(String[]args){Innerinner=newOther().newInner();inner.show();}}2。相同类型的多态对象在执行相同的行为时会具有不同的特性。举个简单的例子,狗和猫都可以抽象成类,这些类可以是动物类的子类。那么猫和狗都是动物的亚类,它们都学会了叫。当对不同的子类进行吠叫行为时,结果会有所不同。2.1格式和成员访问特性//格式类对象=new子类()接口对象=new实现类()访问特性:变量:编译调用依赖父类方法:编译看父类,调用看subclass2.2more状态的优缺点:解耦,易于扩展和维护。形参可以定义父类,实参作为子类传递,体现了可扩展性。缺点:在多态的情况下,不能使用子类特有的功能2.3类型转换自动类型转换:子类或实现类实例对象可以直接赋值给父类或接口强制类型转换:类似于基本类型强制,子类objects变量=(子类)父类类型变量,这种转换也解决了不能使用子类独立函数的缺点。强制类型转换问题:-如果子类不是父类的真正子类,会抛出异常ClassCastException-强制类型转换一般通过instanceof判断//格式化类变量instanceof类名//返回结果为boolean类型2.4示例//InterfacepublicinterfaceAnimal{voidbark();}publicclassCatimplementsAnimal{@Overridepublicvoidbark(){System.out.println("Thekittenmeows...");}}publicclassDogimplementsAnimal{@Overridepublicvoidbark(){System.out.println("Thepuppybarks...");}}publicclassDemo{publicstaticvoidgetBark(Animalanimal){animal.bark();}publicstaticvoidmain(String[]args){//喵喵getBark(newCat());//狗叫声getBark(newDog());}}本章结束,供个人学习和初学者使用,大佬勿喷!希望大家喜欢、收藏、支持、支持!源码【GitHub】【码云】
