JAVASE面向对象高级 | 豆包MarsCode AI刷题

31 阅读5分钟

面向对象高级

一、静态

static关键字:可用于修饰成员变量,也可用于修饰成员方法。

1.1 修饰成员变量

  • 类变量:有static修饰,属于类,会被类的全部对象共享
  • 实例变量(对象的变量):无static修饰,属于每个对象。

image-20241029161725393

静态变量属于类,通过类名就能调用:类名.类变量名

实例变量属于对象,通过对象名才能调用:对象名.实例变量名

1.2 修饰成员变量的应用场景

在实际开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住。

场景:类A统计创建了多少个对象

public class User {
    static int number;
​
    public User(){
        User.number++;
    }
​
    public static void main(String[] args) {
       
        for(int i =0; i<5; i++){
            new User();
        }
​
        System.out.println(User.number);
    }
}

1.3 修饰成员方法

  • 类方法:有static修饰的方法,属于类 类名.类方法名
  • 实例方法:无static修饰的方法,属于对象 对象名.实例变量名
  1. 类方法:static修饰的方法,可以被类名调用,是因为它是随着类的加载而加载的;所以类名直接就可以找到static修饰的方法
  2. 实例方法:非static修饰的方法,需要创建对象后才能调用,是因为实例方法中可能会访问实例变量,而实例变量需要创建对象后才存在。 所以实例方法,必须创建对象后才能调用。

1.4 static应用

  • 静态代码块:类加载时自动执行,由于类只会加载一次,所有静态代码块也只会执行一次。 可用于对类的初始化。

    public class Student {
        static int number = 80;
        static String name = "Wendy";
        // 静态代码块
        static {
            System.out.println("静态代码块已执行!");
            
        }
    ​
        public static void main(String[] args) {
            System.out.println(Student.number);
            System.out.println(Student.name);
        }
    ​
    }
    ​
    

    执行上面代码时,发现没有创建对象,静态代码块就已经执行了。

  • 实例代码块:每次创建对象时,执行实例代码块,并在构造器前执行。实例代码块的作用和构造器的作用是一样的,用来给对象初始化值

    public class Student {
        int number;
        String name;
        {
            System.out.println("实例代码块已执行!");
            number = 20;
            name = "Wendy";
    ​
    ​
        }
    ​
        public Student(){
            System.out.println("无参构造器执行");
        }
    ​
        public Student(int number, String name){
            System.out.println("有参构造器执行");
            this.number = number;
            this.name = name;
        }
    ​
    ​
    ​
        public static void main(String[] args) {
            Student s1 = new Student();
            Student s2 = new Student(25, "MIKE");
            System.out.println(s1.number);
            System.out.println(s1.name);
            System.out.println(s2.number);
            System.out.println(s2.name);
        }
    ​
    }
    ​
    

    结果:

    image-20241029165429241

    实例代码块每次创建对象之前都会执行一次

二、继承

2.1 什么是继承

面向对象三大特征:继承、封装、多态

JAVA中提供了extends关键字,可以让一个类与另一个类建立起父子关系。

特点:子类可以继承父类的所有 非私有成员(变量、方法)

继承后对象的创建:子类的对象时由 父类、子类共同完成的。

2.2 继承的好处

减少重复代码的编写。

可以把重复的代码提取出来,作为父类,然后让其他类继承父类就可以了,这样可以提高代码的复用性

2.3 权限修饰符

权限修饰符是用来限制类的成员(成员变量、成员方法、构造器...)能够被访问的范围。

1664012151488

2.4 单继承、Object

Java语言只支持单继承,不支持多继承,但是可以多层继承

Object类是Java中所有类的祖宗

2.5 方法重写 Override

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。

重写后,方法的访问遵循就近原则

注意:

  • 子类复写父类方法时,访问权限必须大于或者等于父类方法的权限,
  • 重写的方法返回值类型,必须与被重写的方法返回值类型一样,或者范围更小
  • 私有方法、静态方法不能被重写,如果重写会报错。

2.6 子类中访问成员的特点

在子类中访问其他成员(成员变量、成员方法),是依据就近原则

如果子类和父类出现同名变量或者方法,优先使用子类的;此时如果一定要在子类中使用父类的成员,可以加this或者super进行区分。

2.7 子类访问构造器的特点

  • 子类中访问构造器的语法规则:首先,子类全部构造器,都会先调用父类构造器,再执行自己。

    1664160225526

  • 子类访问构造器的应用场景:如果不想使用默认的super()方式调用父类构造器,还可以手动使用super(参数)调用父类有参数构造器。

    1664163881728

  • 在本类中访问自己的构造方法

    this(): 调用本类的空参数构造器
    this(参数): 调用本类有参数的构造器
    
  • 总结:

    访问本类成员:
        this.成员变量   //访问本类成员变量
        this.成员方法   //调用本类成员方法
        this()         //调用本类空参数构造器
        this(参数)      //调用本类有参数构造器
        
    访问父类成员:
        super.成员变量  //访问父类成员变量
        super.成员方法  //调用父类成员方法
        super()        //调用父类空参数构造器
        super(参数)     //调用父类有参数构造器
        
    注意:thissuper访问构造方法,只能用到构造方法的第一句,否则会报错。