java基础知识点整合.docx

上传人:z**** 文档编号:60978295 上传时间:2022-11-19 格式:DOCX 页数:69 大小:43.94KB
返回 下载 相关 举报
java基础知识点整合.docx_第1页
第1页 / 共69页
java基础知识点整合.docx_第2页
第2页 / 共69页
点击查看更多>>
资源描述

《java基础知识点整合.docx》由会员分享,可在线阅读,更多相关《java基础知识点整合.docx(69页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、优质文本面向对象3.1 面向对象介绍1.什么是面向对象对象其实就是现实生活中的各种物体,他们有各种各样的功能,当我们需要借助这些物体去完成我们的需求时,我们就是在面向这些对象,使用它们其中的功能,至于他们其中的功能是如何实现的,我们无需知道,只要能完成需求即可.2.什么是面向对象编程(OOP):Object Oriented Programming 是一种编程思想, 使用对象去进行编程.它的特点有: 封装, 继承, 多态3.对象从哪来:对象是需要先用类来描述, 然后使用类来创立.类是对象的描述, 对象是类的实例.4.面向对象的优点 提高代码复用性. 使用者无需关心对象其中是如何实现的. 让程序

2、员从一个编写者转换成一个使用者. 更加符合人的思维能力,使编程更简单.3.2 定义类 1.成员变量在类中用变量来描述这一类对象公有的特征.2.成员函数在类中用函数来描述这一类对象公有的行为. 3.3 创立和使用对象1.怎么创立使用new 类名()形式创立一个对象2.怎么使用通过.语法来访问类的成员. 例如: Person p = new Person(); p.name = 张三; p.eat(); 3.4对象的初始化过程1.加载类类在第一次使用的时候被加载到内存中2.初始化成员变量当创立对象的时候, 成员变量会初始化为默认值, 根本数据类型都是0, 引用数据类型都是null 3.5对象的生命

3、周期1.开始new关键字创立对象的时候, 生命周期开始2.结束没有任何引用指向对象, 该对象成为垃圾, 被虚拟机回收3.6 匿名对象1.什么是匿名对象没有任何引用指向的对象, 就叫匿名对象2.匿名对象有什么特点匿名对象在创立之后立即被回收, 只能使用一次 3.7 封装 1.什么是封装封装就是将一类事物的特征和行为封装在一个类中, 定义成成员变量和成员函数创立对象之后, 这些成员函数可以访问自己的成员变量2.对成员变量的封装使用private关键字将成员变量私有化如果需要对外部提供访问方式, 写公有的get, set方法3.8 构造函数 1.什么是构造函数 构造函数是一个特殊的函数. 函数名必须

4、和类名一致. 没有返回值类型.(不等于void,不能写任何返回值). 可以写return,但是不能写return+值(尽量不要写). new关键字创立对象时自动调用 2.应用场景 如果我们希望一段代码在创立对象的时候执行, 就可以写在构造函数中 通常我们使用构造函数对成员变量进行赋值 3.构造函数和成员变量的执行顺序成员变量优先于构造函数先执行,因为通常使用构造函数都是对成员变量进行初始化,所以如果没有成员变量,构造函数是没有任何意义的. 4.构造函数的重载 和普通函数一样, 参数列表不同(类型不同,顺序不同,个数不同)即可. 重载只与参数列表有关 5.构造函数的调用 在创立对象时自动调用.在

5、构造函数的第一条语句可以使用this(被调用的构造函数的实际参数)的形式调用该类其他构造函数. 6.自动生成构造函数在一个类中构造函数是一定存在的.因为在一个类中如果没有写任何的构造函数, 编译时也会自动生成一个无参的构造函数, 里面什么代码都没有. 如果写了任何一个构造函数, 那么就不会有自动生成的了注意: 我们在类中只写了一个有参构造函数的时候, 这个类就不能使用无参的构造函数创立对象了 7.构造函数的访问权限通常构造函数的访问权限都是公有的, 因为构造函数就是为了让别人创立对象时调用的个别情况下在定义类时不希望外部创立对象, 这时可以使用private修饰构造函数, 例如: 单例设计模式

6、(Singleton) 3.9 成员代码块(构造代码块) 1.什么是成员代码块 在类中使用定义一段代码, 这段代码在创立对象的时候会自动运行 2.成员代码块和构造函数的区别 构造函数在创立对象的时候是N个选1个调用 而代码块是一定执行 构造函数可以传入参数 代码块不能传入参数 3.创立对象时内存中的工作顺序 在内存中查找指定的类, 如果没有就加载类, 有那么直接引用 在内存中开辟一块空间, 将成员变量初始化为默认值, 0和null 按照类代码从上到下的顺序, 执行代码块或者成员变量赋值 执行构造函数中的代码 4.在方法中也可以写代码块(方法代码块),但是不常用3.10成员变量和局部变量 1.成

7、员变量 在类中定义的变量,(Field),在整个类都可以访问(用于描述着一类事物的共有特征). 成员变量随着对象的建立而建立,存在于对象所在的堆内存中. 成员变量有默认初始值(0/false/null) 2.局部变量 在方法/语句中定义的变量(Local Variable), 存在于栈内存中. 作用范围一结束,变量的空间会自动释放. 局部变量是没有初始值的. 3.同名问题 在同一个作用域中成员变量不能重复, 局部变量也不能重复 但是成员变量和局部变量可以同名, 他们互相不冲突 4.访问问题在局部变量和成员变量同名的时候, 如果直接用变量名访问一个变量, 那么是先找局部变量, 如果不存在才找成员

8、变量 这时如果不想找局部变量, 直接找成员变量, 应该用this.变量名 3.11 this关键字 1.构造函数中 this(参数)形式可以在构造函数的第一条语句中调用其他的构造函数 this.成员名形式可以调用当前对象的成员 2.普通函数中 this用在普通的函数中, 可以代表调用当前函数的对象 哪个对象调用this所在的函数,this就代表那个对象.3.内部类中 可以使用 外部类名.this.成员 来访问外部类的成员. 3.12静态(static)变量1.什么是静态变量 用static修饰的成员变量就是静态变量(随着类的加载而加载) 优先于所有非静态成员及成员代码块.2.静态变量和普通变量

9、有什么不同 静态变量在类加载后就初始化, 不用创立对象可以直接使用. 静态变量被类的所有对象共享(在共享区), 通过一个对象改变, 所有对象都改变.静态变量可以使用类名.变量名形式访问, Java推荐使用这种方式, 而不是通过对象访问. 3.类在什么时候加载 类在第一次使用的时候加载 例如: 创立对象, 使用静态变量, 使用静态方法 定义变量的时候不加载类. 4.静态变量在什么时候使用 在定义一个类的时候, 如果希望这个类的所有对象共享一个数据时, 就可以使用静态成员变量.3.13静态(staitc)方法 1.什么是静态方法 用static修饰的方法就是静态方法 静态方法类加载后可以直接运行

10、可以使用类名.方法名调用 2.什么时候使用静态方法 如果一个方法没有访问任何外部的非静态成员, 那么就可以定义为static. 这样在调用的时候不用创立对象即可使用, 给人提供方便, 并且效率更高. 3. 静态方法使用的考前须知 1. 静态方法不能直接访问方法外非静态成员.因为静态方法是随着类的加载而加载 的,而非静态成员只有在对象创立才会加载.因此,当静态方法访问方法外非静态成 员,对象不一定被创立,所以不能直接访问,除非在静态方法中创立本类对象,才可以 访问,方法外静态成员. 2. 与静态方法不能直接访问方法外非静态成员相反,非静态方法是可以访问静态成 员的,因为,对象被创立了,这个类一定

11、被加载到内存中,所以可以访问. 3. 因为静态优先于对象存在,所以在静态方法中是不能出现 this,super这两个关键 字,道理很简单,静态被加载时还没有对象,而这两个关键字都和对象有关,所以不能 使用. 4. 静态的利与弊 静态好处: 1. 如果一个类里的某一个成员变量,他的所有需要共同使用它,没必要每一 个 对象都存储一份,可以将成员变量设为static,系统将进行单独空间(方法区/静态区) 存储,节省内存空间. 2. 静态的成员可以直接被类名调用,使用简单. 静态弊端: 1. 因为静态是随着类加载而加载的的,所以其生命周期是和类同存亡的.所以生命 周期很长,比拟浪费内存空间. 2. 因

12、为静态只能访问静态,所以访问有一定的局限性. 3. 因为主函数是静态的,所以用主函数调用的方法再不创立对象的情况下,只能都 是静态的.3.14静态代码块 1. 什么是静态代码块 用static修饰的代码块 类加载后直接运行, 只能执行一次(因为类只会加载一次),如果在一个类中有主函 数,他是优先于主函数运行的. 不能访问外部非静态成员 2. 什么时候用静态代码块 在定义一个类的时候, 如果希望某一段代码在别人使用这个类的时候就执行, 那么 就可以写在静态代码块中.用于给类初始化.3.15单例设计模式 设计模式:解决某一类问题最行之有效的方法. 单例设计模式:让一个类只能创立一个对象. 懒汉式和

13、饿汉式 饿汉式步骤: 1.私有化构造函数. 2.创立一个对象,并私有(防止类外改变对象内部内容). 3.创立一个公有的,静态的方法,返回本类对象,使类外获取本类对象. 懒汉式步骤: 1.私有化构造函数. 2.创立一个对象引用,并私有(防止类外改变对象内部内容). 3.创立一个公有的,静态的方法,判断是否创立了一个对象如果创立了,返回本类对象, 如果没有创立,创立一个对象返回,使类外获取本类对象.3.16继承 1.什么是继承 定义一个类, 使用extends关键字可以继承另一个类, 得到父类的所有非私有属性 和方法. 2.继承的特点 Java只支持单继承, 不支持多继承, 但可以多重继承. 一个

14、父类可以有多个子类, 但一个子类只有一个父类. 3.java改进多继承的原因? 提高代码的平安性,如果一个子类继承多个父类,而这多个父类中有同名的方法,子 类要去访问的话,就不知道要访问哪一个方法了.降低了平安性. 4.子类对象创立的过程 子类对象之所以能调用父类的方法, 是因为在创立子类对象的时候, 其内部创立了 一个父类对象. 在new一个对象时,会先去子类构造函数,中寻找super()(如果没有显示指定父类构 造函数)然后创立父类,然后再回到子类中创立对象. 调用子类的方法时, 虚拟时机先在子类中查找是否包含该方法, 如果没有那么找父 类. 在调用子类构造函数的时候, 一定会使用supe

15、r(参数)形式调用父类构造函数创立 父类对象.子类中必须要有一个构造函数含有super调用父类构造函数. super和this类似, 都是必须在构造函数的第一条语句使用 如果构造函数写了this, 那么那么不能写super, 反之亦然 如果没写this也没写super, 默认会自动调用父类无参的构造函数 5.方法覆盖(重写) 覆盖可以让子类将从父类继承来的方法进行扩展,提高代码复用性,减少冗余. 覆盖时子父类的方法名子必须相同, 包括返回值,参数列表,并且子类的权限必须大 于或等于父类.只能覆盖非私有方法. 6.重载Overload和重写Override的区别: 重载:名字相同,参数列表不同

16、只与参数列表相同. 重写:子父类的方法名子必须相同, 包括返回值,参数列表,子类的权限必须大于或等 于父类.(如果父类返回值是一个类,子类返回值可以是和父类相同的类或其子类). 7.向上转型 子类可以当作父类使用, 因为父类的功能子类都有Fu f = new Zi(); 如果一个方法要求传入一个父类类型对象, 我们也可以传入一个子类对象 8.强制类型转换 在子类当作父类来用时, 不能调用子类特有的成员. 如果一定要调用, 需要把父类类型强转回子类类型. 这种转换叫强制类型转换, 在编译时不管类型是否匹配都不会报错, 为了程序平安, 通常在转换之前使用instanceof进行判断.3.17 Ob

17、ject类及其中常用方法 1.什么是Object类 Object类是Java中所有类的父类, 如果定义一个类不继承任何类, 默认继承Object Object类中的方法会被所有的类继承 2.finalize 任何对象在成为垃圾被销毁之前, 都会调用finalize方法 Object类中的finalize方法是空的, 什么都没有 当我们希望在对象被销毁之前执行一段代码, 就可以在类中重写finalize方法, 把 要执行的代码写在方法中. 3.toString toString方法可以将一个对象转为字符串表示形式 Object类中的toString方法返回的是类名内存地址 当我们希望调用toSt

18、ring时返回成员变量的值, 就可以重写该方法 调用System.out.println()方法时会自动打印对象toString的返回值 4.equals equals方法是用来比拟两个对象的 Object类中equals方法默认比拟的是对象的地址 如果我们希望比拟两个对象的属性, 那么可以重写equals方法, 在方法内比拟所有 的属性 在比拟字符串时如果希望比拟两个字符串的内容, 就需要使用equals, String类是重 写了equals的3.18 组合设计模式 1.什么是组合设计模式 在我们定义一个类的时, 如果需要使用另外一个类的方法, 就可以用组合设计模 式. 2.组合设计模式的

19、写法 在类中定义一个被组合类型的成员变量 通过构造函数组合一个对象, 用成员变量引用 在方法中使用成员变量调用被组合对象的方法 3.组合设计模式和继承的区别 不占用继承的位置, 当前类组合一个类之后还能继承其他类 组合设计模式组合的类不能当作被组合的类使用3.19 多态 1.多态的表达 父类引用指向子类对象.(父类的引用可以接受自己的子类). 2.多态的前提 类与类之间必须有关系,要么继承,要么实现. 子类与父类存在覆盖,因为在不强转的情况下,父类,不能访问子类特有的方法. 3.多态的好处 提高代码扩展性. 4多态的弊端 虽然提高了扩展性,但是只能使用父类父类引用访问父类成员(共有成员), 为

20、了能访问子类特有方法,父类的引用必须转成子类类型(向下转型).3.20 抽象 1.什么是抽象类 用abstract修饰的类就是抽象类, 抽象类中可以定义抽象方法 2.什么是抽象方法 用abstract修饰的方法就是抽象方法, 抽象方法在子类中必须全部重写 3.什么时候用抽象类和抽象方法 在我们定义类的时候, 如果多个类有相同的方法, 那么就应该把这些方法抽取到父 类中定义 完全相同的方法直接在父类中定义并实现, 如果只有方法签名(无方法体)一样而实 现不同, 那么就可以在父类中定义抽象方法 这样别人看到父类的时候就知道子类都有什么功能了, 方便他人阅读我们的代码, 也更好的支持了多态. 4.抽

21、象类细节 有抽象方法的类必须声明为抽象类, 抽象类可以没有抽象方法 抽象类不能创立对象 子类继承抽象类时必须重写所有的抽象方法3.21 final修饰符 1. final代表最终的, 可以用来修饰类, 方法, 变量. 2. 被final修饰后的特点 final的类不能被继承 final的方法不能被重写 final的变量只能赋值一次,在程序运行结束前,会一直存在与内存中. 如果内部类在局部位置上,只能访问该局部中被final修饰的变量. 被final修饰的形参,第一次赋值是在调用它所在的函数时,不能再次赋值了. 被final修饰的引用类型变量,不能在指向其他对象,但是他第一次指向的对象中的 内容

22、是可以改变的.final只是修饰了引用. public static final 修饰的变量时全局变量,可以使用类名调用,名字全部大写3.22模板设计模式 1.什么是模板设计模式 在编程的过程当中, 如果经常要做一些类似的事, 其中某些步骤相同, 有些步骤不 同, 这是就可以使用模板设计模式 2.怎么使用模板设计模式 定义一个抽象类 定义一个final的方法 在方法中写出每次相同的步骤, 不同的步骤写成抽象方法, 调用抽象方法 每次实现不同的步骤时, 定义子类继承抽象类, 重写抽象方法即可, 相同的步骤无 需重写直接调用final方法3.23接口 1.什么是接口 接口是一种特殊的抽象类 2.接

23、口和抽象类的区别 抽象类用abstract class定义, 接口用interface定义 抽象类中可以有不抽象的方法, 接口中所有方法都是抽象的 抽象类用extends继承, 接口用implements实现 抽象类可以继承抽象类, 接口可以继承接口 抽象可以继承接口,接口不能继承抽象 因为抽象类里面有可能会有非抽象方法. 抽象类中的方法没有默认修饰符, 接口中的方法默认是public abstract修饰的 抽象类中的成员变量没有默认修饰符, 接口中的成员变量默认是public static final 修饰的 一个类只能继承一个抽象类, 一个类可以实现多个接口 3.什么时候用抽象类, 什么

24、时候用接口 能用接口的时候就不用抽象类(没有任何不抽象的方法), 因为接口不占用继承位置 如果需要定义不抽象的方法, 那么就必须使用抽象类.3.24 策略设计模式定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。使得算法可独立于使用它的客户而变化。步骤:1.定义一个过滤器接口,定义一个抽象方法,用于不同方法的扩展2.根据不同用户的需要,实现接口方法.3.将接口作为参数,传入调用它的方法.3.25 内部类 一 类中的内部类 1.什么是类中的内部类 在类级别下定义一个类, 这就是类中的内部类 内部类也是外部类的一个成员 内部类必须先创立外部类对象才能创立对象. 语法: new 外部类(

25、).new 内部类(); 2.内部访问外部类的成员 内部类中可以访问外部类的成员, 使用外部类名.this.成员名形式 外部类名.this就代表调用当前方法的对象的外部类对象 3.注意 外部类不能访问内部类成员 内部类的.class文件名是带$的 4.什么时候使用内部类 在定义一个类的时候, 如果需要定义另一个类, 而且这个类需要访问当前类的 私有成员, 那么这个新的类就可以定义为内部类. 二.静态内部类 1.什么是静态内部类 使用static修饰的类中内部类 不用创立外部类对象, 直接创立对象. 语法: new 外部类.内部类() 2.静态内部类的特点 可以定义静态成员 不能使用外部类.th

26、is 不能访问外部非静态成员 3.什么时候使用静态内部类 如果定义一个内部类时, 不需要访问外部非静态成员, 就可以定义为静态内部 类 如果内部类中需要定义静态成员, 只能定义为静态内部类 三.方法中的内部类 1.什么是方法中的内部类 在一个方法中定义的类就是方法中的内部类 方法中的内部类只能在当前方法中使用 2.方法中内部类的特点 使用方法中内部类和普通的类中内部类相同 都可以通过外部类名.this.成员名访问外部类成员 3.什么时候使用方法中的内部类 如果一个类只在某个方法中使用, 就可以定义为方法中的内部类 4.访问局部变量的问题 方法中内部类如果要访问一个方法中的局部变量, 这个变量必

27、须是final的 四.匿名内部类 1.什么是匿名内部类 匿名内部类是方法中内部类的一种 如果一个类只使用一次, 那么就可以定义为匿名内部类 2.定义方式 new 父类名() 类定义 这样做是声明一个指定类的子类, 然后用这个子类创立一个对象4.1何为多线程 有多条执行路径的程序,就是多线程程序.(如:迅雷,暴风影音)有多条执行路径的进程,就是多线程进程.4.2进程与线程 线程:就是进程中的一个控制单元,一条执行路径,线程控制着进程的执行,每个进程里 至少有一条线程.进程:是一个正在执行的程序,每个进程都有一个执行顺序,该顺序是一个执行路径,或 者叫控制单元.其实进程就是一个应用程序运行时的内存

28、分配空间.4.3 JVM中的线程分配 在JVM启动时会有一个进程java.exe.该进程中至少有一个线程负责Java程序的运行, 而且这个线程运行的代码都存在于main函数中,这条线程被称为主线程.一般情况 下,JVM在启动时,就只有一个线程.(其实JVM在启动时,不只有一个线程,因为在主线程 中的代码有可能会产生垃圾需要垃圾回收,如果全部都由主线程来完成,效率会极低,因 此还会有一个线程,来专门负责进行垃圾回收.)4.4线程的随机性因为一个单核cpu的快速切换导致,同一个时间里只有一个线程在运行.因此哪个线程 获取到了cpu执行权,哪个线程就执行.4.5自定义创立线程 创立线程有两种方式:继

29、承方式和实现方式.继承方式:创立一个类,继承Thread,由子类覆写run方法.具体步骤:1.自定义类,继承Thread类.2.继承Thread类的目的就是要覆写其run方法,因为想要让一段代码单独运行,就 需要将这段代码放到run方法中.所以要覆写run方法,然后将需要新线程运行的 代码写在run方法中.3.创立自定义类的对象,成为新的线程对象.4.调用新的线程对象的start方法,开启线程,并执行run方法中的代码.(start方法有开启线程和调用run方法两个作用.)实现方式:自定义一个类,实现Runnable接口,覆写run方法,创立Thread类对象,将实 现Runnable接口的自

30、定义类作为参数传到Thread对象.具体步骤:1 定义类实现Runnable接口。2 覆盖接口中的run方法用于封装线程要运行的代码。3 通过Thread类创立线程对象;4 将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函 数。(因为要让线程对象明确要运行的run方法所属的对象。所以要将实现 Runnable接口的自定义类对象作为参数传递给Thread类.5 调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run 方法.通常我们都使用实现方式,因为Java只支持单继承,所以如果一个类已经继承别的父 类,而它其中的代码有需要多线程

31、,就有了局限性,所以可以使用实现法来防止单继承的 局限性.4.6线程状态:被创立:start()运行:具备执行资格,同时具备执行权;冻结:sleep(time),wait()notify()唤醒;线程释放了执行权,同时释放执行资格;临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权;消亡:run方法运行结束.4.7多线程平安问题及解决方案当多条语句在操作同一线程共享数据时,一个线程对多条语句只执行了一局部还没执行 完,另一个线程就参与进来执行,导致共享数据的错误.如何解决?只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不 能进来执行就可以解决这个问题。如何进

32、行多句操作共享数据代码的封装呢?java中提供了一个解决方式:就是同步代码块。格式:synchronized(对象) / 任意对象都可以。这个对象就是锁。需要被同步的代码;同步的出现:好处:解决了线程平安问题。弊端:相对降低性能。因为判断锁需要消耗资源。产生了死锁。定义同步是有前提的:1,必须要有两个或者两个以上的线程,才需要同步。2,多个线程必须保证使用的是同一个锁。同步的第二种表现形式:同步函数:其实就是将同步关键字定义在函数上,让函数具备了同步性。同步函数是用的哪个锁呢?通过验证,函数都有自己所属的对象this,所以同步函数所使用的锁就是this锁。当同步函数被static修饰时,这时的

33、同步用的是哪个锁呢?静态函数在加载时所属于类,这时有可能还没有该类产生的对象,但是该类的字节码文 件加载进内存就已经被封装成了对象,这个对象就是该类的字节码文件对象。所以静态加载时,只有一个对象存在,那么静态同步函数就使用的这个对象。这个对象就是 类名.class同步代码块和同步函数的区别?同步代码块使用的锁可以是任意对象。同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。在一个类中只有一个同步,可以使用同步函数。如果有多同步,必须使用同步代码块, 来确定不同的锁。所以同步代码块相对灵活一些。4.8线程间通信多个线程在操作同一个资源,但是操作的动作却不一样。1:将资源封装成对

34、象。2:将线程执行的任务(任务其实就是run方法。)也封装成对象。等待唤醒机制:涉及的方法:wait:将同步中的线程处于冻结状态。释放了执行权,释放了资格。同时将线程对 象存储到线程池中。notify:唤醒线程池中某一个等待线程。notifyAll:唤醒的是线程池中的所有线程。注意:1:这些方法都需要定义在同步中。2:因为这些方法必须要标示所属的锁。你要知道 A锁上的线程被wait了,那这个线程就相当于处于A锁的线程池中, 只能A锁的notify唤醒。3:这三个方法都定义在Object类中。为什么操作线程的方法定义在Object类中?因为这三个方法都需要定义同步内,并标示所属的同步锁,既然被锁调用,而锁 又可以是任意对象,那么能被任意对象调用的方法一定定义在Object类中。wait和sleep区别:分析这两个方法:从执行权和锁上来分析:wait:可以指定时间也可以不指定时间。不指定时间,只能由对应的notify或者 notifyAll来唤醒。sleep:必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。wait:线程会释放执行权,而且线程会释放锁。Sleep:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