韩顺平java基础-10-面向对象编程

韩顺平java基础-10-面向对象编程

类变量和类方法#

类变量#

static

  1. 静态变量被同一个类所有对象共享
  2. 类变量在类加载的时候生成

定义语法

访问修饰符 static 数据类型 变量名

如何访问类变量

类名.类变量名 //类变量随着类加载而创建,所以即使没有创建对象实例也可以访问。

使用细节

  1. 什么时候需要用类变量

需要某个类的所有对象共享一个变量,都可以考虑使用类变量

  1. 类变量与实例变量的区别

类变量是该类所有对象共享,实例变量是每个对象独享


类方法#

类方法就是静态方法

语法

访问修饰符 static 数据返回类型 方法名(){}

类方法使用场景

当方法中不涉及到任何和对象相关的成员时,可以将方法设计成静态方法,提高开发效率。

希望不创建实例,也可以调用某个方法(当作工具使用)

注意事项

类方法可以通过类名直接调用,非静态方法需要创建对象再调用。

类方法不能使用this和super等关键字。

类方法只能访问静态成员(方法和变量),不能访问实例方法。

普通成员方法既可以访问静态成员也可以访问非静态成员


理解main方法语法#

public static void main(String[] args)

  1. main 方法是java虚拟机调用
  2. Java虚拟机需要调用类的main方法,所以访问权限必须是public
  3. java虚拟机在执行main方法时不创建对象,所以该方法必须时static

注意

静态方法main,可以访问本类的静态成员,但是不可以访问本类的非静态成员


代码块#

代码化块又称为初始化块,属于类中的成员[即 是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过{}包围起来。
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时或创建对象时隐式调用。

基本语法

[修饰符]{代码};

说明

修饰符 只能是 static

使用static修饰的叫静态代码块,没有static修饰的叫普通代码块

代码块调用优先于构造器

理解

相当于另一种形式的构造器

应用场景

如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性

细节

  1. static代码块,作用就是对类进行初始化,随着类加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象,就会执行。

类什么时候被加载?

​ 1创建对象实例时(new) 2 创建子类对象实例时,父类同时被加载,同时父类先加载

​ 3 使用类的静态成员时,类被加载

  1. 创建一个对象时,在一个类中的调用顺序是:

​ 1调用静态代码块和静态属性初始化 优先级:优先级相同,按照定义顺序执行

​ 2调用普通代码块和普通属性初始化 优先级:优先级相同,按照定义顺序执行

​ 3调用构造器

  1. 构造器 默认执行 super和调用普通代码块
  2. 创建一个子类对象(含继承关系)时,在一个类中的调用顺序是:

​ 1父类的静态代码块和静态属性初始化

​ 2子类的静态代码块和静态属性初始化

​ 3父类的普通代码块和普通属性初始化

​ 4父类构造器

​ 5子类的普通代码块和普通属性初始化

​ 6子类构造器

  1. 静态代码块只能直接调用静态成员,普通代码块可以调用任意成员

单例设计模式#

静态方法和静态属性的应用

应用实例#

饿汉式(如果没有使用对象,也会随着类的加载自动创建)懒汉式(没有使用对象时,不会创建对象,在调用接口时才创建)

步骤

  1. 构造器私有化 private
  2. 在类的内部创建静态对象
  3. 提供公共static方法接口,返回对象

小结

饿汉式:在类加载时就创建对象,可能存在资源浪费问题

懒汉式:线程存在安全问题


final关键字#

使用场景

  1. 不希望类被继承,可以用final修饰
  2. 不希望父类中的方法被重写,可以用final修饰
  3. 不希望类的某个属性的值被修改,可以用final修饰
  4. 不希望某个局部变量被修改,可以用final修饰

细节

  1. final修饰的变量称为常量,必须赋初值。
  2. 赋值位置:1.定义时 2.构造器中 3.代码块中
  3. 如果final修饰的是静态属性,则赋值位置:1.定义时 2.静态代码块 不能在构造器中赋值
  4. final类不能继承,但是可以实例化
  5. 非final类,final方法不能被重写,但是可以被继承
  6. final类的方法不必使用final再次修饰方法(画蛇添足)
  7. final和static结合使用,不会导致类加载,效率更高
  8. 包装类 String Double Int是final类 不能被继承

抽象类#

定义

父类方法不确定时,用abstract修饰方法,抽象方法没有方法体。

细节

  1. 抽象类不能被实例化(new)
  2. 抽象类不一定要包含abstract方法
  3. 一旦类中包含抽象方法,则必须声明为抽象类
  4. abstract只能修饰类和方法
  5. 如果一个类继承了抽象类,则它必须实现抽象类中的所有抽象方法,除非子类也声明为抽象类。
  6. 抽象方法不能使用private,final,static来修饰,因为与重写相违背。

模板设计模式(抽象类使用)

动态绑定机制


接口#

封装一些没有实现的方法,根据具体情况实现方法

interface 接口名{//属性 //方法}

class 类名 implements 接口{自己属性 自己方法}

细节

  1. 普通类实现接口,必须实现接口的所有抽象方法。抽象类实现接口,可以不用实现接口方法。
  2. 接口中,默认是抽象方法,不用abstract关键字
  3. jdk8后,可以有默认实现方法,但是需要使用default关键字修饰;可以有静态方法。
  4. 接口不能实例化,本身是抽象概念
  5. 类可以同时实现多个接口 接口也可以继承其他的接口
  6. 接口中的属性 只能是public static final属性

接口 vs 继承类

实现接口是对java单继承机制的补充

继承:

子类可以直接使用父类中已存在的方法

接口:

扩展子类的功能

接口多态

多态参数

多态数组:向下转型

多态传递


内部类#

类的五大成员

属性、方法、构造器、代码块、内部类

局部内部类

  1. 局部内部类定义在外部类的局部位置(通常在方法中),相当于局部变量
  2. 可以直接访问外部类的所有成员,包括私有的
  3. 不能添加访问修饰符,但是可以使用final修饰
  4. 作用域:仅仅作用于定义它的方法或代码块中
  5. 局部内部类使用外部类:可以直接访问外部类的所有成员
  6. 外部类使用局部内部类:在方法中创建对象使用
  7. 外部类和局部内部类成员重名时,遵循就近原则优先访问内部类成员。如果想要访问外部类成员,使用 外部类名.this.成员 访问

匿名内部类

  1. 当作实参直接传递

成员内部类

  1. 可以直接访问外部类的所有成员,包括私有的
  2. 成员内部类,定义在外部类的成员位置
  3. 可以用修饰符(本质是成员,可以加)
  4. 成员内部类使用外部类:可以直接访问外部类的所有成员
  5. 外部类使用成员内部类:在方法中创建对象使用
  6. 外部其他类使用成员内部类:1.创建成员内部类的对象 2.在外部类中创建方法返回对象实例
  7. 外部类和成员内部类成员重名时,遵循就近原则优先访问内部类成员。如果想要访问外部类成员,使用 外部类名.this.成员 访问

静态内部类

  1. 定义在外部类的成员位置,static修饰
  2. 可以直接访问外部类的静态成员,不能访问非静态成员
  3. 可以用修饰符(本质是成员,可以加)

小结

  1. 内部类共四种:局部内部类、匿名内部类、成员内部类、静态内部类
  2. 重点掌握匿名内部类:

new 类/接口(参数列表){};

  1. 成员内部类、静态内部类 放在外部类的成员位置,本质是一个成员
posted @   forest-pan  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
CONTENTS