Java学习day06

多态

同一操作作用于不同的对象,可以有不同的解释,产生不同的结果。多态性使得程序可以根据实际对象的类型来动态确定要调用的方法或执行的操作。

多态的实现

多态性通过继承和方法重写来实现,具体表现为以下几种形式:

  1. 子类对象可以赋值给父类引用:可以使用父类的引用变量来引用一个子类的对象。这样做的好处是,通过父类的引用可以调用子类重写的方法,实现对不同子类对象的统一处理。
  2. 父类引用可以指向子类对象:可以将一个父类的引用指向一个子类的对象,这样父类引用可以调用子类中继承的方法。但是,父类引用不能直接调用子类特有的方法。
  3. 方法重写(Override):子类可以重写父类的方法,即在子类中定义与父类同名、参数列表相同、返回类型相同或是其子类型的方法。当通过父类引用调用被子类重写的方法时,实际执行的是子类中的方法。
  4. 动态绑定(Dynamic Binding):在运行时,根据对象的实际类型来确定调用的方法。当通过父类引用调用被子类重写的方法时,会根据实际对象的类型来动态绑定方法的调用。

多态的访问特性

多态的访问特性是指通过父类引用变量访问子类对象时的行为。具体来说,有以下两个特性:

  1. 编译时类型和运行时类型:在多态中,编译时类型是指变量声明的类型,而运行时类型是指变量引用的对象的实际类型。编译时类型由声明决定,运行时类型由实际对象决定。
  2. 动态绑定(Dynamic Binding):在运行时,根据对象的实际类型来确定调用的方法。当通过父类引用调用被子类重写的方法时,会根据实际对象的类型来动态绑定方法的调用。
class Animal {
    public void makeSound() {
        System.out.println("Animal is making a sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog is barking");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Cat is meowing");
    }
}

Animal animal1 = new Dog(); // 编译时类型为 Animal,运行时类型为 Dog
Animal animal2 = new Cat(); // 编译时类型为 Animal,运行时类型为 Cat

animal1.makeSound(); // 输出 "Dog is barking"
animal2.makeSound(); // 输出 "Cat is meowing"

修饰符

访问控制修饰符

  • public:可以被任何类访问。
  • private:只能在定义该成员的类内部访问。
  • protected:可以被定义该成员的类、同一包内的类和子类访问。
  • 默认修饰符(没有显式修饰符):可以被同一包内的类访问。包私有
名称同类中同包中异包子类异包非子类
publicYYYY
privateYNNN
protectedYYYN
defaultYYNN

非访问控制修饰符

  • static:用于声明静态成员(静态变量、静态方法、静态代码块)。
  • final:用于声明不可变的类、方法或变量。对于类,表示不能被继承;对于方法,表示不能被重写;对于变量,表示常量。
  • abstract:用于声明抽象类和抽象方法。抽象类不能被实例化,只能作为其他类的父类,而抽象方法必须在子类中被重写。

static关键字

static 是一个非访问修饰符,在 Java 中用于声明静态成员和静态代码块:

  1. 静态变量(Static Variables):使用 static 关键字声明的变量称为静态变量,也称为类变量。静态变量属于类,而不是属于类的实例。它们在类加载时被初始化,存储在方法区中,并且所有该类的实例共享同一个静态变量的值。可以通过类名直接访问静态变量,而不需要创建类的实例。
  2. 静态方法(Static Methods):使用 static 关键字声明的方法称为静态方法,也称为类方法。静态方法属于类,而不是属于类的实例。可以直接通过类名调用静态方法,而不需要创建类的实例。静态方法只能访问静态成员(静态变量和其他静态方法),不能直接访问非静态成员。
  3. 静态代码块(Static Initialization Blocks):使用 static 关键字声明的代码块称为静态代码块。静态代码块在类加载时被执行,用于初始化静态变量或执行其他静态操作。静态代码块只会执行一次,并且在类加载过程中按照它们在源代码中的顺序执行。
  4. 静态成员的特点:
    • 静态成员属于类,而不属于类的实例。因此,可以在没有创建类的实例的情况下访问静态成员。
    • 静态成员在内存中只有一份拷贝,被所有该类的实例共享。
    • 静态成员可以通过类名直接访问,也可以通过对象引用访问(不推荐)。
    • 静态成员在程序的整个生命周期内都存在,直到程序结束。

静态成员应用场景:

  • 声明常量或共享数据,例如全局配置参数。
  • 创建实用方法,不依赖于实例的特定状态。
  • 在类加载时执行初始化操作。
  • 在单例模式中实现单例对象的获取。

静态成员的使用限制和注意事项:

  • 静态方法中只能直接调用其他静态方法和访问静态变量,不能直接调用非静态方法或访问非静态变量。
  • 静态成员不能访问非静态成员,因为非静态成员是依赖于类的实例存在的。

代码块

代码块是一段被包裹在一对花括号 {} 中的代码。根据其位置和使用方式的不同,Java中有以下几种类型的代码块:

  1. 初始化代码块(Instance Initializer Block):初始化代码块是在创建对象时执行的代码块,用于初始化实例变量。它没有使用关键字进行修饰,只是在类中使用花括号 {} 包围起来的代码块。初始化代码块在每次创建对象时都会被执行,并且在构造函数之前执行
public class MyClass {
    {
        // 初始化代码块
        // 执行一些初始化实例变量的操作
    }

    // 构造函数
    public MyClass() {
        // 构造函数代码
    }
}
  1. 静态代码块(Static Initialization Block):静态代码块是在类加载时执行的代码块,用于初始化静态变量或执行其他静态操作。静态代码块使用 static 关键字进行修饰,并且在类中使用花括号 {} 包围起来的代码块。静态代码块只会执行一次,在类加载过程中按照它们在源代码中的顺序执行。
public class MyClass {
    static {
        // 静态代码块
        // 执行一些初始化静态变量或其他静态操作的代码
    }
}
  1. 局部代码块(Local Block):局部代码块是在方法或语句块内部定义的代码块,用于限定变量的作用范围。局部代码块在运行时执行,并且在离开代码块后,其中定义的局部变量将不再可见。
public class MyClass {
    public void myMethod() {
        // 方法中的局部代码块
        {
            // 执行一些操作
        }

        // 方法中的其他代码
    }
}

代码块可以用于执行一些特定的操作,例如初始化变量、执行复杂的计算、实现资源的获取和释放等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值