Java面向对象2

面向对象2

static总结

  1. public class Student {
        private static int age;  //静态变量(多线程!)
        private double score;    //非静态变量
    
        public void run() {}
        public static void go(){}
        
        public static void main(String[] args) {
            Student s1 = new Student();
    
            System.out.println(Student.age);        //静态变量可以直接通过类去调用
            // System.out.println(Student.score);   //非静态变量只能通过实例调用
            System.out.println(s1.age);
            System.out.println(s1.score);
    
            // run();                               //非静态方法不可直接调用,要通过实例
            new Student().run();
            go();                                   //在当前类里面可以直接调用
            Student.go();                           //如果不在当前类里也能直接访问,不需要new个对象
        }
    }
    
    • 静态的方法/变量可以直接通过类去调用,而非静态的变量需要通过类的实例去调用
    • 如果在同一个类里,静态方法可以直接用
  2. public class Person {
        //在构造函数前执行,可用来赋初始值
        {
            //代码块(匿名代码块)
            System.out.println("匿名代码块");
        }
        //最早执行,且只执行一次
        static {
            //静态代码块
            System.out.println("静态代码块");
        }
    
        public Person() {
            System.out.println("构造方法");
        }
    
        public static void main(String[] args) {
            Person p1 = new Person();
            System.out.println("==========================");
            Person p2 = new Person();
        }
    }
    
    • 静态代码块会在第一个执行(静态代码块>匿名代码块>构造函数),和类一起加载
    • 静态代码块只会执行一次,之后再new对象就不执行了
  3. //静态导入包
    //import java.lang.Math.random;
    import static java.lang.Math.random;
    
    public class Test {
        public static void main(String[] args) {
            //System.out.println(Math.random());
            System.out.println(random());
        }
    }
    

    每次使用random()方法生成随机数前面都要加包名Math,比较麻烦。

    可以静态导入包,只导入Math类里的random方法,如果不加static会报错

抽象类

abstract修饰符可以用来修饰方法或者修饰类。修饰方法就是抽象方法;修饰类就是抽象类

抽象类可以没有抽象方法,但是有抽象方法类的一定要声明为抽象类

特点:

  • 抽象类是不能使用new关键字来创建对象的,它是用来让子类继承的
  • 抽象方法只有方法的声明,没有方法的实现,它是用来让子类实现的

子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类

思考:

  1. 既然抽象类不能new,那么抽象类存在构造器么?

    一定是存在的,因为抽象类要有子类去继承它,子类不一定是抽象类,那么就会有构造器,而子类构造器的第一句话就是super(),所以如果抽象类没有构造器,子类的构造器也就无法实现。

  2. 抽象类存在的意义?

​ 利于代码的维护和重用。抽象类用来表征对问题的抽象概念,是本质上相同的具体概念抽象。抽象类不仅可以把一些具有相同属性和方法的组件进行抽象,而且当又有一个具有相似的组件产生时,只需要实现该抽象类就可以获得该抽象类的那些属性和方法。

接口

普通类 抽象类 接口
只有具体实现 具体实现和规范(抽象方法)都有 只有规范,自己无法写方法

接口就是规范,定义的是一组规则,体现了现实生活中“如果你是...则必须能...”的思想。

接口的本质是契约,如同人类世界的法律,制定好之后大家都要去遵守

接口是面向对象的精髓,是对对象的抽象

接口声明的关键字:interface

特点:

  • 接口里面的所有方法都默认为public abstract的,可以直接写返回类型+函数名称。
  • 接口里的属性,默认为常量,public static final。不过一般不在接口里加属性。
  • 需要有个类去实现接口,实现的关键字:implements,实现接口的类必须要重写接口里的方法
  • 接口可以多继承,一个类实现多个接口

接口的难点就是在于去锻炼抽象的思维!(架构师)

内部类

一个java文件里能有多个class,但是只能由一个时public class。定义在类里面的才叫内部类,在外面的不算。

内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。

使用时,通过外部类去实例化对象。Outer.Inner inner = outer.new Inner();

  • 成员内部类

    在类里面定义public class,可以获得外部类的私有属性和方法。

  • 静态内部类

    public static class,无法得到外部类的私有属性,因为static和外部类一起加载,内部类加载完了,外部类的属性还没加载,无法读取。除非把外部类的属性也定义为static

  • 局部内部类

    在方法里面定义个class

  • 匿名内部类

    没有名字初始化类,不用讲实例保存到变量中

posted @ 2022-07-05 11:41  20220629  阅读(56)  评论(0)    收藏  举报