封装:
private实现属性的封装。当属性被private修饰后,只有在当前类内部可见。
提一下final终结器:之前在随笔2提到了,这里再补充一下
1.final修饰属性,表示该属性为常量,值不能让修改。
2.final修饰类,表示该类不能有子类。
3.final修改方法,表示该方法无法被覆写。
final一般也可以用作封装的手段。
继承:
继承的规则
.使用extends指定父类
.java中一个字类只能继承一个父亲
.子类会继承父类所有的public属性和方法
.对于父亲的private的属性和方法,子类中是无法访问的
类中属性,方法的继承与覆盖
1.属性的继承与覆盖
子类可以继承父类的所有非私有属性。
子类也可以覆盖继承的成员变量,对于子类可以从父类继承的成员变量,只要子类中定义的成员变量和父类中的成员变量同名,子类就覆盖了继承的成员变量。
当子类执行它自己定义的方法时,所操作的就是它自己定义的数据成员,,从而覆盖父类继承来的数据成员。
2.方法的继承与覆盖
父类中非私有( private )方法可以被子类所继承。
在子类继承父类的成员方法时,应注意一下两项:
*子类不能访问父类的 private 成员方法,但子类可以访问父类的 piblic ,protected 成员方法。
*访问 protected 时,子类和同一包内的方法都能访问父类的 protected 成员方法,但其他方法不能访问。
子类和父类之间,概念上的关系是is-a的关系。
方法的覆盖是指子类中定义一个方法,并且这个方法的名字,返回类型,参数列表与父类继承的方法完全相同。
注意事项
1.重写和重载完全不一样。
2.普通方法可以重写,static修饰的静态方法不能重写。
3.重写中子类的方法的访问权限不能低于父类的方法的访问权限。
4.重写的方法返回值类型一定和父类的方法相同。
另外,针对重写的方法,可以使用@override注解来显式指定,有了这个注解能帮我们进行一些合法性校验,例如不小心将方法名字拼写错了,那么编译器就会发现父类中没有这个方法,就会编译报错,提示无法构成重写。
这里说一下super()
因为子类不能继承父类的构造方法。
如果父类中没有默认构造方法或希望调用带参数的父类构造方法,要使用关键字super来显示调用父类方法。使用关键字super来调用父类构造方法的语句,必须是子类构造方法的第一个可执行语句。调用父类构造方法时,传递的参数不能是关键字this或当前对象的非静态成员。
多态:
所谓多态,一种方法多种状态,多态一般主要是向上转型+复写
向上转型
父类名称 父类引用 = new 子类实例();
/**
* 多态的学习测试 向上转型
*/
//用法:产生对象时
public class Test {
public static void main(String[] args) {
Animal animal = new Animal("动物",0);
Animal Dog = new Dog("狗",3);
Animal Cat = new Cat("猫",2);
animal.eat("食物");
Dog.eat("狗粮");
Cat.eat("猫粮");
}
//用法:方法返回值
public static Animal test(){
return new Dog("汪",3);
}
//用法 方法参数传递
public static void fun(Animal animal,String food){
animal.eat(food);
}
}
向下转型(必须使用了向上转型,才能使用向下转型):
//向上转型
Animal animal = New Dog();
//向下转型
Dog dog = (dog) Animal;
一般需要使用子类独有的方法时,才把它向下转型
向下转型是有风险的,如果强转的类型没有关系,则一定会出错
例:Dog dog = new Dog();
Cat cat = (cat)dog: 出错
这里说下instanceof