访问控制符:
private、default、protected、public
同一个类中 √ √ √
√
同一个包中 √ √
√
子类中 √ √
全局范围
√
访问控制符来控制:Field、方法、构造器能否被其他类访问到。
面向对象三大特征:
1、封装:
将对象的状态信息隐藏在对象内部,不允许外部程序直接访问,只可以通过该类提供的方法来对内部信息进行操作和访问。
class DemoA {
// 通过访问控制符,将Field隐藏,外界无法访问
private int age;
//通过getter、setter方法,提供对Field的操作、访问
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<0){
System.out.println("输入的参数不合法");
}
else {
this.age = age;
}
}
}public class OOP {
public static void main(String[] args) {
DemoA demoA = new DemoA();
demoA.setAge(100);
System.out.println(demoA.getAge());
}
}
2、继承
所谓的继承通过extends关键字来实现,子类可以获得父类中所有可以被继承的Field和方法。
Field:
当子类中定义和父类相同的Field的时候,子类中的Field将会隐藏父类中的Field。
class SuperClass {public int weight = 2;
}
class SubClass extends SuperClass {
public int weight = 3;
public void info() {
//调用父类的weight
System.out.println("this weight super:" + super.weight);
//调用子类的weight
System.out.println("this weight sub:" + weight);
}}
public class ExtendsDemo {
public static void main(String[] args) {
SubClass subClass = new SubClass();
subClass.info();}
}
Field的访问顺序:
1、(如果在方法中)查找该方法中是否存在该局部变量
2、查找当前类是否存在该Field
3、查找该类的直接父类,是否存在该Field,依此类推,知道追溯到java.lang.Object,没有就报错。
Methd:
子类可以继承得到父类的可被继承的方法,同时可以覆盖父类中继承过来的方法。
class Bird{
public void fly(){
System.out.println("Bird can fly");
}
}class Ostrich extends Bird{
public void fly() {
System.out.println("Ostrich can not fly");
}
//通过super来调用被覆盖的父类的方法
public void fly2(){
super.fly();
}
}
public class ExtendsDemo2 {
public static void main(String[] args) {
Ostrich ostrich = new Ostrich();
ostrich.fly();
ostrich.fly2();
}
}
子类在覆写父类的方法时,遵守如下约定:
“两同两小一大”
“两同”:方法名相同、形参列表相同
“两小”:返回值类型更小或者相等、异常更小或者相等
“一大”:访问权限更大或者相等
3、多态
java引用变量有两个类型:一个是编译时类型;一个是运行时类型。当编译时类型与运行时类型不一致的时候,就会出现所谓的多态。