A

Arya

V1

2022/08/31阅读:13主题:Obsidian

【查漏补缺】面向对象总结

封装继承

一、复习 this关键字 a、this代表的是当前对象,也就是说,你调用方法的时候是哪个对象, this就是哪个对象,在构造函数里面的this代表新建的这个对象; b、this可以访问属性、方法和构造函数﹔ c、this访问属性和方法是直接写this.XXX就可以完成访问 d、this访问构造函数是写this(),然后根据括号里面的参数来自动匹配它调哪个构造函数;e、static方法里面不能用this关键字; static关键字 a、理解什么是static以及static的特性 static是一个修饰词,它可以用来修饰属性、方法、代码块以及类 static是一个类资源,它跟字节码文件一起被加载到方法区里,只不过它是被加载到方法区中的静态池里面, static修饰的资源和字节码对象一样,只存在一份,并且也是懒加载;

二、讲图书和坐标案例 三、讲类与对象练习题 四、package 五、静态剩下的知识 (一)、代码块 1.静态代码块和构造代码块(非静态代码块) 2.执行顺序:静态代码块-构造代码块(普通代码块/代码块)-无参构造方法-有参构造方法

!! 代码块只执行一次 静态代码块每调用就执行一次

3.作用:可以让我们在new对象(属性初始化)的时候,开始执行逻辑,不需要额外调用方法。每new一次就调用一次。 六、一些额外的知识点 (一)、代码模式 (二)、设计模式3~5个(有利于理解框架) 1.大话设计模式 (1)高内聚低耦合 (2)单例模式 ①特点和作用,写法 ②饿汉式 ③懒汉式 Imgur

七、封装 (一)访问权限修饰符 Imgur

  • 访问权限控制符不能修饰局部变量 (二)JavaBean规范 1、什么是JavaBean规范 就是一种针对实体类的书写方式的规约,我们都按照该规约来进行书写实体类,方便进行团队合作,减少书写过程中的误差; 2、什么是实体类 在实际开发过程中,我们会在项目中构建很多种类,那么把这类类粗略的进行一个划分: a、实体类(entity、pojo):用来跟数据库中的表进行一一对应的类,该类的作用就是用来保存表里面的一条条的数据;比如说,Book、Person、User类等等;像这种在生活中是存在对应的实体对象的,我们就称之为实体类; b、数据库操作类(dao->DataBase Access 0bject):这个类是专门用来Java代码来读数据库的数据或者是写入数据到数据库又或者是对数据库进行查询和更改操作的;这种类,我们在命名的时候,往往会在后面加个dao,或者是加daoImp; c、服务类(service):这个类是用来进行非数据库的业务逻辑操作的,这种类的命名就是直接在后面加Service或者是加ServiceImp; d、控制类(Controller):这种类是用来连接前端和后台的 3、javabean规范的要求 a、必须要有包 b、属性私有化 c、提供get. set方法d、提供无参构造器 e、实现序列化接口-->TO流

八、继承


  • 继承的作用 1、继承的出现提高了代码的复用性,提高软件开发效率。 2、继承的出现让类与类之间产生了关系,提供了多态的前提。
  • extends和implement extends是继承某个类 implements是实现多个接口(可以用接口来实现多线程)

  • 成员变量:private int age;
  • 局部变量:构造方法和语句块中定义的变量
  • 成员方法:例如get,set方法
  • 全局方法:加了static的成员方法
  • java没有局部方法,只有局部内部类

!! 1.和局部变量一样,不能使用访问控制修饰符,和static。 2.局部内部类可以访问外部类的所有成员 3. 局部内部类中不能存在任何的静态变量和静态方法。

