面向对象OOP
继承
- 子类继承父类:会拥有父类的全部方法和公有属性(私有的属性和方法无法继承);
- Java中,所有类都直接或间接的继承Object类(Object属于超类);
- 在子类中,通过super.xxx调用父类的属性和方法(但无法调用私有的属性和方法);子类中,this指当前对象,this.xxx调用自身的属性和方法;
super
-
父类的构造方法必须在子类构造方法的第一行;
// 父类 public class Person { public Person() { System.out.println("父类的构造方法"); } } // 子类 public class Student extends Person { public Student() { // 调用父类的构造器,必须要在子类构造器方法的第一行, // 如果是无参构造方法,可以不用写出,new子类对象时,默认会调用父类的构造发方法 // super(); System.out.println("子类的构造方法"); } public static void main(String[] args) { Student son = new Student(); } } // 执行结果 // 父类的构造方法 // 子类的构造方法
-
如果父类中只有参构造方法,则在子类中必须通过super显式调用父类的有参构造;
// 父类 public class Person { public Person(String name) { System.out.println("父类的有参构造方法:" + name); } } // 子类 public class Student extends Person { public Student() { // 如果父类的构造方法为有参构造,则子类必须显示调用父类的无参构造 super("richard"); System.out.println("子类的构造方法"); } public static void main(String[] args) { Student son = new Student(); } } // 执行结果 // 父类的有参构造方法:richard // 子类的构造方法
重写
-
子类继承父类后,可以重写父类的非静态方法,即子类的方法和父类一致,只是方法体不同;
①方法名必须相同
②参数列表必须相同
③修饰符:范围可以扩大,但不能缩小;public > protected > default > private
④抛出的异常:异常范围可以缩小,但不能扩大
-
重写只是针对非静态方法,跟静态方法无关;
-
父类中的private的方法,子类无法重写;
多态
-
多态:父类的引用指向了子类的对象
public class Person { public void test() { System.out.println("Person => test()"); } } public class Student extends Person { public void test() { System.out.println("Student => test()"); } public static void main(String[] args) { Student student = new Student(); // 父类的引用指向了子类的对象 Person person = new Student(); } }
-
多态存在的条件:需要有继承关系,子类需要重写父类的方法
①static方法属于类,不属于实例对象,不能被重写;
②final修饰的属于常量,在常量池中,无法重写;
③private修饰的方法,也不能被重写;
instanceof 和 类型转换
-
instanceof主要用来判断一个“对象”属于什么“类”
①属于二元运算符
②运算符左边是“对象”,右边是“类”;如 person instanceof Student;
③当左边的对象是右边类(或子类)所创建的对象时,返回 true;
-
子类转换为父类,不需要强制转换,但可能会丢失一些方法(即向上转型)
-
父类转换为子类,需要强制转换;
static关键字
-
静态代码块,匿名代码块
-
静态导入包
import static java.lang.Math.random;
-
带final修饰的类,不能被继承
内部类
-
内部类可访问到外部内的私有属性;
public class Outer { private int id = 10_0000; public void out() { System.out.println("外部的out方法"); } public class Inner{ public void in() { System.out.println("内部的in方法"); } public int getId() { return id; } } public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); System.out.println(inner.getId()); } }
异常
Error
-
VitualMachineError
①stackOverFlowError:栈溢出错误
②outOfMemoryError:内存溢出
-
AWTError:跟图形化编程有关的错误
Exception
- 常见的异常如IOException,RuntimeException