美文网首页
Java 面向对象 之 封装和继承

Java 面向对象 之 封装和继承

作者: _William_Zhang | 来源:发表于2019-02-13 11:27 被阅读2次

    封装

    在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。

    封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

    要访问该类的代码和数据,必须通过严格的接口控制。

    封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

    适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

    封装的优点

    1. 良好的封装能够减少耦合。

    2. 类内部的结构可以自由修改。

    3. 可以对成员变量进行更精确的控制。

    4. 隐藏信息,实现细节。

    封装的步骤

    1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:
    
    public class Person {
        private String name;
        private int age;
    }
    这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
    
    2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
    
    public class Person{
        private String name;
        private int age;
    ​
        public int getAge(){
          return age;
        }
    ​
        public String getName(){
          return name;
        }
    ​
        public void setAge(int age){
          this.age = age;
        }
    ​
        public void setName(String name){
          this.name = name;
        }
    }
    

    封装的实例

    public class EncapTest{
     
       private String name;
       private String idNum;
       private int age;
     
       public int getAge(){
          return age;
       }
     
       public String getName(){
          return name;
       }
     
       public String getIdNum(){
          return idNum;
       }
     
       public void setAge( int newAge){
          age = newAge;
       }
     
       public void setName(String newName){
          name = newName;
       }
     
       public void setIdNum( String newId){
          idNum = newId;
       }
    }
    

    以上实例中public方法是外部类访问该类成员变量的入口。

    通常情况下,这些方法被称为getter和setter方法。

    因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。


    继承

    继承的概念

    继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

    生活中的继承:

    生活中的继承

    兔子和羊属于食草动物类,狮子和豹属于食肉动物类。

    食草动物和食肉动物又是属于动物类。

    所以继承需要符合的关系是:is-a,父类更通用,子类更具体。

    虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

    类的继承格式

    在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

    class 父类 {
    }
     
    class 子类 extends 父类 {
    }
    

    为什么需要继承

    接下来我们通过实例来说明这个需求。

    开发动物类,其中动物分别为企鹅以及老鼠,要求如下:

    企鹅:属性(姓名,id),方法(吃,睡,自我介绍)
    老鼠:属性(姓名,id),方法(吃,睡,自我介绍)

    公共父类:
    public class Animal { 
        private String name;  
        private int id; 
        public Animal(String myName, int myid) { 
            name = myName; 
            id = myid;
        } 
        public void eat(){ 
            System.out.println(name+"正在吃"); 
        }
        public void sleep(){
            System.out.println(name+"正在睡");
        }
        public void introduction() { 
            System.out.println("大家好!我是"         + id + "号" + name + "."); 
        } 
    }
    
    企鹅类:
    public class Penguin extends Animal { 
        public Penguin(String myName, int myid) { 
            super(myName, myid); 
        } 
    }
    老鼠类:
    public class Mouse extends Animal { 
        public Mouse(String myName, int myid) { 
            super(myName, myid); 
        } 
    }
    

    继承类型

    需要注意的是 Java 不支持多继承,但支持多重继承。

    继承类型

    继承的特性

    子类拥有父类非 private 的属性、方法。

    子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

    子类可以用自己的方式实现父类的方法。

    Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。

    提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

    示例代码

    父类:

    package com.company.model;
    
    public class News {
        protected String title;
        protected String content;
    
        protected News() {
    
        }
    
        //构造的自由和责任交给用户!!
        public News(String title, String content) {
            this.title = title;
            this.content = content;
        }
    
        public String getTitle() {
            return title;
        }
    
        public String getContent() {
            return content;
        }
    
        //控制如何显示
        public String dispaly() {
            return title + "\n" + content;
        }
    }
    
    

    子类:

    package com.company.model;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    
    public class FileNews extends News {
        public FileNews(String title, String content) {
            super(title, content); //super 要和父类的构造方法一致
        }
    
        public FileNews() {
            super();
        }
    
        //子类 自己的 方法
        public void read(String url) {
            try {
                BufferedReader reader = new BufferedReader(new FileReader(new File(url)));
                title = reader.readLine(); //读取title
                reader.readLine(); //跳过空行
                content = reader.readLine(); //读取content
            } catch (java.io.IOException e) {
                System.out.println("新闻读取出错");
            }
        }
    
        //子类 重新实现 父类的 方法
        @Override
        public String dispaly() {
            return title + ":" + content;
        }
    }
    
    

    Main:

    package com.company;
    
    import com.company.model.FileNews;
    import com.company.model.News;
    
    public class Main {
    
        public static void main(String[] args) {
            News news = new News("abc", "父类");
            System.out.println(news.dispaly());
    
            FileNews fileNews = new FileNews("abc", "子类");
            System.out.println(fileNews.dispaly());
        }
    }
    

    项目结构

    理解继承

    相关文章

      网友评论

          本文标题:Java 面向对象 之 封装和继承

          本文链接:https://www.haomeiwen.com/subject/hisreqtx.html