JAVA基础知识5(多态、权限修饰符、静态代码块、抽象类抽象方法、接口,内部类、匿名内部类)

多态

在这里插入图片描述
在这里插入图片描述
实例:

package yeah;

public class Person {
    private  String name;
    private  int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public void show()
    {
        System.out.println(name+","+age);
    }
}

package yeah;

public class Student extends Person{

    @Override
    public void show() {
        System.out.println("学生的信息为:"+getName()+","+getAge());
    }

    public Student(String name, int age) {
        super(name, age);
    }
}
package yeah;

public class Teacher extends Person{
    @Override
    public void show() {
        System.out.println("老师的信息为:"+getName()+","+getAge());
    }

    public Teacher(String name, int age) {
        super(name, age);
    }
}
package yeah;

public class textPlay {
    public static void main(String[] args) {
        Student stu = new Student("zxx", 18);
        Teacher tea = new Teacher("asd", 34);
        register(stu);
        register(tea);
    }
    public static void register(Person p)
    {
        p.show();
    }
}


用多态的方式创建对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用鼠标点下红色,alt+回车,自动导包。

在这里插入图片描述

final

在这里插入图片描述
final关键字在Java中有多种用途,分别可以用来修饰变量、方法和类。以下是具体说明和示例:

1. 修饰变量

当用final修饰一个变量时,这个变量在初始化之后就不能再被赋值。

示例
public class FinalVariableExample {
    public static void main(String[] args) {
        final int x = 10;
        // x = 20; // 编译错误,因为x是final的,不能被重新赋值
        System.out.println(x);
    }
}

2. 修饰方法

当用final修饰一个方法时,这个方法不能被子类重写。

示例
class Parent {
    public final void show() {
        System.out.println("This is a final method.");
    }
}

class Child extends Parent {
    // public void show() { // 编译错误,不能重写final方法
    //     System.out.println("Trying to override final method.");
    // }
}

public class FinalMethodExample {
    public static void main(String[] args) {
        Child c = new Child();
        c.show(); // 调用父类的final方法
    }
}

3. 修饰类

当用final修饰一个类时,这个类不能被继承。

示例
final class FinalClass {
    public void display() {
        System.out.println("This is a final class.");
    }
}

// class SubClass extends FinalClass { // 编译错误,不能继承final类
// }

public class FinalClassExample {
    public static void main(String[] args) {
        FinalClass fc = new FinalClass();
        fc.display();
    }
}

例子整合

为了更全面地展示final的使用,我们可以整合上面的示例,构建一个简单的应用程序:

Person
package yeah;

public class Person {
    private final String name; // 一旦初始化后不能修改
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public final void show() { // 不能被子类重写
        System.out.println(name + ", " + age);
    }
}
Student
package yeah;

public class Student extends Person {
    public Student(String name, int age) {
        super(name, age);
    }

    // 无法重写父类的final方法show()
    @Override
    public void show() {
        System.out.println("学生的信息为:" + getName() + ", " + getAge());
    }
}
Teacher
package yeah;

public class Teacher extends Person {
    public Teacher(String name, int age) {
        super(name, age);
    }

    @Override
    public void show() {
        System.out.println("老师的信息为:" + getName() + ", " + getAge());
    }
}
textPlay
package yeah;

public class textPlay {
    public static void main(String[] args) {
        Student stu = new Student("zxx", 18);
        Teacher tea = new Teacher("asd", 34);
        register(stu);
        register(tea);
    }

    public static void register(Person p) {
        p.show();
    }
}

在这个例子中:

  • name 属性被声明为 final,意味着一旦 Person 对象创建之后,name 属性的值就不能再被修改。
  • show 方法在 Person 类中被声明为 final,因此不能在子类 StudentTeacher 中被重写。

在这里插入图片描述

权限修饰符

在这里插入图片描述
在这里插入图片描述
构造代码块
在这里插入图片描述

静态代码块

在这里插入图片描述
静态代码块(Static Block)在Java中用于在类加载时执行一些初始化操作。静态代码块在类第一次被加载进内存时执行,并且只执行一次。它可以用来初始化类级别的资源,如静态变量。

