抽象类
/*
通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;
定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;
如果不实现抽象方法,则该子类仍是一个抽象类;
面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。
*/
public class Object1{
public static void main(String[] args) {
Person p = new Student();
p.run();
}
}
// abstract修饰的类叫抽象类
abstract class Person{
public abstract void run(); // 抽象方法
}
class Student extends Person{
@Override
public void run() {
System.out.println("Student.run");
}
}
接口
// 抽象类与接口的对比
abstract class interface
继承 只能extends一个class 可以implements多个interface
字段 可以定义实例字段 不能定义实例字段
抽象方法 可以定义抽象方法 可以定义抽象方法
非抽象方法 可以定义非抽象方法 可以定义default方法
// 接口的继承
interface Hello {
void hello();
}
interface Person extends Hello {
void run();
String getName();
}
// default方法
public class Object1{
public static void main(String[] args) {
Person p = new Student("xiao wang");
p.run();
}
}
interface Person{
String getName(); // 可以省略前面修饰的public abstract
/*
* default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。
* 如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。*/
default void run() {
System.out.println(getName() + " run");
}
}
// 实现接口需要用到implements关键字,
// 一个类可以实现多个接口class Student implements Person Hello{
class Student implements Person {
private String name;
public Student(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
静态字段和静态方法
// 静态字段实例
public class Object1{
public static void main(String[] args) {
Person p = new Person("小王",21);
Person m = new Person("小帅",24);
//p.number = 100;
//System.out.println(p.number);
//m.number = 1000;
//System.out.println(m.number);
/*
* 通过演示我们发现 实例变量.静态字段 能够去访问静态字段;实例变量并没有该字段,
* 这是因为编译器会根据实例类型自动转换为 类名.静态字段 来访问静态对象
* 因此,建议直接用 类名.静态字段 来访问静态对象*/
Person.number = 100;
System.out.println(Person.number);
}
}
class Person{
public String name;
public int age;
public static int number; // 静态字段
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
// 静态方法
// 调用静态方法不需要实例,无法访问this,但可以访问静态字段和其他静态方法;
public class Object1{
public static void main(String[] args) {
Person.setNumber(100);
System.out.println(Person.number);
}
}
class Person{
public static int number;
// 用static修饰的方法称为静态方法
public static void setNumber(int value){
number = value;
}
}
// 接口的静态字段
// 接口不能定义实例字段。但是可以有静态字段
public interface Person {
//public static final int MALE = 1;
//public static final int FEMALE = 2;
// 编译器会自动加上public statc final:
int MALE = 1;
int FEMALE = 2;
}