2.java三大特性

1. 封装

方法:将属性值修饰为私有,提供get和set方法。造成所有对对象的访问都是通过方法的调用来完成(配合this的使用)
结果:用户不能直接随意改变一个对象内的属性,必须通过调用方法(验证)来访问和修改

2. 面向对象三大特性:继承

    关键字 extents 
    修饰符|使用范围    |继承与否
                    ---|--:|---
    Public| 公开使用    |可以继承|
    Protected|在本类、同包其它类和子类、其它包的子类|可以继承
    (default)|在本类、同包其它类|包的子类中可以                             承
    Private|在本类内部使用|不能被继承(实际被继承,无权访问)       
注意:构造方法不
能被继承
继承的对象创建过程:
    C extends B 
    B extends A
    创建C 对象: //不考虑静态代码块,若有静态代码块,先通过递归的由基类到派生类加载代码块分配空间
    初始化A的属性
    调用A的构造方法
    初始化B的属性
    调用B的构造方法(默认调用A的构造,super())
        初始化C的属性
        调用C的构造方法(默认调用B的构造,super())     
    方法覆盖:
    定义:子类用自己的方法实现替换掉能继承自父类的方法实现
    要求:方法名相同、参数表相同、返回值类型相同、(访问修饰符相同或范围更广)
    this关键字的使用
        - 本身是引用,代表当前对象。在类中访问自己的属性和方法时,如果不加this,则自动默认this调用,当在局部方法内出现与类属性同名的局部变量时,如            加this表示类的成员变量,不加则代表是局部变量。
        - 调用本类的无参构造方法
        - this(…),调用本类中其他相应参数表的构造方法
       注意:在使用this时,必须将this关键字放在构造方法内的第一行

    Super关键字:
    是个引用,指向父类的对象,用例调用父类的方法,super.父类方法( ),super须在方法内使用
    可以用在构造方法内,指明调用父类的构造方法,用法和this相同。但必须放在构造函数的第一行,

例子:

class A {
    public A(int i){}
}
class B extends A{
}   

程序出错,系统默认为
class A {
    public A(int i){}
}
class B extends A{
    public B(){
        super();
    }
}

3. 面向对象三大特性:多态

    没有继承就没有多态
Java实行的单继承
多态的开闭原则:(继承和多态)对修改关闭,对扩展开放
利用多态,可以使代码针对父亲展开编程,使代码更通用
多态的两种常见的应用场景:
    把多态应用在方法的参数上:
        m (A a) :方法可以接受A类,也可以接受A的子类对象

    把多态应用在方法的返回值类型上:
        A m() :方法返回的可以是A类或A类的某个子类对象

例子:父类对象引用子类对象,以方便扩展新的子类而不需改变方法代码:
例子1:
public class test {
    public static void main(String[] args) {    
        Animal dog = new Dog();
        Animal cat = new Cat();
        eats(dog);
        eats(cat);
    }
    static void eats(Animal animal){
        animal.eat();
    }
}
class Animal {
    public void eat(){
        System.out.println("吃的方法");
    }
}
class Dog extends Animal {
    public void eat(){
        System.out.println("狗吃骨头");
    }
}
class Cat extends Animal{
    public void eat(){
        System.out.println("猫吃小鱼");
    }
}
例子2
public class ExcEmployee{
    public static void main(String[] args){
        Employee[] es = new Employee[4];
        es[0] = new ProductEmployee("Yangdd",31);
        es[1] = new SalesEmployee("Wucj",36);
        es[2] = new ManageEmployee("Xusy",29);
        es[3] = new CeoEmployee("Huxz" , 16);
        for(int i = 0 ; i <es.length ; i++){
            es[i].work();
        }
        double result = 0 ; 
        int count = 0;
        for(int i = 0 ; i < es.length ; i++){
            if (es[i] instanceof ManageEmployee){
                count++;
                result+=es[i].getAge();
            }
        }
        System.out.println(result/count);  //平均年龄
    }
}
class Employee{
    private String name;
    private int age;
    public Employee(){}
    public Employee(String name){this.name = name;}
    public Employee(String name , int age){ this(name);this.age = age;}
    public int getAge(){    return age;}
    public void setAge(int age){this.age=age;}
    public void work(){ }
}
class ProductEmployee extends Employee{
    public ProductEmployee(String name , int age){super(name,age);}
    public void work(){ System.out.println("在车间劳动");}
}
class SalesEmployee extends Employee{
    public SalesEmployee(String name , int age){super(name,age);}   
    public void work(){ System.out.println("出差跑客户");}
}
class ManageEmployee extends Employee{
    public ManageEmployee(String name , int age){super(name,age);}  
    public void work(){ System.out.println("在办公室斗地主");}
}
class CeoEmployee extends ManageEmployee{
    public CeoEmployee(String name , int age){  super(name,age);}   
    public void work(){ System.out.println("在会议室开会");}  
}

猜你喜欢

转载自www.cnblogs.com/linanana/p/12075295.html