Java面向对象2
面向对象2
static总结
-
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个对象 } }- 静态的方法/变量可以直接通过类去调用,而非静态的变量需要通过类的实例去调用
- 如果在同一个类里,静态方法可以直接用
-
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对象就不执行了
-
//静态导入包 //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关键字来创建对象的,它是用来让子类继承的
- 抽象方法只有方法的声明,没有方法的实现,它是用来让子类实现的
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类
思考:
-
既然抽象类不能new,那么抽象类存在构造器么?
一定是存在的,因为抽象类要有子类去继承它,子类不一定是抽象类,那么就会有构造器,而子类构造器的第一句话就是super(),所以如果抽象类没有构造器,子类的构造器也就无法实现。
-
抽象类存在的意义?
利于代码的维护和重用。抽象类用来表征对问题的抽象概念,是本质上相同的具体概念抽象。抽象类不仅可以把一些具有相同属性和方法的组件进行抽象,而且当又有一个具有相似的组件产生时,只需要实现该抽象类就可以获得该抽象类的那些属性和方法。
接口
| 普通类 | 抽象类 | 接口 |
|---|---|---|
| 只有具体实现 | 具体实现和规范(抽象方法)都有 | 只有规范,自己无法写方法 |
接口就是规范,定义的是一组规则,体现了现实生活中“如果你是...则必须能...”的思想。
接口的本质是契约,如同人类世界的法律,制定好之后大家都要去遵守
接口是面向对象的精髓,是对对象的抽象
接口声明的关键字: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
-
匿名内部类
没有名字初始化类,不用讲实例保存到变量中

浙公网安备 33010602011771号