类与对象
-
访问修饰符:
default 就是没有显式标明访问修饰符的情况下
-
构造方法
- 方法名与类名相同,无返回值。
- 在实例化对象的时候,系统会自动调用无参构造,并给成员变量赋予初始值。如果定义了构造方法,则系统不会调用默认无参构造,而是会去寻找相匹配的构造方法并调用,如果不存在相匹配的构造方法,则会报错。
- 对于子类对象的创建,会先调用父类默认无参构造,如果父类中定义了构造方法,子类中则需要使用super显示调用父类构造方法。
-
this 关键字
- 只能调用本类的成员变量或成员方法(适当使用,以达到见名知意的效果)
- 不能在静态方法中使用,也不能调用静态成员变量。静态成员变量是先对象存在的。
- 只能在方法中使用
- 可以使用this关键字,调用重载构造方法,但必须写在第一句。
-
static 关键字
- 被static 修饰的方法和字段是先于对象存在的
- 调用方式
- 类名. 静态成员变量名/ 静态成员变量方法(当然访问修饰符不能是private的)
- 对象名. 静态成员变量名 / 静态成员变量方法
- 静态成员变量
- 是属于类的,在装载类定义代码时,系统为静态成员变量分配独立的存储空间,所有属于这个类的对象对共享这个存储空间。
- 静态成员方法
- 在静态成员方法中不能调用非静态成员变量,理由还是那个静态成员方法是先于对象存在的,可以使用类名调用,而非静态成员变量需要对象被创建之后才可以被访问。
- 静态代码块
-
静态代码块在类被装载的时候执行,类只装载一次,所以静态代码块也只执行一次
-
调用顺序:父类静态代码块 > 子类静态代码块 > 父类非静态代码块 > 父类构造方法 > 子类非静态代码块 > 子类构造方法。
-
代码演示
package com.company; import java.io.*; import java.util.Scanner; public class Test { public static void main(String[] args) throws IOException { Student student = new Student(); } } class Person { int age; String name; static { System.out.println("调用了父类静态代码块"); } { System.out.println("调用了父类非静态代码块"); } public Person () { System.out.println("调用了父类构造方法"); } public Person(int age, String name) { this.age = age; this.name = name; } } class Student extends Person { private static String sid; static { System.out.println("调用了子类静态代码块"); } { System.out.println("调用了子类非静态代码块"); } public Student() { System.out.println("调用了子类构造方法"); } public Student(int age,String name,String sid) { super(age,name); this.sid = sid; } public static void show() { System.out.println("调用静态方法"); } }
结果演示 :
-
继承和多态
-
子类会继承除父类构造方法外的所有属性和方法
- private 属性也会继承,只是无法使用
-
子类重写父类方法 (方法重写 / 方法覆盖)
- 原则:两同两小一大
- 两同 : 方法名相同,参数类型相同。
- 两小
- 抛出异常小于等于父类抛出异常
- 子类返回值类型小于等于父类方法返回值,必须是父类返回值的派生类 (但是返回值是基本数据类型还是要相等的)
- 一大
- 子类方法的访问权限应大于等于父类方法访问权限
- 原则:两同两小一大
-
子类构造方法
- 对于子类对象的创建,会先调用父类默认无参构造,如果父类中定义了有参构造方法,子类中则需要使用super显示调用父类构造方法。
-
super 关键字
-
使用此关键字,表明调用的父类的方法。
-
切记,只有使用了super关键字才是调用父类中的方法。
-
出个题,代码演示
package com.company; import java.io.*; import java.util.Scanner; public class Test { public static void main(String[] args) throws IOException { Student student = new Student(); student.show(); } } class Person { int age; String name; public void show() { showA(); } public void showA() { System.out.println("父类中的A"); } } class Student extends Person { private static String sid; public void show() { super.show(); } public void showA() { System.out.println("子类中的A"); } }
结果显示:
-
-
继承
- 一般父类使用默认访问权限,子类继承父类属性和方法,然后添加一个自己的属性。 同样子类在构造方法中调用父类构造方法,然后再初始化自己的属性。
-
抽象类
- 一个类被abstract 修饰
- 可以有一般方法,也可以有成员变量,至少包含一个抽象方法。
- 注意
- 抽象类不能实例化对象
- 子类继承抽象类,要么实现其抽象方法,要么也声明为抽象类
-
接口
- 默认访问修饰符是public
- 接口的成员变量的访问修饰符默认是public static final
- 接口的成员方法的访问修饰符默认是public abstract
-
包
- 在导包之前可以有包定义 (刷题有碰到过这种题目)
资料参考:
方法重写