java进阶知识(二)

一、面向对象

1.1、类与对象

1、概述
  • 什么是类:类等于属性加方法;类是具有共同特征的抽象描述。
  • 什么是对象:显示生活中存在的一个个体,对象是类的实例化;但是它的属性是独立的。
  • 类与对象关系:一个类可以创建多个对象
  • 面向对象的三大特性:封装,继承,多肽
  • 每一个对象都具备的属性:成员变量和成员方法
  • 静态方法:属于类的特征,不属于对象
  • 构造函数:可重载,方法名必须与类名保持一致,不能有返回值,不能有void;主要作用是创建对象和给成员变量赋值;系统一般都会默认提供一个无参的构造函数;构造函数中的变量叫做成员变量。

1.2、类的继承

1、主要作用
  • 作用:代码重用;java中子类继承父类会将父类中所有属性继承,包括私有属性也能继承,但在子类中无法直接访问父类的私有属性,子类不能继承父类的构造方法
  • 主要实现方式:关键字extendsimplements
2、方法的覆盖
  • 一般类继承最基本的作用就是方法的重用,一般如果类没有继承指定的父类,则默认继承的是Object类
  • 继承的好处
    1、子类对象可以直接调用父类方法(调用时优先调用子类重写好的方法)
    2、子类可以重写父类中的方法(当父类无法满足相应的业务要求时)
  • 放生方法覆盖的条件
    1、存在继承类之间
    2、重写的方法不能比被重写的方法拥有更低的访问权限
    3、重写的方法不能比被重写的方法抛出更宽泛的异常
    4、私有方法不能被覆盖
    5、构造方法无法继承和覆盖
    6、静态方法无法覆盖
    7、主要覆盖的是成员方法,和成员变量无关

1.3、多肽

1、多肽的作用
  • 多肽的前提是继承关系成立;父类向子类对象需要强制转换;子类向父类对象转换可以自动转换成功

  • 示例

    public class Admin {
    
        public void eat(){
            System.out.println("人吃饭");
        }
    
    }
    
    public class Cat extends Admin {
    
        public void eat(){
            System.out.println("猫吃饭");
        }
    
        public void move(){
            System.out.println("猫移动");
        }
    
    }
    public class Test02 {
    
        public static void main(String[] args) {
            Admin admin = new Cat();
            admin.eat();
            Admin a = new Cat();
            Cat cat = (Cat)a;
            cat.move();
        }
    
    }
    
    
    
  • 测试结果:如上所示,move是Cart类自带的方法,eat是Cat重写Admin的方法,所以调用move方法时需要将a进行一次强制转换
    java进阶知识(二)_第1张图片

2、如何判断是否可以进行强转instanceof
  • instanceof作用:判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例,该运算符返回boolean类型的数据
  • 如下示例返回的结果是:true,true,false
    java进阶知识(二)_第2张图片
3、super关键字
  • 注意点
    1、super不是引用类型,存储的不是内存地址,指向的不是父类对象
    2、super代表的是当前子类对象的父类型特征
    3、子类和父类中均有某一个属性,如name,则在子类中可以使用super访问父类中的name
    4、super不能再静态方法中使用,但是可以在构造方法、成员方法中使用
  • super在构造方法中使用:
    1、语法:super(实参)
    2、作用:通过子类的构造方法去调用父类的方法
    3、语法规则:一个构造方法的第一行若是既没有this(实参),也没有super(实参);则系统默认调用super(实参);super和this的调用均只能在第一行,且二者不能共存
    4、通过子类构造方法调用父类构造方法时不会创建父类对象,因为构造方法调用不一定是创建对象
4、final关键字
  • final修饰的类无法被继承
  • final修饰的类无法被覆盖
  • final修饰的局部变量,一但赋值则不可再更改
  • final修饰的成员变量必须已经初始化完成了
  • final一般与static组合使用声明常量,常量名必须全部大写

1.4、抽象类和接口

1、抽象类定义
  • 格式:abstract class 类名
  • 抽象类无法被实例化,无法创建对象
  • 但是抽象类也有构造方法,该构造方法是给子类创建对象的
  • 抽象类中可以定义抽象方法
  • 抽象类中的抽象方法不能有方法体
2、抽象类中方法的规则
  • 抽象类中不一定要有抽象方法,但是抽象方法一定要在抽象类中
  • 非抽象类继承抽象类必须实现抽象方法,且对父类的抽象方法进行重写,覆盖实现
3、深入理解final关键字
  • 注意:抽象类不能被final修饰,抽象方法也不能被final修饰;abstract关键字不能与final共存
  • 若final修饰了一个引用对象,则该对象不能再赋值新对象,但是该对象属性可以重新赋值。
4、接口定义
  • 语法:修饰符 interface 接口名
  • 接口只能出现常量和抽象方法
  • 接口其实就是一个特殊的抽象类,是完全抽象的
  • 接口无构造方法、无法被实例化
  • 接口与接口之间可以被多继承
  • 一个类可实现多接口
  • 一个非抽象类实现接口需将接口中所有方法重写
5、接口的作用
  • 可以使得项目分层,所有层均面向接口开发
  • 功能间耦合度降低,实现功能可插拔,可以随意切换
  • 抽象类和接口的选型:优先选择接口;接口可以多继承,抽象类不可以。

二、this、static关键字

2.1、this关键字

1、this关键字定义
  • 是一个引用类型,保存了内存地址,在堆中每一个java对象都有一个this,this保存的内存地址指向的是该对象本身;super指向的是该对象的父类
