多态
//dog
public void lookHome(){
System.out.println("狗看家!");
}
@Override
public void eat(String something) {
System.out.println(getAge()+"岁的"+getColor()+"颜色的狗俩只前腿死死的抱住"+something+"猛吃");
}
//cat
public void catchMouse(){
System.out.println("逮老鼠!");
}
@Override
public void eat(String something) {
System.out.println(getAge()+"岁的"+getColor()+"颜色的猫咪眯着眼睛侧着头吃"+something);
}
//person
public void keepPet(Animal animal,String something){
if(animal instanceof Dog dog){
System.out.println("年龄为"+this.age+"岁的"+this.name+"养了一只"+dog.getColor()+"颜色的"+dog.getAge()+"岁的狗");
dog.eat(something);
}else if(animal instanceof Cat cat){
System.out.println("年龄为"+this.age+"岁的"+this.name+"养了一只"+cat.getColor()+"颜色的"+cat.getAge()+"岁的猫");
cat.eat(something);
}else{
System.out.println("没有这种动物!");
}
}
//test
public static void main(String[] args) {
// 老王
Person laowang = new Person("老王", 30);
// 老李
Person laoli = new Person("老李", 25);
// 黑色的2岁的狗
Animal dog = new Dog(2, "黑");
// 灰色的3岁的猫
Animal cat = new Cat(3, "灰");
laowang.keepPet(dog, "骨头");
laoli.keepPet(cat, "鱼干");
}
包
1、包就是文件夹,用来管理各种不同功能的Java类,方便后期代码维护
2、包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意。com.itheima.domain
3、全类名指的是,例:com.itheima.domain.Student
4、使用其他类的规则:
- 使用同一个包中的类时,不需要导包
- 使用Java.lang包中的类时,不需要导包
- 其他情况都需要导包
- 如果同时使用俩个包中的同名类,需要用全类名
final
- 方法:表明该方法是最终方法,不能被重写
- 类:表明该类是最终类,不能被继承
- 变量:表明这是一个常量,只能被赋值一次
常量
1、常量一般为系统的配置信息,方便维护,提高可读性
2、命名规范:
- 单个单词:全部大写
- 多个单词:全部大写,单词之间用下划线隔开
3、final修饰的变量是基本类型,那么变量存储的数据值不能发生改变
4、final修饰的变量是引用类型,那么变量存储的地址值不能发生改变,对象内部的可以改变
权限修饰符
修饰符 | 同一个类 | 同一个包中其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | 可 | |||
默认 | 可 | 可 | ||
protected | 可 | 可 | 可 | |
public | 可 | 可 | 可 | 可 |
使用规则
实际开发中,一般只用private和public
- 成员变量私有
- 方法公开
特例:如果方法中的代码时抽取其他方法中共性代码,这个方法一般也私有
代码块
- 局部代码块
- 构造代码块
- 静态代码块
静态代码块
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景:在类加载的时候,做一些数据初始化的时候使用
static ArrayList<User> list =new ArrayList<>();
static {
list.add(new User(......));
}
//只会执行一次
抽象方法
- 抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样的,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法
- 抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类
抽象类和抽象方法的定义格式
-
抽象方法的定义格式
public abstract 返回值类型 方法名(参数列表);
-
抽象类的定义格式:
public abstract class 类名 {}
抽象类和抽象方法的注意事项
- 抽象类不能实例化
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 可以有构造方法
- 抽象类的子类
- 要么重写抽象类中所有抽象方法
- 要么是抽象类
接口的定义和使用
- 接口用关键字interface来定义
public interface 接口名 {}
-
接口不能是实例化
-
接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名 {}
-
接口的子类(实现类)
要么重写接口中的所有抽象方法
要么是抽象类
注意1:接口和类的实现关系,可以单实现,也可以多实现
public class 类名 Implements 接口名1,接口名2 {}
注意2:实现类还可以在继承一个类的同时实现多个接口
public class 类名 extends 父类 implements 接口名1,接口名2 {}
接口中成员的特点
- 成员变量
- 只能是常量
- 默认修饰符:public static final
- 构造方法
- 没有
- 成员方法
- 只能是抽象方法
- 默认修饰符:public abstract
1、导入模块
选中iml文件导入
2、小写字母变大写
ctrl+shift+u