面向对象
快捷键ctrl + h产生一个页面列出类与类之间的继承关系
java中只存在单继承不存在多继承的情况(接口除外)
如果要调用父类的构造器的话用关键字super(),但是要位于子类构造函数中的第一行
supper注意点
- supper调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造函数中
- super和this不能同时调用构造方法
重写
静态方法和非静态方法是有着很大的区别的
- 静态方法: 方法的调用只和左边定义的数据类型有关即如果定义的类型是父类指向子类的定义的话调用的是父类的静态方法
- 非静态的方法是重写,子类重写父类的方法。
重写的注意事项:
- 方法名必须相同
- 参数列表必须相同
- 修饰符范围可以扩大但是不能缩小:public>protected>default>private
- 抛出的异常范围可以被缩小但是不能扩大
public class Animal {
public String name; // 名字
public int age; // 年龄
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getInfo() {
return "我叫" + name + ",今年" + age + "岁了。";
}
}
子类 Cat 的代码如下:
public class Cat extends Animal {
private String hobby;
public Cat(String name, int age, String hobby) {
super(name, age);
this.hobby = hobby;
}
public String getInfo() {
return "喵!大家好!我叫" + this.name + ",我今年" + this.age + "岁了,我爱吃" + hobby + "。";
}
public static void main(String[] args) {
Animal animal = new Cat("小白", 2, "鱼");
System.out.println(animal.getInfo());
}
}
如上述代码,在 Animal 类中定义了一个返回值类型为 String、名称为 getInfo() 的方法,而 Cat 类继承自该类,因此 Cat 类同样含有与 Animal 类中相同的 getInfo() 方法。但是我们在 Cat 类中又重新定义了一个 getInfo() 方法,即重写了父类中的 getInfo() 方法。
在 main() 方法中,创建了 Cat 类的对象 animal,并调用了 getInfo() 方法。输出的结果如下:
喵!大家好!我叫小白,我今年2岁了,我爱吃鱼。
多态
- 多态是方法的多态,属性是没有多态的
- 父类和子类,有联系,类型之间要是可以转换的类型
- 存在条件是:继承关系,方法需要重写,父类的引用指向的子类
- static 方法属于类不属于实例
- final 常量
- private 方法
类型之间的转换:父类不能直接调用子类的方法需要类型转换之后才能调用也就是向下转换。
子类转换父类可能会丢失一些方法
注意事项:
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型,需要其强制转换
- 方便方法的调用,减少重复的代码
抽象类
抽象类的的方法必须在子类实现不然会报错的
- 关键字是abstract不能new出来只能靠子类实现:约束
- 抽象类中可以写普通的方法
- 抽象方法必须在抽象类中
- 抽象的抽象约束
接口
之后规范自己不能写方法,约束和实现是分离的,面向接口编程
接口的关键词是interface
- 接口的所有定义是抽象的默认的是public abstract
- 一个类可以实现一个接口他的关键词是implements,快速实现接口中的方法的快捷键是Ctrl+i
另外直接生成类的属性的get和set方法的快捷键是Ctrl+insert要选中你要指定的get和set方法时要按住ctrl才能选中多个实现
- 接口是可以实现多继承的
作用
- 约束
- 定义一些方法,让不同的人实现
- 定义方法的都是public abstract但是是默认指定的不用显示的写出来也只能实现这一种方法
- 定义的属性都是public static final的同样不用显示的指定
- 接口不能实例化
- 可以实现多个接口
- 必须要重写接口的所以方法