【JAVA学习笔记】面向对象三大特性之“封装”

学习自华为开发者学院陈璇老师的JAVA系列课程

一、封装

1.1 封装的目的


1.2 封装的实现(属性的隐藏,setter和getter方法的公开)

/*
* 宠物狗类
*/

public class Dog {
    //1. 隐藏属性
    private String name = "无名氏"; //昵称
    private int health = 100; //健康值,默认100,0~100之间,小于60为不健康
    private int love = 0; //亲密度
    private String strain = "聪明的拉布拉多犬"; //品种

    //添加属性的setter/getter方法,并加入属性控制语句
    public void setHealth(int health){
        if(health<0 || health>100){
            System.out.println("宠物狗的健康值只能在0~100之间!");
            this.health = 60;
            return;
        }
        this.health = health;
    }

    public int getHealth(){
        return this.health;
    }


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

    public String getName(){
        return this.name;
    }

    public void setLove(int love){
        if(love<0 || love>100){
            System.out.println("宠物狗的亲密度只能在0~100之间!");
            this.love = 60;
            return;
        }
        this.love = love;
    }

    public int getLove(){
        return this.love;
    }

    public void setStrain(String strain){
        this.strain = strain;
    }

    public String getStrain(){
        return this.strain;
    }

    /*
    * 输出狗狗信息
    */
    public void print(){
        System.out.println("宠物的自白:\n我的名字叫" + this.name +
                ",健康值是" + this.health + ",和主人的亲密度是"
                 + this.love + ",我是一只" + this.strain + ". ");
    }
}
/*
* 宠物企鹅类
*/
public class Penguin {
    private String name = "无名氏"; //昵称
    private int health = 100; //健康值,默认100,0~100之间,小于60为不健康
    private int love = 0; //亲密度
    private String strain = "企鹅"; //品种
    private String sex = "Q仔";

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

    public void setHealth(int health) {
        if(health<0 || health>100){
            System.out.println("宠物狗的健康值只能在0~100之间!");
            this.health = 60;
            return;
        }
        this.health = health;
    }

    public void setLove(int love) {
        if(love<0 || love>100){
            System.out.println("宠物企鹅的亲密度只能在0~100之间!");
            this.love = 60;
            return;
        }
        this.love = love;
    }

    public void setStrain(String strain) {
        this.strain = strain;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public int getHealth() {
        return health;
    }

    public int getLove() {
        return love;
    }

    public String getStrain() {
        return strain;
    }

    public String getSex() {
        return this.sex;
    }

    /*
     * 输出狗狗信息
     */
    public void print(){
        System.out.println("宠物的自白:\n我的名字叫" + this.name +
                ",健康值是" + this.health + ",和主人的亲密度是"
                + this.love + ",我是一只" + this.strain + ". ");
    }
}
import java.util.Scanner;

public class TestPet {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("欢迎您来到宠物店!");
        System.out.print("请输入要领养宠物的名字:");
        String name = input.next();
        System.out.print("请输入要领养宠物的类型:1、狗狗;2、企鹅 ");
        int typeNo = input.nextInt();
        switch (typeNo){
            case 1:
                //创建狗狗对象
                Dog dog = new Dog();
                dog.setName(name);
                //狗狗其他属性
                dog.setHealth(-1000);
                System.out.println(dog.getHealth());

                dog.setLove(-9);

                dog.setStrain("吉娃娃");
                dog.print();
                break;
            case 2:
                //接受用户键盘录入信息
                System.out.print("请输入企鹅的性别:1、Q妹;2、Q仔  ");
                int SexId = input.nextInt();
                String sex = (SexId==1) ? "Q妹" : "Q仔";
                System.out.print("请输入企鹅的健康值:");
                int health = input.nextInt();
                System.out.print("请输入企鹅的亲密度:");
                int love = input.nextInt();

                //创建企鹅对象
                Penguin p = new Penguin();
                p.setName(name);
                p.setSex(sex);
                p.setHealth(health);
                p.setLove(love);
                p.print();
                break;

            default:
                System.out.println("暂时没有这个类型的宠物!");
                break;
        }


    }
}

