Java 封装 继承

1.封装

    封装(Encapsulation):是类的三大特征之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问.简而言之就是隐藏对象的属性和实现细节,仅对外提供公共访问方式.

   封装的具体步骤:修改属性的可见性来限制对属性的访问;为每个属性创建一对赋值(setter)方法和取值(getter)方法,用于对这些属性的存取;在赋值方法中,加入对属性的存取控制语句.

    封装的好处主要有:隐藏类的实现细节;让使用者只能通过程序员规定的方法来访问数据;可以方便的加入存取控制语句,限制不合理操作.

    封装时的权限控制符区别如下:

       private:成员变量和方法只能在类内被访问,具有类可见性.

       default:成员变量和方法只能被同一个包里的类访问,具有包可见性.

       protected:可以被同一个包中的类访问,被同一个项目中不同包中的子类访问.

       public:可以被同一个项目中所有类访问,具有项目可见性,这是最大的访问权限.

举例:

Penguin类和Dog类图



    封装代码:

       public class Dog

{

    /*

     * 封装演示

     * */

  

    //私有化属性

    private Stringname;

    private Stringsex;

    private Stringcolor;

  

    //封装字段

    public StringgetName()

    {

        returnname;

    }

    public voidsetName(String name)

    {

        this.name = name;

    }

    public StringgetSex()

    {

        returnsex;

    }

    public voidsetSex(String sex)

    {

        this.sex = sex;

    }

    public StringgetColor()

    {

        returncolor;

    }

    public voidsetColor(String color)

    {

        this.color = color;

    }

}



Penguin类同理

2.继承

语法:

修饰符SubClass extends SuperClass{

    //类定义部分

}

    在java中,继承通过extends关键字来实现,其中SubClass称为子类,SuperClass称为父类,基类,或超类.修饰符如果是public,该类在整个项目中可见;不写public修饰符则该类只在当前包可前;不可以使用private和protected修饰符.

    继承(Inheritance):是java中实现代码重用的重要手段之一.java中只支持单继承,即每个类只能有一个父类.继承表达的是isa的关系,或者说是一种特殊和一般的关系.

    在java中,所有的java类都直接或间的接的继承了java.lang.long.Object类.Object类是所有java类的祖先.在定义一个类时,没有使用extends关键字,那么这个类直接继承Object类.

    在java中,子类可以从父类中继承的有:

        继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里.

        继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里.

子类无法继承父类的有:

        无法继承private修饰的属性和方法

          无法继承父类的构造方法

     如果从父类继承的方法不能满足子类的需求,在子类中可以对父类的同名方法进行重写(覆盖),以符合要求.

    抽象出Dog类和Penguin类和父类Pet类(Pet类为抽象类,不能被实例化)




/*

* Dog和Penguin的父类Pet,而Pet对象是没有意义的,只是抽象出来的一个概念,国此给Pet类添* 加abstract修饰符,让其成为一个抽象类,抽象不能被实例化.

* */



public abstract class Pet

{

    //私有化属性

    private Stringname;

    private Stringsex;

  

    //封装字段

    public StringgetName()

    {

        returnname;

    }

    public voidsetName(String name)

    {

        this.name = name;

    }

    public StringgetSex()

    {

        returnsex;

    }

    public voidsetSex(String sex)

    {

        this.sex = sex;

    }

  

    //无参构造方法

    public Pet()

    {

      

    }

  

    /*

     * 有参构造方法

     * @param name 名称

     * @param sex 性别

     *

     * */

    publicPet(String name, String sex)

    {

        this.setName(name);

        this.setSex(sex);

    }

  

//Pet类的抽象方法eat(),抽象方法必需被子类重写

    publicabstract void eat()



    //final修饰的方法不能被子类重写

    publicfinalvoid println()

{

    //方法体…

}



}



//狗继承动物类

class Dog extends Pet

{

    private Stringcolor;



    //封装字段

    public StringgetColor()

    {

        returncolor;

    }



    public voidsetColor(String color)

    {

        this.color = color;

    }

  

    //无参构造方法

    public Dog()

    {

      

    }

  

    //有参构造方法

    publicDog(String name, String sex, String color)

    {

        //传参到父类的构造方法,此处不能用this.name = name.....

        super(name,sex);

      

        //调用setColor()方法给属性color赋值

        this.setColor(color);

    }

  

    //重写父类eat()方法

    public void eat()

    {

        //方法体....

    }

}



//企鹅继承动物类

class Penguinextends Pet

{

    private double weight;



    public doublegetWeight()

    {

        returnweight;

    }



    public voidsetWeight(double weight)

    {

        this.weight = weight;

    }

    //重写父类eat()方法



    public void eat()

{

        //方法体….



}



}



//测试类Test

class Test

{

    public static voidmain(String[] args)

    {

        String name= "dog1";

        String sex ="男";

        String color= "red";

      

        //实例化对象

        Dog dog = new Dog();

      

        dog.setName(name);  //通过从父类处继承来的方法设置dog的属性name

        dog.setSex(sex);

      

        //通过有参构造函数实例化对象

        Dog dog1 = new Dog("dogName","man", "black");

      

        //调用eat()方法,此方法被重写了

        dog1.eat();

    }

}

继承条件下构造方法调用规则如下

       如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造 方法.在这种情况下写不写super()语句效果都是一样.

       如果子类的构造方法中通过super显示调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法.

       如果子类的构造方法中通过this显示调用自身的其他构造方法,在相应 构造方法中应用以上两条规则.

       特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止.

       abstract和final是功能相反的两个关键字,abstract可以用来修饰类和方法,不能用来修饰属性和构造方法.final可以用来修饰类,方法和属性,不能修饰构造方法.

猜你喜欢

转载自zhangtaowu.iteye.com/blog/2240051