#构造方法

  • 构造函数就是构造方法也叫构造器
  • 高内聚低耦合 降低耦合度的方法 1、少使用类的继承,多用接口隐藏实现的细节。 Java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的。 2、模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。(其实这是高内聚的一种说法,高内聚低耦合一般同时出现)。 3、遵循一个定义只在一个地方出现。 4、少使用全局变量。 5、类属性和方法的声明少用public,多用private关键字。 6、多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。 7、尽量不用“硬编码”的方式写程序,同时也尽量避免直接用SQL语句操作数据库。 8、最后当然就是避免直接操作或调用其它模块或类(内容耦合);如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合。 增强内聚度方法 1、模块只对外暴露最小限度的接口,形成最低的依赖关系。 2、只要对外接口不变,模块内部的修改,就不得影响其他模块。 3、删除一个模块,应当只影响有依赖关系的其他模块,而不应该影响其他无关部分。
  • 一个源文件可以有多个主类,有公共类时,文件命名必须与公共类保持一致。

多态

8.26

一、复习 二、作业题(学生演示) 三、重写 四、动态绑定和静态绑定 (一)、动态跟对象,静态跟类型 (二)、静态方法不存在重写 1.静态:static,private,构造方法,final 2.动态: 五、super (一)super和this的区别 六、画内存图 七、怪物继承练习题 八、final 九、Object类 十、布置作业

8.27

一、equals的使用 (1)Java中的两种等于判断 (2)Object类中的equal (3)equals方法的重写步骤 二、自定义数据类型和instanceof关键字 三、多态 (1)需要满足的条件 1.父类指向子类 2.子类重写父类方法 (2)多态的注意事项


多态的含义和作用 多态的必要条件: 1、 继承是多态的前提 2、 子类重写父类方法 3、 父类引用指向子类对象-->等号左边是父类,等号右边是子类对象 向上转型:父类引用指向子类对象,属于自动类型转换。 格式:父类类型 变量名 =  子类对象; 向下转型:子类引用指向父类对象,属于强制类型转换。 格式:子类类型 变量名 = (子类类型)父类对象;

注意事项:

  • 使用多态的时候,无法调用子类独有的属性
  • 如果想使用子类独有的属性和方法,需要进行强转 instanceof关键字
  • 该关键字用来判断一个对象是否是指定类的对象。

#equals和== #hashcode “== ”:作用是判断两个对象的地址是否相等,即,判断两个对象是不是同一个对象,如果是基本数据类型,则比较的是值是否相等。

"equal":作用是判断两个对象是否相等,但一般有两种使用情况

1.类没有覆盖equals()方法,则相当于通过“ == ”比较 2.类覆盖equals()方法,一般,我们都通过equals()方法来比较两个对象的内容是否相等,相等则返回true,如String 这里对equals重新需要注意五点:

  1. 自反性:对任意引用值X,x.equals(x)的返回值一定为true.
  2. 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
  3. 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
  4. 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
  5. 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了; 如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

在线改卷系统--组卷 从这个练习可以学到什么? 巩固多态和继承的知识


复习

  • Object的两个模板方法
  • hashcode方法
    • equals和hashcode
    • == 和equals和hashcode
  • 多态
    • 需要的条件
    • 使用场合
    • 注意事项
  • 两种转换方式
  • 强转会碰到的问题

成员变量和局部变量的区别:

①定义的位置不同

  • 成员变量定义在类中,整个类中的成员方法都可以访问;
  • 局部变量定义在函数或代码块中,只在所属的区域有效。

②在内存中的位置不同

  • 成员变量存在于堆内存的对象中; 局部变量存在于栈内存的方法中。

③:生命周期不同

  • 成员变量随着对象的创建而存在,随着对象的消失而消失;
  • 局部变量随着所属区域的执行而存在,随着所属区域的消失而释放。

④初始化不同

  • 成员变量有默认初始值;
  • 局部变量没有默认初始值。

⑤可用修饰符不同

  • 成员变量可以被public、protected、private、static、final等修饰符修饰;
  • 局部变量不能被public、protected、private、static修饰,只能被final修饰。

在使用变量时需要遵循的原则为:就近原则。首先在局部范围找,有就使用;接着在成员位置找。