2、this关键字的作用
  • this用在成员方法中,谁调用这个成员方法,this就代表谁;this代表当前对象,this一般默认省略
  • this也可以用来区分成员变量和局部变量(方法中的变量)
  • this不能用在静态方法中(static);原因是访问静态方法不需要用到对象(直接使用类名.方法名调用),所以不能再静态方法中使用成员变量
  • this与super都必须出现在成员方法的第一行,且二者不可以共存

2.2、static关键字

1、static常使用的场景
  • 静态变量、静态方法、静态语句块、与final结合使用定义常量
2、静态语句块
  • 语法格式:{java代码}
  • 静态语句块执行顺序:在每一次调用构造方法之前执行,代码块中代码执行顺序也是自上而下的
3、静态方法
  • 与成员方法的比较:成员方法调用是引用.方法名,静态方法是类名.方法名,静态方法调用也可以使用引用.方法名,但是实际上还是类调用
  • 注意:静态方法中不能直接访问非静态资源,不能使用this
4、静态变量
  • 与成员变量的比较:静态变量是所有java对象共享一个,是类级别的;成员变量属于对象级别,一个对象用于属于它自己的成员变量;成员变量是创建java对象时进行初始化,静态变量是加载类时就已经初始化;成员变量是随着对象存于JVM堆中,而静态变量是存在于方法区
  • 静态变量一定要声明在静态块之前

三、数组、异常

3.1、根类Object常用方法介绍

1、tostring方法
  • 作用:将java对象以字符串的方式表达出来;一般类如果想要以字符串形式表达出来需要重写tostring方法。
2、equals方法
  • 作用:比较两个对象的内存地址是否一样,判断两个对象是否完全一样;object中的equals方法比较的是内存地址
  • String类已经重写了Object的equals方法,比较的是内容;所以在java中判断两个字符串是否一致不能够使用**==**,要使用String的equals方法
3、finalize方法:垃圾回收器
  • 什么时候调用:方法调用结束会自动释放;程序员只能建议垃圾回收,无法控制JVM的垃圾回收机制
4、hashcode(了解一下即可)
5、clone方法
  • 创建对象副本,保证原对象的数据不被破坏
6、java中包的访问控制权限

java进阶知识(二)_第3张图片

3.2、java内部类

1、静态内部类
  • 作用:可以看做当前类的静态变量,静态内部类可以直接访问外部类的静态数据,但是无法直接调用外部类的成员数据;静态内部类可以通过创建外部类实例的方法调用外部类的非静态属性和方法
  • 规则:静态内部类可以定义静态成员和方法,也可以定义非静态成员和方法
2、成员内部类
  • 作用:可以看做当前类的成员变量,可以访问外部类的所有数据,包括外部类的静态属性;但是成员内部类不可以定义static修饰的属性和方法,可以定义static final修饰的编译期变量【不用加载类的字节码】
  • 为什么不可以定义static修饰的属性和方法:内部类是外部类的一个成员,只有当外部类初始化的时候,内部类才能初始化,静态变量属于类级别,在类加载的时候就初始化, 所以两者本身在语法上就有矛盾。
  • 为什么可以定义static final修饰的变量:首先要先知道sttaic final修饰的变量叫做常量,常量分为编译期常量和非编译期常量;编译期常量:在程序编译阶段【不需要加载类的字节码】,就可以确定常量的值;非编译期常量:在程序运行阶段【需要加载类的字节码】,可以确定常量的值
3、匿名内部类
  • 定义:匿名内部类是没有名字的
  • 注意点:匿名内部类不能定义任何静态成员、方法;匿名内部类中的方法不能是抽象的;匿名内部类必须实现接口或抽象父类的所有抽象方法;匿名内部类访问的外部类成员变量或成员方法必须用static修饰

3.3、java异常

1、异常介绍
  • 异常的本质:JVM为我们创建了一个Exception类型的对象,并将此对象包含的详细信息输出到控制台
  • 作用:程序发生异常事件之后,异常处理机制使得程序变得更加健壮
2、异常的分类
  • 编译异常:在代码编译过程中发现
  • 运行异常:代码运行过程中发现
  • throws关键字:将异常抛往上一级,并不是真正的解决了异常
  • try 。。。 catch 。。。:处理捕捉异常,真正的解决了异常;catch捕捉异常的代码可以写多个,但是从上到下必须按照从小到大的异常捕捉,即下一级异常必须比上一级异常大(可以是它的父级异常也可以是爷爷级异常)
3、异常常用方法
  • getMessage和printStackTrace方法:打印异常堆栈信息
4、finally语句块
  • 应用场景:只要在执行finally之前推出JVM,则finally不会执行;一般finally的应用场景都是用于保证某种资源一定能够被释放;如finalize关键字就是用来进行垃圾回收的

3.4、数组

1、数组创建的三种方式
int [] arr = new int [6];
int [] x = {1,2,3,4};
int [] y = new int [] {1,2,3,4,5};
2、数组的优缺点
  • 优点:查找元素效率高;数组查询元素:知道第一个按顺序遍历就行
  • 缺点:增删效率低下;因为数组时线性结构,数组增加元素:如果需要给index为10的位置添加,则从index为11的位置开始右移;数组删除元素:如果需要删除index为10的位置,则从index为11的位置开始左移

四、面向对象总结

4.1、几种类之间的关系

  • 泛化关系:类之间的继承,接口之间的继承
  • 实现关系:普通类实现接口
  • 关联关系:类与类之间的连接;即类与类之间通过成员属性的关联
  • 聚合关系:整体不依赖部分,部分也不依赖整体;整体无法决定部分的生命周期
  • 聚合关系示例
    java进阶知识(二)_第4张图片
  • 组合关系:整体和部分紧密相连,整体决定部分的声明周期
    在这里插入图片描述

你可能感兴趣的:(java基础)