收藏 分销(赏)

第四章 继承.ppt

上传人:pc****0 文档编号:13877060 上传时间:2026-04-29 格式:PPT 页数:40 大小:230.50KB 下载积分:10 金币
下载 相关 举报
第四章 继承.ppt_第1页
第1页 / 共40页
第四章 继承.ppt_第2页
第2页 / 共40页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章 继承,一、继承的概念,二、类继承,三、多态与动态绑定,四、构造函数的重载,五、包,六、接口,一、继承的概念,继承的定义,继承是一个对象获得另一个对象的属性和行为的过程,是软件复用的一种形式。新类由已存在的类生成,通过保留它们的属性和行为,并且根据新类的要求对性能加以修改,添加新的属性和行为。由继承得到的类称为子类,被继承的类称为父类。,如果子类只从一个父类继承,则称为单继承:如果子类从一个以上的父类继承,则称为多继承。,一、继承的概念,继承的层次关系,Java,是单继承机制,不支持多重继承,即一个父类可以有多个子类,但一个子类只能有一个父类。这种单继承使代码更加可靠,不会出现因多个父类有相同的方法或属性所带来的麻烦。但为保持多继承的表现能力,,Java,支持接口的概念,接口使,Java,获得了多重继承的许多优点,摒弃了相应的缺点。,A,D,C,B,E,F,A,B,C,D,E,F,一、继承的概念,父类和子类,父类代表共性,从一个父类继承的所有类都继承了这个父类的功能。子类继承了父类的功能,并根据具体需要来添加功能。当用户建立一个新类时,不必全部写出所有的属性和方法,只需声明该类继承已定义过的父类的属性和方法。这个新类称作子类,每个子类也可成为将来某个子类的父类。,子类从父类继承的内容主要有两个方面:,(1),属性的继承,(2),方法的继承,一、继承的概念,在面向对象系统中,类通常是紧密相关的,将公共的属性和行为抽象到一个父类中,接着用继承构造子类,这样就可以避免重复定义公共属性和行为。只要父类中的公共接口不改变,修改父类时就不需要改动子类。当子类不重新定义某方法时,它就简单地继承其直接父类的该方法。在子类和父类的关系中要分清,is-a,关系和,has,关系。,(1)is-a,是继承关系。一个子类对象按父类对象类型同样对待,,is-a,关系就是继承的特点。,(2)has,是合成关系。类的对象中可以包含一个或多个其他类对象,这种关系通过合成已有的类来创建新的类。,二、类继承,继承关系的定义,通过在类的声明中加入,extends,关键字创建一个类的子类,其格式为:,class,子类名,extends,父类名,.,子类的直接父类是该子类直接继承的父类,(,通过关键字,extends,来实现,),,而间接父类则是两级或两级以上的父类。继承是指能够直接获得已有的性质和特征,而不必重复定义它们。例如,:,class Manager extends Employee,/added methods and fields,二、类继承,子类继承父类需遵循下面一些规则:,(1),子类能够继承父类的,public,和,protected,成员变量和方法。,(2),子类能够继承父类中默认修饰符的成员,只要子类和父类在同一个包中。,(3),子类不能继承父类隐藏的成员变量和方法,以及父类中的构造方法。,(4),子类不能继承父类中的,private,成员变量和方法。,(5),若子类声明了一个与父类中的成员同名的成员,则子类不继承父类中的同名成员。,(6),若缺省,extends,关键字,则该类为,java.lang.Object,类的子类。,二、类继承,属性继承与隐藏,子类是父类的扩展,增加了父类没有的属性和方法。例如,,Manager,类增添了一个新的字段用于存储奖金,并增添了一个新方法用于设置它的值:,class manager extends Employee,public void,setBonus(double,b)bonus=b;,private double bonus;,当通过扩展一个父类来定义一个子类时,只需说明子类和父类中的区别就可以了。在设计类的时候,把最通用的方法放进父类中,而更具体和专门的方法应该放在子类中。在面向对象编程中,通过把功能转移到子类中来分解是非常常见的。,二、类继承,方法继承,对于,Manager,对象,可以使用,getName,和,getHireDay,等方法。即使这些方法没有明显地在,Manager,类中定义,它们也自动地从,Employee,类中继承过来了。,class Manager extends Employee,public void,setBonus(double,b)bonus,=b;,private double bonus;,当然如果有一个,Employee,父亲对象,则该对象不能使用,setBonus,方法,因为该方法没有在,Employee,类中定义。,二、类继承,方法覆盖,方法覆盖是指子类定义同名方法来覆盖父类的方法,是多态技术的一个实现。当父类方法在子类中被覆盖时,通常是子类版本调用父类版本,并做一些附加的工作。,使用方法覆盖应注意下面一些事项:,(1),不使用,super,而希望引用父类方法会导致无限的递归,因为子类方法实际上是在调用它自己。,(2),当通过父类引用调用一个方法时,,Java,会正确地选择与那个对象对应的类的覆盖方法。对于父类提供的方法,子类可以覆盖它,但这不是必须的,即子类也可以使用一个方法的父类版本。,(3),方法覆盖中,子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即与父类完全相同的方法名、返回,l,类型和参数列表。,(4),子类可以添加字段,也可以添加方法或者覆盖父类中的方法。但继承不能去除父类中的任何字段和方法。,二、类继承,方法重载,与方法覆盖不同,方法重载是用相同的方法名但不同的参数表来定义方法,(,参数表中参数的数量、类型或次序有差异,),。当调用一个重载的方法时,编译器通过检查调用语句中的参数来选择恰当的方法。重载的方法可以有相同的返回值类型,但必须有不同的参数表,否则会产生语法错误。如果编译器没有找到与其参数匹配的方法或者发现不止一个方法与其匹配,则会发生编译期错误,(,这个过程称作重载分辨,),。与方法的覆盖不同的是重载不是子类对父类同名方法的重新定义,而是类对自身已有同名方法的重新定义。,Java,中允许对任何方法重载。因此要完整描述一个方法,需要指定方法的名字以及它的参数类型,这称作方法的型构,(signature),。返回值类型不是方法特征中的一部分,即不能有这样的两个方法:它们具有相同的名字和参数类型,但只是具有不同的返回值类型。,二、类继承,例,:,通过方法重载实现不同数据类型数据的接收,class,MyMethodOverLoading,void,abc(int,a),System.out.println(an,integer data,arrive:+a,);,void,abc(int,a,int,b),System.out.println(two,integer,datas,arrive:+a+,+b,);,void,abc(float,a),System.out.println(a,float data,arrive:+a,);,void,abc(String,a),System.out.println(a,string data,arrive:+a,);,public,MyMethodOverLoadingTest,public static void,main(String,args,),MethodOverLoading,my=new,MethodOverLoading,();,my.abc(1);my.abc(1,2);,my.abc(1.23);my.abc(hello world!);,二、类继承,在子类中使用构造函数,如果子类构造函数不显式调用父类中的构造函数,那么父类使用其默认,(,无参数,),的构造函数。如果父类没有默认的构造函数并且子类构造函数不显式调用父类中的其他构造函数,那么,Java,编译器会给出一条错误。既然子类中的构造函数不能访问父类的私有字段,那么它必须通过一个构造函数来初始化它们,这个构造函数通过专门的,super,语法来调用,使用,super,的调用必须是子类构造函数中的第一行语句。关于子类构造函数需遵循下面规则:,1.,子类构造函数总是先调用,(,显式地或隐式地,),其父类的构造函数以创建和初始化子类中的父类成员。,2.,构造函数不能继承,它们只属于定义它们的类。如果把一个对象指定为其父类的引用,那么允许把这个对象转换回它自己原来的类型,为了向该对象传送一些在父类中没有的信息,必须这样做。,3.,当创建一个子类对象时,子类构造函数首先调用父类的构造函数并执行,接着才执行子类构造函数。,二、类继承,父类对象与子类对象的关系,一个对象变量指向多种实际类型的现象称为多态,在运行时自动选择正确的方法进行调用则称为动态绑定。,Java,中不需要把一个方法声明为虚类型的,动态绑定是默认行为。如果不想让一个方法成为虚方法,可以把其标识为,final,类型。,三、多态与动态绑定,多态是允许一个接口被多个同类动作使用的特性,具体使用哪个动作与应用场合有关。也即指同名的不同方法在类程序中共存,即一个类中可以有多个具有相同名字的方法,系统会根据调用方法时传递参数个数的不同或参数类型的不同来决定调用相应不同的方法。这样就可以采用同样的方法获得不同的行为结果,,Java,中通过方法覆盖和方法重载来实现多态。,三、多态与动态绑定,基本概念,多态,(Polymorphism),提高了程序的可扩充性,调用多态行为的软件传送给对象的消息,(,即方法调用,),与对象的类型无关,因此能响应已有消息的新类型可以直接加入系统,而不用修改基本系统。多态分为两种:一是编译时的多态,二是运行时的多态。编译时的多态是通过函数重载或运算符的重载来实现的。而运行时的多态是通过继承和虚函数来实现的,之所以称为运行时的多态是因为在程序执行之前,根据函数和参数还无法确定应该调用哪一个函数,而必须在程序的执行过程中,根据具体的执行情况才能动态地确定。在运行时自动选择正确的方法进行调用称作动态绑定,(dynamic binding),三、多态与动态绑定,理解调用一个对象方法的机制是非常重要的:,(1),编译器检查对象的声明类型和方法名。例如调用,x.f(String,),,这里,x,已被声明为一个类,C,的对象,编译器列举了类,C,中称作,f,的所有方法和,C,的父类中称作,f,的所有公共方法。,(2),编译器接着检查方法调用中的参数类型。如果在所有叫做,f,的方法中有一个其参数类型同调用提供的参数类型最匹配,那么该方法就会被选择调用,这个过程称作超载选择。,如果编译器不能找到任何同参数类型匹配的方法,或者有多个方法都匹配转化后的参数类型,那么编译器会报告一条错误。现在编译器知道了需要调用的方法的名字和参数类型。,三、多态与动态绑定,(3),如果方法类型为,private,、,static,、,final,或者是一个构造器,那么编译器也会准确地知道应该调用哪个方法,这称作静态绑定。与此相反,靠隐式参数的实际类型来决定调用哪个方法叫做动态绑定,这必须发生在运行时。在上面的例子中,编译器会生成一条动态绑定调用的指令。,(4),当程序运行并且使用动态绑定调用一个方法时,虚拟机必须调用同,x,所指向的对象的实际类型相匹配的方法版本。假设实际类型为,D(C,的子类,),,如果类,D,定义了一个方法,f(String,),,那么该方法就会被调用。否则就会在,D,的父类中搜寻方法,f(String,),,其余依此类推。为节省时间,虚拟机会为每一个类预先计算一个方法表,里面保存了该类中每个方法的型构和实际要调用的方法。,三、多态与动态绑定,this,和,super,变量,this,和,super,是常用来指代父类对象与子类对象的关键字,,Java,系统默认每个类都缺省地具有,null,、,this,和,super,三个对象变量,所以在任意类中都可以不加说明而直接引用它们。其中,null,代表,“,空,”,,一般用,null,来代表尚未存在的对象,在定义一个对象但尚未为其开辟内存时可以指定这个对象为,null,。,1.this,this,表示的是当前对象本身,更准确地说,,this,代表了当前对象的一个引用。对象的引用可以理解为对象的另一个名字,通过引用可以顺利地访问对象,包括修改对象的属性、调用对象的方法。一个对象可以有若干个引用,,this,就是其中之一。,三、多态与动态绑定,2.super,子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员变量,或在重写的方法中使用父类中被重写的方法,这时就需要访问父类的成员变量或调用父类的方法,,Java,中通过,super,来实现对父类成员的访问。使用,super,有下面三种情况:一是用来访问父类被隐藏的变量,二是调用父类中被重写的方法,三是调用父类的构造函数。,super,表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用。所谓直接父类是相对于当前对象的其他祖先而言的。,父类对象与,/,和子类对象的转化需要注意如下的原则:,(1),子类对象可以视为是其父类的一个对象。,(2),父类对象不能当成是其某一个子类的对象。,(3),如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为形式参数。,(4),如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用。,四、构造函数的重载,默认字段初始化,如果在构造函数中没有明确地给某个字段赋值,那么此字段会被自动地赋值为一个默认值:若是数字则被赋值为,0,,若是布尔类型则被赋值为,false,,若是对象引用则被赋值为,null,。但使用默认值被认为是一种糟糕的编程做法。因为,如果字段以不可见的形式被初始化会使得别人很难读懂程序。字段和本地变量之间存在重要的区别,必须在方法中明确地对本地变量进行初始化。而如果在类中没有初始化字段,此字段会被自动初始化为默认值,(0,,,false,或,null),。,四、构造函数的重载,默认构造函数,默认构造函数是指没有参数的构造函数,(,这种构造函数有时也称作无参数构造函数,),。例如下面是一个,Employee,类的默认构造函数:,public Employee(),name=;salary=0;hireDay=new Date();,如果编写了一个没有构造函数的类,则系统会自动为此类提供一个默认构造函数。此默认构造函数将所有的属性字段初始化为默认值。所以实例字段中的所有数字变量被设置为,0,,所有的布尔变量被设置为,false,,而所有的对象变量被设置为,null,。如果一个类中含有多个构造函数但却没有默认构造函数,则在构造对象时若没有指定构造参数,它将不能合法地构造对象。,四、构造函数的重载,显式字段初始化,由于在类中可以重载构造函数方法,所以可以采用多种方式来设置类中实例字段的初始状态。不管什么样的构造函数调用,确保每个实例字段都被设置为某个有意义的值是一种很好的习惯。在类的定义中,可以简单地把一个值赋值给任何字段。例如:,private String name=lily,在执行构造函数前,此赋值会被执行。当类中所有的构造函数都需要把某一特定的实例字段赋值为相同的值时,此语法非常有用。,初始值不一定是一个常数值。在下面的例子中,一个字段被初始化为一个方法调用。考虑,Employee,类,此类的每个员工都有一个,id,字段。可以把它初始化为:,static,int,assignedId()int,r=,nextId,;,nextId+;return,r;,private,int,id=,assignId,();,四、构造函数的重载,调用另一个构造函数,关键字,this,指向隐式参数,此外此关键字还有另一种含义即如果构造函数的第一个语句形如,this(),,那么此构造函数调用此类中的另一个构造函数。下面是一个典型实例:,public,Employee(double,s),this(Employee#+nextld,s,);,nextld,+;,当调用,new Employee(60000),时,,Employee(double,),构造函数便调用,Employee(String,,,double),构造函数。以这种方式使用,this,关键字是很有用的,这样做只需要编写一次公共的构造函数代码。,四、构造函数的重载,初始化块,三种初始化数据字段的方式:一是通过在构造函数中设置值,二是通过在声明中赋值,三是初始化块。在类声明中可以包含任意数量的代码块。只要构造了此类的一个对象,这些代码块就会被执行。例如,class Employee,public,Employee(String,n,double s)name=,n;salary,=s;,public Employee()name=;salary=0;,.,/,对象初始化模块,id=,nextId,;,nextId,+;,.,private String name;,private double salary;,private,int,id;,private static,int,nextld,;,四、构造函数的重载,构造函数被调用后的详细执行过程:,(1),所有的数据字段被初始化为默认值,(0,、,false,或,null),。,(2),如果一个构造函数的第一行调用了另一个构造函数,则执行另一个构造函数。否则,按照在类声明中出现的次序依次执行所有的字段初始化语句和初始化块。,(3),执行构造函数的主体。,五、包,Java,允许把多个类收集在一起成为一组,称作包,(,pachge,),。包便于组织任务,以及使自己的任务和其他人提供的代码库相分离。,Java API,中的每一个类和接口属于一个特定的包。它包含一组相关联的类和接口,实际是对类和接口进行组织的目录结构。,标准,Java,库被分类成许多的包,其中包括,java.lang,、,java.mil,和,等。标准,Java,包是分层次的,就像在硬盘上的各级子目录一样,可以通过层次嵌套组织包,所有的,Java,包都在,Java,和,Javax,包层次内。,五、包,创建包,创建一个包是很简单的,只要包含一个,package,命令作为一个,Java,源文件的第一句就可以了,该文件中定义的任何类将属于指定的包。,package,语句定义了一个存储类的名字空间,如果省略,package,语句,类名被输入一个默认的没有名称的包。尽管默认包对于短例程序很好用,但对于实际的应用程序是不适当的,多数情况需要为自己的代码定义一个包。,下面是,package,声明的一般形式:,package,pkg,这里,pkg,为包名。,五、包,创建可复用类的步骤简要说明如下:,1.,定义一个,public,类。如果类不是,public,,它只能被同一包中的其他类使用。,2.,选择一个包名,并把,package,语句加到可复用的类的源代码文件中。,3.,编译这个类,把它放到适当的包目录结构中,以供编译器和解译器使用。,4.,把这个可复用的类导入到需要用它的程序中,现在就可以使用它了。,五、包,定位类,Java,编译器考虑的特定位置作为包层次的根被类路径控制。到目前为止,是在未命名的默认包中保存所有的类,可以通过在命令行键入类名编译源文件和运行,Java,解释器并得到结果,这是因为默认的当前工作目录,(.),通常在类路径环境变量中为,Java,运行时的默认定义。,然而当有包参与时事情就不这么简单,必须通过列举包层次来引用该类。引用包层次时用点号将包名隔开。,五、包,包的导入,既然包中的类必须包含它们的包名才能完全有效,为每个想用的包写一个长的逗点分离的包路径名是枯燥的,因此,Java,语言中引入,import,语句来引入特定的类甚至是整个包。包一旦被引入,类可以被直接引用。,import,语句对于程序员是很方便的,而且在技术上并不需要编写完整的,Java,程序。如果你在程序中将要引用若干个类,那么用,import,语句将会节省很多时间。,在,Java,源程序文件中,,import,语句紧接着,package,语句,(,如果,package,语句存在,),,它存在于任何类定义之前。,下面是,import,声明的一般形式,import pkgl.pkg2.(classname|*);,这里,,pkg1,是顶层包名,,pkg2,是在外部包中的用逗点,(.),隔离的下级包名。除非是文件系统的限制,不存在对于包层次深度的实际限制。最后要么指定一个清楚的类名,要么指定一个星号,(*),,该星号表明,Java,编译器应该引入整个包。,五、包,标记包作用域,包增加了访问控制的另一个维度,,Java,提供很多级别的保护以使在类、子类和包中有完善的访问控制。因为类和包的相互影响,,Java,将类成员的可见度分为四个种类:,相同包中的子类,相同包中的非子类,不同包中的子类,既不在相同包又不在相同子类中的类,三个访问控制符,,private,、,public,和,protected,,提供了多种方法来产生这些种类所需访问的多个级别。,五、包,比较项目,private,成员,默认的成员,protected,成员,public,成员,同一类中可见,是,是,是,是,同一个包中对子类可见,否,是,是,是,同一个包中对非子类可见,否,是,是,是,不同包中对子类可见,否,否,是,是,不同包中对子非类可见,否,否,否,是,五、包,Java API,包,为了简化面向对象的编程过程,,Java,语言事先设计并实现了一些体现了常用功能的标准类,如用于输入,/,输出的类,用于数学运算的类,用于图形用户界面设计的类,用于网络处理的类等。这些标准类根据实现功能的不同可以划分成不同的集合,每个集合是一个包,合称为类库。可以引用这些包,也可以创建自己的包。,要想掌握好,Java,的面向对象编程,编写出高质量的程序,必须对,Java,的类库有足够的了解。在清楚地掌握基本概念的基础上,开发者,Java,编程能力的强弱相当程度上取决于对,Java,类库的熟悉和掌握程度。从这个意义上来说,面向对象编程中的系统标准类和类库类似于面向过程编程中的库函数,都是一种应用程序编程接口,简称为,API(Application,Program Interface),,它是开发人员和编程人员所必须了解和掌握的。,Java,的类库是系统提供的已实现的标准类的集合,是,Java,编程的,API,,它可以帮助开发者方便、快捷地开发,Java,程序。,六、接口,接口的概念,接口的主要作用是可以帮助实现类似于类的多重继承的功能。,Java,出于简化程序结构的考虑,不再支持类间的多重继承而只支持单重继承,即一个类至多只能有一个直接父类。然而在解决实际问题的过程中,仅仅依靠单重继承在很多情况下都不能将问题的复杂性表述完整,还需要其他的机制作为辅助。,为了使,Java,程序的类层次结构更加合理,更符合实际问题的本质,编程者可以把用于完成特定功能的若干属性组成相对独立的属性集合。凡是需要实现这种特定功能的类都可以继承这个属性集合并在类内使用它,这种属性集合就是接口,利用接口,,Java,程序也可以实现类似于多重继承的网状层次结构。,需要指出的是,接口定义的仅仅是实现某一特定功能的一组功能的对外接口和规范,并没有真正实现这个功能。真正实现在继承这个接口的各个类中完成,因而通常把接口功能的继承称为实现。,六、接口,接口声明,关键字,interface,可以从类的实现中抽象一个类的接口,即使用,interface,可以指定一个类必须做什么,而不是规定它如何去做。接口在语句构成上与类相似,但是它们缺少实例变量,而且它们定义的方法是不含方法体的,这意味着可以定义不用假设它们怎样实现的接口。一旦接口被定义,任何类成员可以实现一个接口,而且一个类可以实现多个接口。,Java,中声明接口的语法如下:,public interface,接口名,extends,父接口名列表,/,接口体,;,/,常量域声明,public static final,域类型 域名,=,常量值,;,/,抽象方法声明,public abstract native,返回值 方法名,(,参数列表,)throw,异常列表,;,六、接口,接口体的声明是定义接口的重要部分,接口体由两部分组成,一部分是对接口中属性的声明,另一部分是对接口中方法的声明。其定义规则如下:,(1),接口中的属性都是用,final,修饰的常量,所有的成员函数都是抽象的,也就是说它们都只有说明没有定义。,(2),接口中的方法都是用,abstract,修饰的抽象方法,在接口中只能给出这些抽象方法的方法名、返回值和参数列表,而不能定义方法体,即仅仅规定了一组信息交换、传输和处理的接口。,六、接口,接口实现,接口的声明仅仅给出了抽象方法,相当于程序开发早期的一组协议,而具体地实现接口所规定的功能,则需某个类为接口中的抽象方法书写语句并定义实在的方法体,称为实现这个接口。,步骤和注意事项:,1.,在类的声明部分,用,implements,关键字声明该类将要实现哪些接口:,public class Point extends Object implements Shape,2.,如果实现某接口的类不是,abstract,的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表。,六、接口,3.,如果实现某接口的类是,abstract,的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类的任何一个非抽象的子类而言,它们的父类所实现的接口中的所有抽象方法都必须有实在的方法体,这些方法体可以来自抽象的父类,也可以来自子类自身,但是不允许存在未被实现的接口方法。这主要体现了非抽象类中不能存在抽象方法的原则。,4.,一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。如果所实现的方法与抽象方法有相同的方法名和不同的参数列表,则只是在重载一个新的方法,而不是实现已有的抽象方法。,5.,接口的抽象方法,其访问限制符都已指定是,public,,所以类在实现方法时必须显式地使用,public,修饰符,否则将被系统警告缩小了接口中定义的方法的访问控制范围。,小结,继承是面向对象程序设计方法中的一种重要手段,通过继承可以更有效地组织程序结构、并充分利用重用机制创建新类,以高效地完成复杂的设计和开发任务。,多态可以统一多个相关类对外的接口,并在运行时根据不同的情况执行不同的操作,可在很大程度上提高类的抽象程度和灵活性。,包是,Java,中类的一种组织管理方式,包中含有一系列相关的类,同一包中的类可直接互相调用,包外的类则有一定的访问限制。,接口声明了一组类的若干同名变量和方法,而不考虑方法的具体实现,其主要作用是用来实现类间的多重继承功能。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服