10.抽象与封装

软件出现的目的

用计算机的语言描述现实世界
用计算机解决现实世界的问题

为什么使用面向对象

世界由对象组成

面向对象的思想 描述 面向对象的世界 符合人类思维习惯


image

从现实中抽象出类分三步:

找出它的种类
找出它的属性
找出它的行为
用面向对象描述世界

第一步:发现类
class Dog {

}
根据“对象”抽象出“类”

第二步:发现类的属性
狗类共有的特征:

品种
年龄
昵称
健康情况
跟主人的亲密度
… …
class Dog {
String name = "旺财"; // 昵称
int health = 100; // 健康值
int love = 0; // 亲密度
String strain = "拉布拉多犬"; // 品种
}
只放和业务相关的属性
第三步:发现类的方法
狗类共有的行为:



输出自己的信息
… …
class Dog {
String name = "旺财"; // 昵称
int health = 100; // 健康值
int love = 0; // 亲密度
String strain = "拉布拉多犬"; // 品种
/* 输出狗的信息 */
public void print() {
// 输出狗信息的代码
}
}

只放和业务相关的方法

image

实践

实现领养宠物功能
编写宠物类Dog和Penguin
创建宠物对象,输入领养的宠物信息并输出

!
image

image

对象初始化

Penguin pgn = new Penguin();
pgn.name = "qq";
pgn.sex = "Q仔";
能否在创建对象的同时就完成赋值?
使用构造方法:
Penguin pgn1 = new Penguin();

class Penguin {
// 属性
/* 无参构造方法 */
public Penguin() {
name = "qq";
love = 20;
sex = "Q仔";
System.out.println("执行构造方法");
}
}
构造方法


image

系统提供默认无参构造方法
public Penguin() {

}
自定义构造方法

public Penguin () {
name = "qq";
love = 20;
sex = "Q仔";
}

public Penguin (String name,int health,int love,String sex ) {
this.name = name;
this.health = health;
this.love = love;
this.sex = sex;
}
系统不再提供默认无参构造方法
this关键字是对一个对象的默认引用,这里用以区分同名成员变量
方法重载


image

System.out.println(45);
System.out.println(true);
System.out.println("狗在玩耍!");

调用重载方法

pgn = new Penguin();
pgn.print();
pgn = new Penguin("美美", 80, 20, "Q仔");
pgn.print();

一个例子

class Penguin {
String name = null; //昵称
int health = 0; // 健康值
String sex = null; // 性别
public void Penguin() {
health=10;
sex="雄";
System.out.println("执行构造方法");
}
public void print() {
System.out.println("企鹅的名字是" + name + ",健康值是"
+ health + ",性别是" + sex);
}
}

Penguin pgn3= new Penguin();
pgn3.print();


image

找出下面代码的问题

class Dog {
private String name = "旺财"; // 昵称
private int health = 100; // 健康值
private int love = 0; // 亲密度
public void play(int n) {
int localv;
health = health - n;
System.out.println(name+" "+ localv +" "+health+" "+love);
}
public static void main(String[] args) {
Dog d=new Dog();
d.play(5);
}
}

static静态成员

一个例子 统计对象被创建出来的个数

class Person
{
public String name;
public int age;
static public long all_count;
public Person(){
all_count++;
}
public Person( String name , int age ){
all_count++;
this.name = name;
this.age = age;
}
// 统计人数的函数
public long getCount(){
return all_count;
}
// 应该具备找同龄人的功能
public boolean isSameAge( Person p1 ){
return this.age == p1.age;
}
}
class Demo9
{
public static void main(String[] args)
{
Person p1 = new Person( "jame" , 34 );
Person p2 = new Person( "lucy" , 34 );

    Person p3 = new Person( "lili" ,  34 );
    Person p4 = new Person();
    System.out.println( p1.getCount() + " " + p2.getCount() + "  " + p3.getCount()  );
    System.out.println( p1.isSameAge( p2 ) );
    System.out.println( p1.isSameAge( p3 ) );
}

}
4:static特点
1 随着类的加载而加载,静态会随着类的加载而加载,随着类的消失而消失。说明它的生命周期很长。
2 优先于对象存在。—>静态是先存在,对象是后存在。
3 被所有实例(对象)所共享。
4 可以直接被类名调用


image

使用static定义方法

用类名调用: Person.print();

静态方法只能访问静态属性,不能访问实例属性
找错误

class Dog {
private String name = "旺财"; // 昵称
private int health = 100; // 健康值
private int love = 0; // 亲密度
public void play(int n) {
static int localv=5;
health = health - n;
System.out.println(name+" "+localv+" "+health+" "+love);
}
public static void main(String[] args) {
Dog d=new Dog();
d.play(5);
}
}

