面向对象的三大特征:
1.封装:将功能细节都封装起来,使用者不用关系功能的具体实现,只需要知道这个功能是什么,怎么使用即可
封装起来的功能可以被多次重复使用
例如:将数组排序的功能封装到一个方法中,需要为数组排序时,直接调用该方法即可,不用关心具体如何实现
2.继承:将多个类中共同的属性和方法定义在一个基类中,
要使用这些属性和方法的类,只需要继承该基类,
就可以直接使用基类中定义的属性和方法,不需要
再次定义
提高了代码的复用率,提高了扩展率
java中一个类只能有一个父类(单继承)
Java中所有的类都是有父类的,如果一个类没有通过rxtends指定父类,那么默认继承自Object类
Object类是java的根类
继承具有传递性,B继承自A,C继承自B,那么C中也可以直接使用A中的属性和方法,通过B来继承过来
3.多态
一个事物可以表现成不同的形态;例如人可以表现为男人、女人。
多态的体现:
1.重写:父类型中某个功能不太符合子类中现有需求,子类可以重新该方法
例如用不同动物都吃饭,但吃饭的行为不一致,不同的动物要按照自己行为来重新实现该功能
重写确定调用哪个方法是在运行时才能确定
2.重载:同一个类中某个方法需要有不同的参数列表
重载在编译期就能确定要调用的方法
3.父类型引用子类对象
//基类(父类、超类)superClass
class Animal{
//共有的属性和方法
int age;
void sleep() {
System.out.println("动物都需要休息:");
}
}
//Cat类是在Animal基础上进行了扩展
class Cat extends Animal{
void work(){
System.out.println("爱抓老鼠");
}
重载eat方法
方法名一样,参数个数不同或者对应位置的参数类型不同,属于重载
返回值不作为参考条件,范围值是否相同无所谓
void eat() {
System.out.println("自己出去找食物的流浪猫");
}
void eat(String food) {
System.out.println("需要主人喂养的宠物猫");
}
重写
1.重写的方法的返回值类型、方法名、参数列表和父类中被重写的方法保持一致
参数列表一致是指参数的个数,以及对应位置参数的数据类型一样即可:参数名无所谓
@Override:这是一个注释,改注释作用检查方法是否重写
@Override
void sleep() {
System.out.println("猫白天睡觉,晚上活动");
}
}
Cat cat = new Cat();
cat.age = 3;
System.out.println(cat.age);
cat.sleep();
Animal animal = new Animal();
//hashCode()方法继承自Object
animal.hashCode();
//如果子类重写了父类中的方法,调用时调用自己的
Cat cat = new Cat();
//如果子类重写了父类中的方法,调用时调用自己的
cat.sleep();
//根据实参不同来确定要调用的重载方法
//根据实参不同来确定要调用的重载方法
cat.eat();
cat.eat("猫粮");
//父类型引用子类对象
//父类型引用子类对象
Animal animal = new Cat();
//调用重写方法时,主要看new的对象的真实类型,例如此处真实类型为Cat
animal.sleep();
//如果父类和子类中定义了同名的成员变量,调用时,按照声明的类型来,例如此处声明的类型为Animal,所以调用的是Animal中的age
System.out.println(animal.age);
//在此处,子类中独有的方法,无法直接调用,只能使用声明类型中的方法和变量
//animal.eat();
//如果确实需要用到真实类型中独有的方法,我们可以通过强转类型来实现
//如果确实需要用到真实类型中独有的方法,我们可以通过强转类型来实现
Cat cat = (Cat)animal;
System.out.println(cat.age);
cat.eat();
//强转类型有风险,例如animal对象的类型并不是Cat时,如果强转Cat,在运行时就会报错
instanceof:判断对象是否是某个类型
例如
cat instanceof Animal 如果结果为true,说明是该类型,若为false就不是该类下
对象 instanceof 类名 自己的真实类型以及祖先类 结果都为true
if(animal instanceof cat) {
//说明animal的类型为Cat
System.out.println("animal对象类型为Cat");
Cat cat = (Cat)animal;
System.out.println(cat.age);
cat.eat();
}else {
System.out.println("animal对象的类型不是Cat");
}
MyArray ma = new MyArray();
int[] array = {1,3,4,8,7,6};
ma.sort(array);