难点:内存图 堆和栈存放的对象

Imgur
Imgur

方法区(属性和方法) 类加载的过程: 1.javac编译成.class文件 2.通过字节码对象生成拷贝到堆里,生成对应的类对象 3.进行属性的初始化 4.执行该类的构造函数

通过字节码文件加载到方法区中形成字节码对象并只加载一次的方式称为懒加载

  • 匿名对象 1、什么是匿名对象
    对象没有栈里面的变量指向,我们就称之为匿名对象;
    2、什么场合用匿名对象
    a、已经有了一种引用了,那么就不需要使用栈里面的变量来引用了 b、该对象有且只用一次的情况,那么就不需要为它赋变量名,让该对象用完之后,就被回收掉-->比如我们只需要构建一次随机数,那么我们就可以直接这样写: new Random().nextInt(100); (减少内存消耗)
Imgur
Imgur
  • 为什么要用get和set 可以写合法校验
  • 枚举:自己定义的一个集合

抽象类和接口

8.29

一、工厂模式-简单工厂模式 (一)内部类 ①写法: OuterClass.InnerClass in = new OuterClass().new InnerClass("小明"); (二)常量的写法

public class AnimalConst{
 public static final int ANIMAL_CAT = 1;
}
 static class FoodConst{
  public static final int Noodle = 1;
 }

二、抽象类和abstract关键词 三、接口 #面试题 (1)什么是接口 (2)接口怎么使用 (3)接口的注意事项 工作中将自己分到的模块,通过接口中的抽象方法进行实现,实现之后用接口进行调用 1.降低了设计和实现代码之间的耦合度 2.通过接口调用里面的具体方法对外隐藏了实现方法的细节,保证了安全。 四、内部类 (一)成员内部类 (二)局部内部类 (三)匿名内部类 #lambda表达式

Arrays.sort(arr,(o1,o2) ->(int)(o1.bPrice-o2.bPrice));
System.out.Println(Arrays.toString(arr));
(四)静态内部类

五、comparator和comparable

复习8.29

  • 抽象类
    • 思考为什么需要抽象类?
    • 抽象类的特点
  • 接口
    • 抽象类和接口的区别
    • 接口是一个特殊的抽象类
    • 接口的设计
  • 内部类
    • 怎么使用匿名内部类?
  • 比较器
    • 怎么用set的比较器进行排序

abstract关键字

抽象类的特点: 1、 用abstract修饰的类称之为抽象类。 2、 抽象类不能被实例化,因为抽象方法只有声明,无法用对象调用该方法。 3、 抽象类可以定义成员变量和静态变量。 4、 抽象类可以有构造方法,方便子类创建对象时给抽象类的属性赋值。 5、 抽象类中可以定义普通方法,也可以定义抽象方法(没有抽象方法也可以)。 6、 抽象类一定是一个父类,需要子类重写父类的抽象方法,然后在实例化使用。 抽象方法的特点: 1、 用abstract修饰的方法称之为抽象方法。 2、 抽象方法只有方法声明,没有方法体。 3、 子类要么实现父类的抽象方法,要么子类也是一个抽象类,否则编译失败。 4、 抽象方法只能存在于抽象类或接口中,不能存在于普通类中。

注意*:abstract关键字不能和private、final、static关键字共存!

