Java面向对象
三大特性
- 封装:比如将成员变量用一个方法来进行存取,而不是直接对成员变量操作。
- 继承:子类拥有父类的所有方法以及成员。
- 多态:相同方法(名字、参数相同),但是在不同类中,他们执行的内容也可能不一样,比如动物类有个方法是叫声,而子类狗和子类猫继承动物类,虽然都有叫声方法,但是他们的叫声内容却不一样。
初始化和创建对象
//学生类
public class Student{
//成员
String name;
int age;
//方法
public void study(){
System.out.println(this.name + "在学习");
}
}
//项目启动类
public class Application{
public static void main(String[] args){
//创建对象
Student s = new Student();
//赋值
s.name = "小金刚";
s.name = 3;
//打印输出
System.out.println(s.age + "岁的" + s.name);
}
}
构造器
//学生类
public class Student{
//成员
String name;
int age;
//构造器方法名与类名相同,参数可有可无,类默认有一个无参构造器
//若写了有参构造,需要显示定义无参构造
//无参构造器
public Student(){
}
//有参构造器
public Student(String name, int age){
this.name = name;
this.age = age;
}
//IDEA可使用快捷键,ALT+insert来创建构造
}
封装
-
高内聚,低耦合。高内聚就是类内部数据操作细节自己完成,不允许外部干涉;低耦合就是仅暴露少量的方法给外部使用。
-
属性成员私有,用Get/Set进行存取。
继承
- 所有类默认直接或间接继承Object类。
- 关键字extands。
- Java只有单继承,没有多继承。
- 子类继承父类后,拥有父类全部方法(私有的不可以被继承)
快捷键 Ctrl + H 可以查看继承树。
重写
-
相同方法(名字、参数相同、方法体可不同),但是在不同类中。
-
修饰符:范围可以扩大但不能缩小, public > protected > default > private。
-
抛出异常:范围可以被缩小但不能扩大,例如 ClassNotFoundException < Exception(大)。
-
private方法、final常量和static 方法不可以重写。
-
静态方法重写(static):方法调用的时候只和左边,定义的数据类型有关,其实这不是叫重写。
-
非静态方法重写:才是真正的重写,和new 分配的数据类型有关。
多态
//Student类继承Person类
//Person类有run()方法
//Student类重写run()方法和自己独有的eat()方法
//类本身引用s1 能够调用的方法都是自己的或者继承父类的
Student s1 = new Student();
//父类型引用s2 不能调用子类独有的方法,调用被重写的方法的时候以右边子类型为准
person s2 = new Student();
s1.run();//可以执行,执行的是Student的run()方法
s2.run();//可以执行,执行的是Student的run()方法
s1.eat();//可以执行,执行的是Student的eat()方法
//s2.eat();//不可以执行会报错,需要类型强制转换
((Student) s2).eat();//可以执行,执行的是Student的eat()方法
Instanceof
//类型A X = new 类型B();
System.out.println(X instanceof Y);
- 编译是否通过,看X的左边定义类型与Y定义类型是否有父子关系。
- 结果T与F,取决于X的右边的定义类型与Y定义类型是否有父子关系。
注意:
- 父类引用转子类引用:强制转换。
- 子类引用转父类引用:可自动实现,但是可能会丢失子类独有的方法。
static
static定义的代码,在类初始化中,第一个被执行且只执行一次。
代码执行顺序:静态代码块(执行一次)>匿名代码块>构造方法。
静态导入包:
import static java.lang.Math.random; import static java.lang.Math.PI; pubic class Test{ public static void main(Stringp[] args){ //可以不通过Math.random(),可以直接方法名调用 System.out.println(random()); //可以不通过Math.PI,可以直接使用 System.out.println(PI); } }
抽象类abstract
- 抽象方法,用abstract修饰,只有方法名字,没有方法实现。
- 子类必须实现父类的所有抽象方法(除非子类也是抽象类,那就由子子类实现抽象方法)。
- 抽象类不能被实例化。
- 抽象方法一定要在抽象类里。
- 抽象类里可以有普通方法。
接口
- 关键字interface。
- 接口内的所有方法都是默认抽象abstract、public。
- 一个类可以有多个接口。
- 类必须实现接口的所有方法。
- 接口不能实例化。
内部类
A类中有B类,A类是B类的外部类,B类是A类的内部类。
- 成员内部类
- 静态内部类
- 匿名内部类
- 局部内部类