封装

Dog d = new Dog();
d.health = -1000;
属性随意访问,不合理的赋值

封装的概念

封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

封装的好处

1.隐藏类的实现细节
2.只能通过规定方法访问数据
3.方便加入控制语句
4.方便修改实现

封装的步骤

image

class Dog {
private String name = "旺财"; // 昵称
private int health = 100; // 健康值
private int love = 0; // 亲密度
private String strain = "拉布拉多犬"; // 品种
public int getHealth() {
return health;
}
public void setHealth (int health) {
if (health > 100 || health < 0) {
this.health = 40;
System.out.println("健康值应该在0和100之间,默认值是40");
} else
this.health = health;
}
// 其它getter/setter方法
}

this

用类名定义一个变量(对象,实例)的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法。

那么类里面是够也应该有一个引用来访问自己的属性和方法呢?

JAVA提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法。
先来个简单的例子:

public class ThisDemo {
String name="Mick";
public void print(String name){
System.out.println("类中的属性 name="+this.name);
System.out.println("局部传参的属性="+name);
}
public static void main(String[] args) {
ThisDemo tt=new ThisDemo();
tt.print("Orson");
}
}
关于返回类自身的引用,《Thinking in Java》有个很经典的例子。
通过this 这个关键字返回自身这个对象然后在一条语句里面实现多次的操作

public class ThisDemo {
int number;
ThisDemo increment(){
number++;
return this;
}
private void print(){
System.out.println("number="+number);
}
public static void main(String[] args) {
ThisDemo tt=new ThisDemo();
tt.increment().increment().increment().print();
}
}
一个类中定义两个构造函数,在一个构造函数中通过 this 这个引用来调用另一个构造函数

public class ThisDemo {
String name;
int age;
public ThisDemo (){
this.age=21;
}
public ThisDemo(String name){
this();
this.name="Mick";
}
private void print(){
System.out.println("最终名字="+this.name);
System.out.println("最终的年龄="+this.age);
}
public static void main(String[] args) {
ThisDemo tt=new ThisDemo("zhangsan"); //随便传进去的参数
tt.print();
}
}
练习

创建Dog类
编写Test类


image

package com.company;

/**

  • Created by ttc on 2017/12/28.
    */
    //private ,default, protected,public
    public class Dog {
    private String name = "旺财"; // 昵称
    private int health = 100; // 健康值0---100 private私有的
    private int love = 0; // 亲密度
    private int type;//类型:1狗2企鹅
    private int kind;//品种

    public String toString()
    {
    String strKind = "";
    if(kind == 1)
    {
    strKind = "拉布拉多";
    }
    else if(kind == 2)
    {
    strKind = "雪纳瑞";
    }
    String str = "宠物的自白,我的名字叫"
    +name+"健康值是"+health+"和主人的亲密度是"+love+"我是一只"+strKind;
    return str;
    }

    public String getName() {
    return name;
    }

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

    public int getHealth() {
    return health;
    }

    public void setHealth(int health) {
    this.health = health;
    }

    public int getLove() {
    return love;
    }

    public void setLove(int love) {
    this.love = love;
    }

    public int getType() {
    return type;
    }

    public void setType(int type) {
    this.type = type;
    }

    public int getKind() {
    return kind;
    }

    public void setKind(int kind) {
    this.kind = kind;
    }

package com.company;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);
    System.out.println("欢迎来到宠物店");
    System.out.println("请输入宠物名字");

    String name = scanner.next();

    System.out.println("请输入宠物类型:1狗,2企鹅");
    int type = scanner.nextInt();
    if(type == 1)
    {
        Dog d = new Dog();
        System.out.println("请输入品种,1聪明的拉布拉多,2酷酷的雪纳瑞");
        int kind = scanner.nextInt();
        d.setKind(kind);
        d.setName(name);
        System.out.println(d);
    }
    else
    {
        //new 企鹅();
    }

}

}

创建Penguin类
编写Test类


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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 配套视频教程 本文B站配套视频教程[https://www.bilibili.com/video/BV1fp4y1...
    __豆约翰__阅读 654评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,505评论 18 399
  • 夜深了,忽然想起白天闪过脑子里的一个段子,最近在练笔和学习写文章,随感而发,真随性,随手要拿捏,记录,兴许以后...
    A_A董海燕阅读 305评论 0 0
  • 我希望。 蓝天白云,被风吹拂。 花朵树叶,随意摇曳。 这个世界的每一场梦,都能被美好实现。 比方说,我想你的时候,...
    远方的一个万阅读 153评论 0 0