接口

  • 接口用interface修饰
  • 接口属于全局静态常量,默认用public static final修饰
  • 接口中不能有构造方法(接口中没有需要初始化的成员变量
  • 如果子类实现了接口的所有抽象方法,那么子类可以实例化,如果只实现了部分的则不能。

题目

(1)final和abstract关键字的作用。  用abstract修饰的类称之为抽象类。

  • 用final修饰的基本数据类型,可以保证它是不可变的(保证对象的行为不会对其状态产生任何影响。 (2)接口和抽象类的联系和区别。 相同点: 1、 都是不断向上抽取而来的,都不能被实例化。 2、 都包含抽象方法,但不提供具体的实现。 3、都可以有默认方法的实现 不同点: 1、 抽象类需要被继承extends,而且只能单继承; 接口需要被实现implements,而且可以多实现。 2、 抽象类中可以定义成员变量也可以定义静态变量;(默认default,可以在子类中被重新定义也可以被重新赋值) 接口中定义的变量,默认为全局静态常量(public static final来修饰)。且不能被修改必须有初始值。 3、 抽象类中可以定义构造方法,方便子类调用并给抽象类中的成员变量赋值; 接口中不能定义构造方法,因为接口中没有成员变量需要初始化! 4、 抽象类中可以定义普通方法,也可定义抽象方法(abstrct); 接口JDK1.8之前,只能定义抽象方法(public abstrct),JDK1.8之后还可以定义静态方法。 5、 抽象类的继承,描述的“is a”关系,用于定义该体系的基本共性内容; 接口的实现,描述的“is like a”关系,用于定义体系之外的额外行为。

(3)介绍Java垃圾回收机制。 说到回收的对象,就要想到一个东西“GC Roots”,从GC Roots到这个对象不可达时,证明此对象不可用。会被认为是可以回收的对象。

那哪些是可作为GC Roots的对象呢?

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  • 方法区中类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象。

异常

一、什么是异常 (一)运行时异常 (二)检查时异常 二、常见异常

  1. ArrayIndexOfBoundsException
  2. StringIndexOfBoundsException
  3. NullPointException
  4. ClassCastException 三、异常的写法 四、try、catch、finally 五、自定义异常 (一)怎么自定义 1)确定父类 2)确定类名 3)构建构造函数 (二)怎么使用 1)throw 2)throws 六、try...with..resource的使用

异常代码

public class ExceptionDemo4 {  
    @Test  
    public void test(){  
        double fileSize = 1024*1024*400;//先定义一个文件尺寸是合理的情况  
//        double fileSize = 1024*1024*600;//再定义一个文件尺寸是不合理的情况  
        double picSize = 1024 * 1024 *3;//定义一个会报异常的尺寸  
        try {  
            fileUpload(fileSize);  
            picUpload(picSize);  
        } catch (FileIsLargerException e) {  
            e.printStackTrace();  
        }  
        System.out.println("是否执行的到");  
    }  
  
    //模拟文件上传的功能,参数就是文件的尺寸  
    public void fileUpload(double fileSize) throws FileIsLargerException{  
        if(fileSize>1024*1024*500){  
            //内部自己抛异常,然后自己用try..catch给捕捉的做法虽然可以避免编译报错,但是这样写  
            //毫无含义  
            /*try {  
                throw new FileIsLargerException();            } catch (FileIsLargerException e) {                e.printStackTrace();            }*/
//            throw new FileIsLargerException();  
            //调用有参的构造器  
            throw new FileIsLargerException("文件尺寸超出范围-->"+fileSize);  
        }  
        System.out.println("文件上传成功!");  
    }  
    //模拟图片上传的功能,参数就是图片的尺寸  
    public void picUpload(double picSize) throws PictureSizeIsLargerException{//运行时异常,你加上声明也没用  
        if(picSize>1024*1024*2){  
//            throw new PictureSizeIsLargerException();  
            throw new PictureSizeIsLargerException("图片尺寸超出范围:"+picSize);  
        }  
        System.out.println("图片上传成功");  
    }  
}  
//构建了一个检查时异常  
class FileIsLargerException extends Exception{  
    public FileIsLargerException(){  
  
    }    public FileIsLargerException(String msg){  
        super(msg);  
    }  
}  
//构建了一个运行时异常  
class PictureSizeIsLargerException extends RuntimeException{  
    public PictureSizeIsLargerException(){  
  
    }    public PictureSizeIsLargerException(String msg){  
        super(msg);  
    }  
}

分类:

后端

标签:

后端

作者介绍

A
Arya
V1