百无聊赖之JavaEE从入门到放弃(九)封装详解 & 多态详解

目录

一.封装

1.封装的作用和含义

2.编程中封装的具体优点:

3.封装的实现一使用访问控制符

4.关于protected的两个细节:

5.开发中封装的简单规则

6.javaBean

二.多态(polymorphism)

1.多态概念和实现

2.多态的要点

3.示例代码


一.封装

1.封装的作用和含义

我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只给我们暴露简单的接口,比如:电源开关。具体内部是怎么实现的,我们不需要操心。需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来, 这就是封装。说的专业一点,封装就是把对象的属性和操作结合为一个独立的整体, 并尽可能隐藏对象的内部实现细节。我们程序设计要追求“高内聚,低耦合"。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。

2.编程中封装的具体优点:

提高代码的安全性。
提高代码的复用性。
“高内聚” :封装细节,便于修改内部代码,提高可维护性。
"低耦合”: 简化外部调用,便于调用者使用,便于扩展和协作。

3.封装的实现一使用访问控制符

Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。Java中4种“访问控制符”分别为private、default、 protected、 public ,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。下面详细讲述它们的访问权限问题。其访问权限范围如下图所示。

(1)private表示私有,只有自己类能访问
(2)default表示没有修饰符修饰,只有同一个包的类能访问
(3)protected表示可以被同一个包的类以及其他包中的子类访问

注:public static 和 static的区别:

其实就是访问权限的区别,一个是public,一个是default。

4.关于protected的两个细节:

1.若父类和子类在同一个包中,子类可访问父类的 protected成员,也可访问父类对象的protected成员。
2.若子类和父类不在同一个包中,子类可访问父类的protected成员,不能访问父类对象的protected成员。

eg:

首先两个类在不同的包里。

代码:

Test1.java

public class Test1 {
    private int testPrivate=100;
    int testDefault=200;
    protected int testProtected=300;

    public void test(){
        System.out.println(this.testPrivate);//只有本类可以用私有成员
        System.out.println(this.testDefault);//同一个包的类就能用默认成员
    }
}

Test2.java

import com.company.Test.a.Test1;

public class Test2 extends Test1{
    public void fun(){
        System.out.println(super.testProtected);//子类可访问父类的protected成员
    }

    public static void main(String[] args) {
        Test1 test1=new Test1();
        test1.test();
        Test2 test2=new Test2();
        test2.fun();
        //System.out.println(test.testProtected); 报错,即不能访问父类对象的protected成员

    }

}

输出:

100
200
300

5.开发中封装的简单规则

一般使用private访问权限。
提供相应的 get/set方法来访问相关属性,,这些方法通常是public修饰的, 以提供对属性的赋值与读取操作(注意: boolean变量的get方法是is开头! )。
一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

6.javaBean

一个简单的javaBean例子:

函数直接右键--》Generate生成即可,也可快捷键Alt+Insert来快速打开Generate,idea很智能,如果没有用右键生成的话,直接打一个set或者get也会出来相应的快捷生成函数提示,不得不说idea是真的智能。

public class Person {
    private String age;
    private String name;
    private boolean flag;

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

二.多态(polymorphism)

1.多态概念和实现

多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。比如: 同样是调用人的“休息”方法,张三是睡觉,李四是旅游,高淇老师是敲代码,数学教授是做数学题;同样是调用人 “吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。

2.多态的要点

(1)多态是方法的多态,不是属性的多态(多态与属性无关)
(2)多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
(3)父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

3.示例代码

通过代码来体会多态的好处:如果没有多态,有些地方就需要大量的重写!

里面还有类型转化的一些知识,顺便看了。

public class Animals {
    public void shout(){
        System.out.println("叫了一声!");
    }

    //用static声明,animalShout()就是类方法,所以可以直接用函数名调用!!!!
    public static void animalShout(Animals a){ //到了这里相当于将传入的具体的动物类转化为Animals类
        a.shout();//这里会调用传入的具体的动物类的shout()函数
    }

    public static void main(String[] args) {
        Cat cat=new Cat();
        cat.catchMouse();
        animalShout(cat);
        //Dog dog=(Dog)cat;转换不了
        Animals a=new Dog();//向上类型转换,自动的
        Dog dog=(Dog)a;//强制类型转换,向下类型转换
        dog.guard();
        //报错,因为此时a已经转为Dog类型了,所以不能转换为Cat
        //Cat cat1=(Cat)a;
        //cat1.catchMouse();
    }
}

//多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
class Dog extends Animals{
    @Override
    public void shout() {
        System.out.println("汪汪汪!");
    }

    public void guard(){
        System.out.println("狗看门!");
    }
}

class Cat extends Animals{
    @Override
    public void shout() {
        System.out.println("喵喵喵");
    }

    public void catchMouse(){
        System.out.println("猫抓老鼠!");
    }
}

class Mouse extends Animals{
    @Override
    public void shout() {
        System.out.println("吱吱吱");
    }
}

输出:

猫抓老鼠!
喵喵喵
狗看门!

 

 

 

 

 

 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深海鱼肝油ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值