昨天内容回顾:
1、多态
掌握多态的体现形式:父类引用指向子类对象。
父类 对象名=new 子类();
2、抽象类
定义格式:
public abstract class 类名{
public abstract void eat();
}
创建对象:
抽象类 对象名=new 子类();
3、接口
定义接口的格式以及实现类来实现接口的格式:
public interface 接口名{
void speak();//默认省略了public abstract
}
创建实现类实现接口:
public class 实现类名 implements 接口名,接口名,...{
//重写接口中所有的抽象方法
}
创建对象:
接口名 对象名=new 实现类();
类和类的关系:继承关系(extends),单继承,可以多层继承。
类和接口的关系:实现关系(implements),可以多实现。
接口和接口的关系:继承关系,可以多继承。
今日内容
1、引用数据类型作为方法的形参和返回值(重点)
普通类:
作为形参:传递的是类或者子类对象,也即是将new 出来的对象传递给方法。
作为返回值:返回的也是类或者子类的对象。
抽象类:
作为形参:传递的是子类的对象。
作为返回值:返回的也是子类的对象。
接口:
作为形参:传递的是实现类的对象。
作为返回值:返回的也是实现类的对象。
总结:如果形参或者返回值是普通类类型,传递或者返回的就是该类或其子类对象。
如果形参或者返回值是抽象类类型,传递或者返回的就是它子类对象。
如果形参或者返回值是接口类型,传递或者返回的就是它实现类对象。
2、内部类:
概念:在一个类内部定义的类就叫做内部类。内部类可以分为:成员内部类、局部内部类、匿名内部类。
内部类的目的:一般只需要在当前类中使用某个类的对象,那么这个类就可以定义成内部类,而且被private修饰,外面无法直接访问。
成员内部类:(次要)在类中方法外定义的内部类就是成员内部类。
注意:
如果成员内部类是public修饰的,那么外界可以直接访问。 外部类.内部类 对象名=new 外部类().new 内部类();
如果成员内部类是public static 修饰的,外界也可以直接访问。 外部类.内部类 对象名=new 外部类.内部类();
如果成员内部类是private修饰的,那么外界无法直接方法,只能在内部类所在的外部类创建该内部类对象。
局部内部类:(了解)在方法内部创建的类就是局部内部类。
匿名内部类:(重点):一般在开发中使用匿名内部类的形式创建抽象类的子类对象或者接口的实现类对象。仅仅只是简化书写子类或者实现类的过程。
常见用法:作为方法的参数值传递
//创建饲养员类,让动物吃东西
AnimalOperator operator=new AnimalOperator();
//调用useAnimal方法操作动物吃东西
operator.useAnimal(new Animal() {
@Override
public void eat() {
System.out.println("?吃骨头");
}
});
上午内容总结:
1、引用数据类型作为方法的参数和返回值
只要是引用数据类型作为方法的参数和返回值,传递或者返回的永远是对象。如果是普通类,那么传递和返回的是该类或者它子类的对象。
如果是抽象类,那么传递和返回的是该类的子类对象。如果是接口,那么传递和返回的是它的实现类对象。
2、内部类:
成员内部类:定义在类中方法外的类叫做成员内部类。
局部内部类:定义在方法内部的类叫做局部内部类。
匿名内部类:不需要定义子类或者实现类,直接通过匿名内部类的方法创建子类或者实现类对象。
语法:
类/接口 变量名=new 类/接口(){
//重写的方法
}
开发中的使用场景:将匿名内部类对象作为方法的参数值使用
3、常用api:(知道每个类是干什么用的,会查api文档即可)
Math:跟数学运算相关的对象
public static double ceil(double a):向上取整
public static double floor(double a):向下取整
System:
static long currentTimeMillis() :获取系统当前时间的毫秒值。
毫秒值:比秒还小一级的时间单位,1秒=1000毫秒。这里获取的毫秒值是距离1970年1月1日0点0分0秒0的值
Object:所有的类的父类(超类、基类)。所有类都直接或者间接继承了Object类:
String toString():返回对象的字符串表示形式
所有对象都可以调用toString方法,如果该类重写了toString方法(Alt+Insert/ins生成),那么返回的结果就是成员变量的内容。
如果没有重写toString方法,那么返回的是该对象的地址值。
ps:System.out.println(对象名);实际上会调用对象的toString方法。
boolean equals(Object obj):指示一些其他对象是否等于此。
所有对象都可以调用equals方法,如果该类没有重写equals方法,那么比较的是对象的地址值。如果需要比较对象的内容,那么就需要重写
该方法(Alt+Insert/ins生成)。
ps:String类就重写了equals方法,所以比较字符串的时候使用的是equals方法而不是==比较。
例如:
//重写equals方法
@Override
public boolean equals(Object o) {
//比较当前对象和传进来的对象地址值是否一样,如果以及就为true。
if (this == o) return true;
//判断当前对象的类型和传进来的对象类型是否一样。如果不一样,后面就不能将o转换成Person
// if (o == null || getClass() != o.getClass()) return false;
//等价于这种写法
if(o==null || !(o instanceof Person)){
return false;
}
//将传进来的对象转换成Person类型
Person person = (Person) o;
//比较年龄和姓名
return age == person.age &&
Objects.equals(name, person.name);
}
Arrays:该类包含用于操作数组的各种方法(如排序和搜索)
static void sort(int[] a):排序方法,从小到大排序
static String toString(任意类型数组):将数组中的内容以字符串的形式输出,如果数组是对象类型的数组,那么会调用每个对象的toString方法
类似于Math、Arrays类,它们不需要创建对象,方法都是静态方法,这种类我们可以把它称作工具类。
1、构造方法都被private修饰
2、方法都是public static修饰的。
3、有的工具类还会被final修饰,不能被继承。