面向对象oop

    技术2022-07-10  113

    这里写目录标题

    什么是类,什么是对象方法的签名引用类型数组继承向上造型.方法的重写修饰词常量.抽象方法.抽象类抽象方法:抽象类 成员内部类接口多态内存管理

    什么是类,什么是对象

    什么是类? 什么是对象?

    现实生活中是由很多很多的对象组成的,基于对象抽出类对象: 软件中真实存在的单个个体/东西 类: 模子、类型/类别,代表一类个体类是对象的模板,对象是类的具体的实例类中包含: 4.1) 对象所共有的属性/特征(数据)-----------------成员变量 4.2) 对象所共有的行为(动作)----------------------方法一个类可以创建多个对象 如何创建类? 如何创建对象? 如何访问成员?创建类: class 类名 { 成员变量、方法 }创建对象: 类名 变量(引用) = new 类名();如何访问成员: 引用.成员变量名 = 值; 引用.方法名(有参传参);

    方法的签名

    1.方法名+参数列表 2.方法的重载(overload) 2.1).发生在同一类中,方法名相同,参数列表不同,方法体不同 2.2).编译器在编译时会根据方法的签名自动绑定调用的方法 3.构造方法: 3.1).给成员变量赋值 3.2).与类同名,没有返回值类型(连void都没有) 3.3).在创建(new)对象时被自动调用 3.4).若自己没有写构造方法,则编译期默认一个无参构造,若自己写了,则不再默认提供 3.5).构造方法可以重载 this:指代当前对象,那个对象调用方法它指的就是哪个对象只能用在方法中,方法中访问成员变量之前默认有个this. 4. this的用法: 4.1) this.成员变量名-------------访问成员变量(当成员变量与局部变量同名时,this不能省略) 4.2) this.方法名()----------------调用方法(一般都省略this) 4.3) this()-----------------------调用构造方法 5. 内存管理: 由JVM来管理的----------面向对象第10天详细讲解

    堆: 所有new出来的对象(包括成员变量)栈: 局部变量(包括方法的参数)方法区: .class字节码文件(包括方法)-----面向对象第5天才说 null: 表示空,没有指向任何对象 若引用的值为null,则该引用不能再进行任何操作了, 若操作则发生NullPointerException空指针异常

    引用类型数组

    1) Student[ ] stus = new Student[3]; //创建Student数组对象 stus[0] = new Student(“zs”, 25, “LF”); //创建Student对象 stus[1] = new Student(“ls”, 26, “JMS”); stus[2] = new Student(“ww”, 28, “SD”); System.out.println(stus[0].name); //输出第一个学生的名字 stus[1].age = 35; //给第二个学生的年龄赋值为35 stus[2].sayHi(); //第三个学生跟大家问好 2) Student[ ] stus = new Student[ ]{ new Student(“zs”, 25, “LF”), new Student(“ls”, 26, “JMS”), new Student(“ww”, 28, “SD”) };

    继承

    1.作用:代码复用 2.通过extends来实现继承 3.超类/父类:派生类所共有的属性和行为 派生类/子类:派生类所特有的属性和行为 4.派生类继承超类后,派生类具有:派生类+超类的 5.一个超类可以有多个派生类,一个派生类只能让有一个超类-----单一继承 6.继承具有传递性 7.Java规定:在 在构造派生类之前必须先构造超类 ----在派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法 ----在派生类的构造方法中若调用了超类的构造方法,则不再默认提供 注意: super()调用超类构造方法必须位于派生类构造方法的第一行 super: 指代当前对象的超类对象. super的用法:

    super.成员变量名--------------访问超类的成员变量super.方法名()-----------------调用超类的方法------------明天下午重写时候讲super()-----------------------调用超类的构造方法

    向上造型.方法的重写

    1.1).超类型的引用指向派生类的对象 1.2)能点出什么,看引用的类型 2.方法的重写(override): 重新写.覆盖------当派生类中觉得超类的行为不能满足派生类的需求时,需要重写 2.1) 发生在父子类中,方法名相同,参数列表相同,方法体不同 2.2) 重写方法被调用时,看对象的类型--------这是规定 3) 重写要遵循 “两同两小一大”原则:—虽然可以两同量小一大,但一般都是一模一样的----了解 3.1) 两同: 3.1.1) 方法名相同 3.1.2) 参数列表相同 3.2) 两小: 3.2.1) 派生类方法的返回值类型小于或等于超类方法的

    void时,必须相等基本类型时,必须相等引用类型时,小于或等于 3.2.2) 派生类方法抛出的异常小于或等于超类方法的-------- 3.3) 一大: 3.3.1) 派生类方法的访问权限大于或等于超类方法的--------- 重写与重载的区别:-----------------常见面试题(只答1.1和2.1即可)重写(override): 1.1) 发生在父子类中,方法名相同,参数列表相同,方法体不同 1.2) 遵循 “运行期绑定”,看对象类型来调用方法重载(overload): 2.1) 发生在一个类中,方法名相同,参数列表不同,方法体不同 2.2) 遵循 “编译期绑定”,看参数/引用类型来绑定方法

    修饰词

    package:

    作用: 避免类名的冲突类的全称: 包名.类名 包名有层次结构同包中的类名不能同名,不同包中的类可以同名建议: 包名所有字母都小写 import:同包中的类可以直接访问 不同包中的类不能直接访问,若想访问: 1.1) 先import声明类,再访问类--------建议 1.2) 类的全程-------------------------太繁琐,不建议 访问控制修饰符:public: 公开的,任何类------------------------------行为(方法)公开化(public)private: 私有的,本类-------------------------------数据(成员变量)私有化(private)protected: 受保护的,本类、派生类、同包类-----------超类的成员变量设计为受保护的默认的: 什么也不写,本类、同包类--------------------java不建议默认权限 说明:类的访问修饰符只能是public或默认的类中成员的访问修饰符如上4种都可以 final: 最终的、不可改变的--------单独应用率低修饰变量: 变量不能被改变修饰方法: 方法不能被重写修饰类: 类不能被继承 static: 静态的静态变量: 1.1) 由static修饰 1.2) 属于类,存储在方法区中,只有一份 1.3) 常常通过类名点来访问 1.4) 何时用: 所有对象所共享的数据(图片、音频、视频等)静态方法: 2.1) 由static修饰 2.2) 属于类,存储在方法区中,只有一份 2.3) 常常通过类名点来访问 2.4) 静态方法没有隐式的this传递,所以静态方法中不能直接访问实例成员 2.5) 何时用: 方法的操作与对象无关静态块: 3.1) 由static修饰 3.2) 属于类,在类被加载期间自动执行,因每个类只被加载一次,所以静态块只执行一次–发生的时期最早 3.3) 何时用: 加载/初始化静态资源(图片、音频、视频等)

    常量.抽象方法.抽象类

    static final常量: 1).必须声明同时初始化 2).通过类名点来访问 3).建议:常量名所有字母都大写,多个单词用_分隔 4).编译器在编译时将常量直接替换为具体的值 5).何时用:数据永远不变,并且经常使用

    抽象方法:

    1).由abstract修饰 2).只有方法的定义,没有具体的实例(连{ }都没有)

    抽象类

    1).由abstract修饰 2).包含抽象方法的类必须是抽象类 3).抽象类不能被实例化(即:不能被new对象) 4).抽象类是需要被继承的-----派生类 4.1)重写抽象类中所有抽象方法------变不完整为完整 4.2).也声明为抽象类-------一般不这样做 5).抽象类的意义: 5.1)封装派生类所共有的属性和行为-----------代码复用 5.2).为所有派生类提供统一的类型----------向上造型(代码复用) 5.3).可以包含抽象方法,为所有派生类提供统一的入口(造型之后通过超类引用能点出来) 派生类的具体实现不同,但入口是一致的(真正调用的还是派生类重写之后的

    成员内部类

    1.成员内部类: 应用率低,了解 1)类中套类,外面的类称为Outer外部类,里面的称为Inner内部类 2)内部类通常只服务于外部类,对外不具备可见性 3)内部类对象通常只在外部类中创建 4)内部类中可以直接访问外部类的成员(包括私有的) 内部类中有个隐式的引用指向了创建它的外部类对象 eg: 外部类名.this. 2.匿名内部类: 简化代码,掌握 1)若想创建一个类(派生类)的对象,并且对象只被创建一次, 此时该类不必命名,称为匿名内部类 2)若想访问外面的变量,该变量必须是final的(JDK1.7(包括)以前必须的) 3)面试题: 问:内部类有独立的.class吗? 答:有

    接口

    1.接口: 1).是一种引用数据类型 2).由interface定义 3).只能包含常量和抽象方法 4).接口不能被实例化 5).接口是需要被实现/继承的,实现类/派生类:必须重写所有抽象方法 6).一个类可以实现多个接口,用逗号分隔,若又继承又实现,应当先继承后实现 7).接口可以继承接口

    多态

    1.多态: 1)意义: 1.1)同一类型的引用,在指向不同的对象时,有不同的实现 ----行为的多态:cut()、step()、getImage()… ----说明: 所有抽象方法都是多态的 1.2)同一个对象,被造型为不同的类型时,有不同的功能 ----对象的多态:水、我… ----说明: 所有对象都是多态的 2)向上造型/自动类型转换: 2.1)超类型的引用指向派生类的对象 2.2)能造型成为的类型有: 超类+所实现的接口 2.3)能点出来什么,看引用的类型 3)强制类型转换,成功的条件只有如下两种: 3.1)引用所指向的对象,就是该类型 3.2)引用所指向的对象,实现了该接口或继承了该类 4)强转时若不符合如上两种情况,则发生ClassCastException类型转换异常 建议: 强转之前先通过instanceof来判断引用所指向的对象是否是该类型

    内存管理

    1.内存管理:由JVM管理 1)堆: 1.1)存储new出来的对象(包括实例变量) 1.2)垃圾:没有任何引用所指向的对象 垃圾回收器(GC)不定时到内存中回收垃圾对象,回收过程是透明的(看不到的), 不一定发现垃圾就立刻回收,通过调用System.gc()可以建议JVM尽快调度GC来回收 1.3)内存泄漏:不再使用的内存没有被及时的回收,严重的泄漏会导致系统的崩溃 建议:对象不再使用时要及时的将引用设置为null 1.4)实例变量的生命周期: 创建(new)对象时存储在堆中,对象被回收时一并被回收 2)栈: 2.1)存储正在调用的方法中的所有局部变量(包括方法的参数) 2.2)调用方法时会在栈中为该方法分配一块对应的栈帧, 栈帧中存储方法中的局部变量(包括参数), 方法调用结束时,栈帧自动被清除,局部变量(包括参数)一并被清除 2.3)局部变量的生命周期: 调用方法时存储在栈中,方法调用结束时与栈帧一并被清除 3)方法区: 3.1)存储.class字节码文件(包括静态变量、方法) 3.2)方法只有一份,通过this来区分具体的调用对象

    面向对象三大特征:-----------常见面试题(你对面向对象的理解?) 1.封装: 1)类:封装的是对象的属性和行为 2)方法:封装的是具体的业务逻辑功能实现 3)访问控制修饰符:封装的是具体的访问权限 2.继承: 1)作用:代码复用 2)超类:所有派生类所共有的属性和行为 接口:部分派生类所共有的属性和行为 派生类:派生类所特有的属性和行为 3)特点:单一继承、多接口实现,具有传递性 3.多态: 1)行为的多态:所有抽象方法都是多态的 对象的多态:所有对象都是多态的 2)向上造型、强制类型转换、instanceof判断 3)多态的表现形式: 方法的重写

    Processed: 0.048, SQL: 9