1.3 包






1.4 访问权限控制

1.4.1 类的访问权限控制

类的修饰符:

  • public修饰符:公有访问级别
  • 默认修饰符:包级私有访问级别
[robin@DESKTOP-POANC35 AccessControl]$ tree
.
├── AccessControl.iml
└── src
    └── cn
        └── com
            ├── oop1
            │   ├── Person.java
            │   ├── Student.java
            │   └── Test.java
            ├── oop2
            │   └── Test2.java
            └── oop3
package cn.com.oop1;

//类可以通过pubic来修饰
public class Student {
}
package cn.com.oop1;

//默认修饰符
class Person {
}
package cn.com.oop1;

public class Test {
    public static void main(String[] args) {
        //同包的类既可以访问public,也可以访问默认修饰符修饰的类
        Student s = new Student();
        Person p = new Person();
    }
}
package cn.com.oop2;
import cn.com.oop1.Student;
//import cn.com.oop1.Person;

public class Test2 {
    public static void main(String[] args) {
        //不同包的类只可以访问public,不可以访问默认修饰符修饰的类
        Student s = new Student();
        //Person p = new Person();
    }
}
1.4.2 类成员的访问权限控制
  • private修饰的类成员:只能本类访问
  • 默认修饰符修饰的类成员: 本类可以访问,同包的其他类也可以访问,但不能被其他包的其他类访问
  • protected修饰符修饰的类成员:本类可以访问,同包的其他类也可以访问,但不能被其他包的其他类访问
  • public修饰符修饰的类成员:都可以被访问

1.5 static修饰符

1.5.1 static变量

作用

  • 数据被类的所有实例共享
  • 所有类的实例都包含一个相同的常量属性,定义为静态常量可以节省内存空间


1.5.2 static方法
1.5.3 static代码块

oop1:

  • Person.java
package cn.com.oop1;

//默认修饰符
class Person {
   //属性,成员变量,全局变量
   int age;
   String name;
   String email;

   //成员方法
}
  • Student.java
package cn.com.oop1;

//类可以通过pubic来修饰
public class Student {
    //private修饰的类成员,只能本类访问
    private int age;
    //默认修饰符修饰的类成员,本类可以访问,同包的其他类也可以访问,但不能被其他包的其他类访问
    String name;
    //protected修饰符修饰的类成员,本类可以访问,同包的其他类也可以访问,但不能被其他包的其他类访问
    protected String address;
    //public修饰符修饰的类成员,都可以被访问
    public char sex;

    private void m1(){
        System.out.println(this.age);
        System.out.println(this.name);
        System.out.println(this.address);
        System.out.println(this.sex);
    }
}
  • Test.java
package cn.com.oop1;

public class Test {
    public static void main(String[] args) {
        //同包的类既可以访问public,也可以访问默认修饰符修饰的类
        Student s = new Student();
        //其他类不能调用Studet类private修饰的类成员(属性、方法)
        //s.age;
        //默认修饰符修饰的类成员,本类可以访问,同包的其他类也可以访问,但不能被其他包的其他类访问
        System.out.println(s.name);
        //protected修饰符修饰的类成员,本类可以访问,同包的其他类也可以访问,但不能被其他包的其他类访问
        System.out.println(s.address);
        Person p = new Person();
        System.out.println(s.sex);
//        s.m1();

    }
}

oop2:

  • Test.java
package cn.com.oop2;
import cn.com.oop1.Student;
//import cn.com.oop1.Person;

public class Test2 {
    public static void main(String[] args) {
        //不同包的类只可以访问public,不可以访问默认修饰符修饰的类
        Student s = new Student();
        //s.age;
        //默认修饰符修饰的类成员,本类可以访问,同包的其他类也可以访问,但不能被其他包的其他类访问
        //System.out.println(s.name);
        //protected修饰符修饰的类成员,本类可以访问,同包的其他类也可以访问,但不能被其他包的其他类访问
        //System.out.println(s.address);
        //Person p = new Person();
        System.out.println(s.sex);
    }
}

