黑马程序员技术交流社区

标题: 我的Java日记 面向对象 (类的封装,继承)摘自本人的博客 [打印本页]

作者: zs1973    时间: 2015-6-11 00:28
标题: 我的Java日记 面向对象 (类的封装,继承)摘自本人的博客
1. 类的封装
概念:封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
在上一篇类和对象中,我们当时定义类的属性的时候,是用public来修饰的。其实修饰属性可以用:public,protected,和private 来修饰。
三种修饰的不同在于:
public :公共,加上这个修饰的类或属性,可以在同一个包或者别的包里面访问。

protected:保护 对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。

private:私有 私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。

对于数据的安全性来说,private类型修饰的变量是最为安全的(较 public,protected)。private来修饰变量虽然安全,但是一旦使用private来修饰变量,那在别的类里面就无法访问到此类的属性了,该怎么办?这时我们就可以用封装来解决这个问题。
我们先把上一篇博客里面的Human类的代码改一下,把属性私有化,Main类不变动,但是先不封装。看一下效果:

package itheiomatest;
/**
* 每个类中都拥有属性和方法。
* 这是一个人的类
* @author 张硕
*
*/
public class Human {
    //已经改成私有变量
    private String name;
    private String sex;
    private int age;

    public void Eat(){
        System.out.println("吃饭");

    }
    public void Sleep(){
        System.out.println("睡觉");
    }

}

错误:说是在Main类的“main”方法中,human类对象的name,sex,age属性不可访问。(这就是因为没有封装Human类的属性)

封装一下再看效果。
如何封装:在Human类中 同时按下 shift+alt+s,然后找到 Generate Getters and Setters,然后全选,最后点击ok。
如下:

package itheiomatest;
/**
* 每个类中都拥有属性和方法。
* 这是一个人的类
* @author 张硕
*
*/
public class Human {

    private String name;
    private String sex;
    private int age;


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    public void Eat(){
        System.out.println("吃饭");

    }
    public void Sleep(){
        System.out.println("睡觉");
    }

}

然后再改一下Main类里面Main方法里面的代码。

package itheiomatest;

public class Main {

    public static void main(String[] args) {

        Human human=new Human();
        //封装私有属性后的赋值方法
        human.setName("张硕");
        human.setSex("男");
        human.setAge(21);


        human.Eat();            
        human.Sleep();

        //这里也要改一下
        System.out.println("我是"+human.getName()+"我是"+human.getSex()+"的,我今年"+human.getAge()+"岁");

    }

}

2.类的继承
概念:
Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以分隔符先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
类和类之间的继承关系可以用UML符号表示,其中父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。
JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。
在面向对象程序设计中运用继承原则,就是在每个由一般类和特殊类形成的一般——特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和操作一次性地在一般类中进行显式的定义,在特殊类中不再重复地定义一般类中已经定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的属性和操作。特殊类的对象拥有其一般类的全部或部分属性与方法,称作特殊类对一般类的继承。
继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能(操作),我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类。
继承避免了对一般类和特殊类之间共同特征进行的重复描述。同时,通过继承可以清晰地表达每一项共同特征所适应的概念范围——在一般类中定义的属性和操作适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比较简练也比较清晰。

Java继承分类
继承分为单继承和多重继承。单继承是指一个子类最多只能有一个父类。多继承是一个子类可以有二个以上的父类。由于多继承会带来二义性,在实际应用中应尽量使用单继承。Java语言中的类只支持单继承,而接口支持多继承。Java中多继承的功能是通过接口(interface)来间接实现的。

下面用代码来深刻理解一下继承。

package itheiomatest;

public class Main {

    public static void main(String[] args) {
        B b=new B();
        b.Eat();
    }
}
class A{
    public int a;
    public void Eat(){
        System.out.println("吃饭");
    }

}
class B extends A{


}

这里,B类继承A类,所以B类拥有A类的所有属性和方法。
即使B类里面不写东西,B类也拥有A类的 属性a,和方法Eat().

然后我们给B类添加一些自己的属性和方法。

package itheiomatest;

public class Main {

    public static void main(String[] args) {
        B b=new B();
        System.out.println(b.a);//继承自父类A的属性a
        System.out.println(b.b);//B类自己的属性b
        b.Eat();//继承自父类A的方法
        b.Sleep();//B类自己的方法
    }
}
class A{
    public int a=1;
    public void Eat(){
        System.out.println("吃饭");

    }

}
class B extends A{
    public int b=2;
    public void Sleep(){
        System.out.println("睡觉");
    }

}


最后我们得出一个结论,子类继承父类之后,不仅拥有父类所有的属性个方法,而且自己也可以拥有自己的属性和方法。
作者: zs1973    时间: 2015-6-11 09:52
自                             己踩               
作者: 十字天堂    时间: 2015-6-11 10:18
我来帮忙踩的
作者: 流水0215    时间: 2015-6-11 15:07
学习一下下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2