语法

class MyClass {
    static {
        // 静态代码块
        System.out.println("Static block executed.");
    }

    public MyClass() {
        System.out.println("Constructor executed.");
    }

    public static void main(String[] args) {
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();
    }
}

运行结果

Static block executed.
Constructor executed.
Constructor executed.

例子

让我们看看一个实际的例子来理解静态代码块的使用:

DatabaseConnection
public class DatabaseConnection {
    private static String dbUrl;
    private static String username;
    private static String password;

    static {
        // 静态代码块用于初始化数据库连接参数
        dbUrl = "jdbc:mysql://localhost:3306/mydatabase";
        username = "root";
        password = "password";
        System.out.println("Static block executed. Database parameters initialized.");
    }

    public DatabaseConnection() {
        System.out.println("Constructor executed. Database connection established.");
    }

    public static void main(String[] args) {
        DatabaseConnection db1 = new DatabaseConnection();
        DatabaseConnection db2 = new DatabaseConnection();
    }
}

运行结果

Static block executed. Database parameters initialized.
Constructor executed. Database connection established.
Constructor executed. Database connection established.

解释

  1. 静态代码块:在类加载时执行一次,用于初始化数据库连接参数。
  2. 构造函数:每次创建对象时都会执行,用于建立实际的数据库连接。

多个静态代码块

一个类中可以有多个静态代码块,它们按照在类中出现的顺序依次执行。

示例
public class MultipleStaticBlocks {
    static {
        System.out.println("Static Block 1");
    }

    static {
        System.out.println("Static Block 2");
    }

    public MultipleStaticBlocks() {
        System.out.println("Constructor executed.");
    }

    public static void main(String[] args) {
        MultipleStaticBlocks obj = new MultipleStaticBlocks();
    }
}

运行结果

Static Block 1
Static Block 2
Constructor executed.

结合实例变量和静态代码块

有时我们需要结合静态代码块和实例变量来进行复杂的初始化操作。

示例
public class StaticBlockExample {
    private static int staticVar;
    private int instanceVar;

    static {
        staticVar = 10;
        System.out.println("Static block executed. staticVar initialized to " + staticVar);
    }

    public StaticBlockExample(int instanceVar) {
        this.instanceVar = instanceVar;
        System.out.println("Constructor executed. instanceVar initialized to " + this.instanceVar);
    }

    public static void main(String[] args) {
        StaticBlockExample obj1 = new StaticBlockExample(5);
        StaticBlockExample obj2 = new StaticBlockExample(15);
    }
}

运行结果

Static block executed. staticVar initialized to 10
Constructor executed. instanceVar initialized to 5
Constructor executed. instanceVar initialized to 15

总结

  • 静态代码块用于类级别的初始化操作,在类加载时执行一次。
  • 构造函数用于对象级别的初始化操作,每次创建对象时执行。
  • 静态代码块在类加载时按照它们在类中出现的顺序依次执行。
  • 静态代码块非常适合用来初始化静态变量或执行一次性设置操作。

抽象类抽象方法

在这里插入图片描述
抽象类不能实例化,意思就是抽象类不能创建对象。
在这里插入图片描述
在这里插入图片描述

接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接口和抽象类都需要重写,快捷键:Alt+回车。
但是:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

内部类

在这里插入图片描述
内部类的访问特点:

  • 内部类可以直接访问外部类的成员。包括私有
  • 外部类要访问内部灵的成员。必须创建对象
    在这里插入图片描述
    在这里插入图片描述

成员内部类

在这里插入图片描述
获取成员内部类对象的两种方式:

  • 方式一:外部类编写方法。对外提供内部类对象
  • 方式二直接创建:格式:外部灵名。内部类名对象名=外部类对象.内部类对象;
    范例: outer.Inner oi = new outer().new Inner();

在这里插入图片描述
在这里插入图片描述

静态内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

局部内部类
1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
2.外界是无法直接使用局部内部类,需要在方法内部创建对象并使用。
3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

匿名内部类

在这里插入图片描述
实现关系.
方法的重写
创建对象
在这里插入图片描述

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值