oop3.staticdemo

  • Person.java
package cn.com.oop3.staticdemo;

//默认修饰符
class Person {
    //属性,类的普通成员变量,全局变量----->实例变量
    int age;
    String name;
    //静态变量 --> 通过类名去调用
    static String email; //还是Person的属性(成员变量)

    public void m2() {
        System.out.println("实例方法m2");
    }

    //成员方法:实例方法--->可以调用实例变量、实例方法、静态变量、静态方法
    public void m1() {
        //在实例方法中可以访问静态变量,但不能定义静态变量
        //static String email2;
        System.out.println(this.age);
        System.out.println(email);
        this.m2();
        m3();
    }

    //静态方法
    public static void m3() {
        //静态方法中不能使用this
        //System.out.println(this.age);
        //在静态方法中不能调用实例方法
        //m1();
        //在静态方法中不能调用实例变量
        //System.out.println(age);
        System.out.println("静态方法m3");
        //在静态方法中可直接访问静态变量
        System.out.println(email);
        //在静态方法中可直接访问静态方法
        m4();
    }

    public static void m4(){
        System.out.println("静态方法m4");
    }
}
  • StaticTest.java
package cn.com.oop3.staticdemo;

public class StaticTest {
    static int num = 100;
    static{
        num+=100;
        System.out.println(num);
    }
    static{
        num+=100;
        System.out.println(num);
    }

//    public static void main(String[] args) {
//        StaticTest st1 = new StaticTest();
//        StaticTest st2 = new StaticTest();
//        System.out.println(StaticTest.num);
//    }
}
  • Test.java
package cn.com.oop3.staticdemo;

public class Test {
    public static void main(String[] args) {
        StaticTest st1 = new StaticTest();
        StaticTest st2 = new StaticTest();
        System.out.println(StaticTest.num);
    }
}
  • TestPerson.java
package cn.com.oop3.staticdemo;

public class TestPerson {
    public static void main(String[] args) {
        //调用类的普通成员变量(属性),需要创建对象(实例),通过对象去访问---->实例变量
        Person p = new Person();
        p.age = 18;
        p.name = "张三";
        //静态变量 --> 通过类名去调用
        Person.email = "zhangsan@163.com";
        //通过实例调用实例方法
        p.m1();
        //通过类名调用静态方法
        Person.m3();
    }
}
  • TestVoter.java
package cn.com.oop3.staticdemo;

public class TestVoter {
    public static void main(String[] args) {
        Voter v1 = new Voter("张三");
        v1.vote();
        Voter v2 = new Voter("李四");
        v2.vote();
        Voter v3 = new Voter("王五");
        v3.vote();
        System.out.println("*****************************");
        Voter.showCount();

        for(int i = 1; i <= 97; i++){
            Voter v = new Voter("v"+i);
            v.vote();
        }

        System.out.println("*****************************");
        Voter.showCount();

        Voter v4 = new Voter("小明");
        v4.vote();

        System.out.println("*****************************");
        Voter.showCount();
    }
}
  • Voter.java
package cn.com.oop3.staticdemo;

/*
* 选民类
*/
public class Voter {
    //目前投票数,被所有选民实例共享
    static int count;
    //投票总数最大值,被所有选民实例共享,到100时停止投票
    static final int MAX_COUNT = 100;
    //选民名字
    private String name;

    public Voter(){}
    public Voter(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    //选民投票的方法
    public void vote(){
        if(count == MAX_COUNT){
            System.out.println("投票总数达到100,无法继续投票!");
            return;
        }else{
            count++;
            System.out.println(this.name+"投票成功!当前票数为:"+count);
        }
    }

    //显示当前投票总数
    public static void showCount() {
        System.out.println("当前投票总数为:"+count);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容