多态、权限修饰符、静态代码块、抽象类抽象方法、接口,内部类、匿名内部类
多态
实例:
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
,因此不能在子类Student
和Teacher
中被重写。
权限修饰符
构造代码块
静态代码块
静态代码块(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.
解释
- 静态代码块:在类加载时执行一次,用于初始化数据库连接参数。
- 构造函数:每次创建对象时都会执行,用于建立实际的数据库连接。
多个静态代码块
一个类中可以有多个静态代码块,它们按照在类中出现的顺序依次执行。
示例
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.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
匿名内部类
实现关系.
方法的重写
创建对象