Java三大特征——封装、继承、多态(上)

封装和继承

封装

什么叫做封装

  1. 将类中的一些内容保护起来
  2. 将类中的内容该暴露的暴露,该隐藏钢的隐藏

封装的目的

  1. 增加数据的安全性,简化我们的编程,使使用者不需要了解具体实现的细节

为什么我们需要封装

// @Author 人类
public class Person {
    //    姓名
    public String name;
    //    年龄
    public int age;

    public void sayHello() {
        System.out.println("大家好,我叫" + name + "我今年" + age + "岁了");
    }
}
// @Author 测试类
public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.name="张三";
        person.age=10000;
        person.sayHello();
    }
}

通过分析,我们发现,在设置年龄的时候我们无法通过判断去设置年龄的大小来确定我们设置的量是否正确。我们想要去改变这样的情况,就必须通过借助封装来实现。

如何实现封装

  1. 给属性设置权限修饰符 → private

    // @Author 人类
    public class Person {
        //    姓名
        private String name;
        //    年龄
        private int age;
    
        public void sayHello() {
            System.out.println("大家好,我叫" + name + "我今年" + age + "岁了");
        }
    }
    // @Author 测试类
    public class Test {
        public static void main(String[] args) {
            Person person = new Person();
            person.name="张三";
            person.age=10000;
            person.sayHello();
        }
    }
    

    当我们给属性设置完private修饰符之后,此属性便成为了私有化属性,外界无法直接访问(代码在编辑器中会报错);此时我们需要在Person类中添加getter/setter方法去操作私有化属性

  2. 添加getter/setter方法

    使用快捷键 alt+insert

  3. 在getter/setter方法中加入存取控制语句

    public class Person {
        //    姓名
        private String name;
        //    年龄
        private int age;
    
        /**
         * @return 获取 name
         */
        public String getName() {
            return name;
        }
    
        /**
         * 设置 name
         *
         * @param name
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * @return 获取 age
         */
        public int getAge() {
            return age;
        }
    
        /**
         * 设置 age
         *
         * @param age
         */
        public void setAge(int age) {
            if (age >= 120 || age <= 0) {
                System.out.println("您输入的年龄有误,请重新输入");
            } else {
                this.age = age;
            }
        }
    
        public void sayHello() {
            System.out.println("大家好,我叫" + name + "我今年" + age + "岁了");
        }
    }
    

    此时如果年龄不符合要求在这里不会再对age进行赋值

封装的内存图

在这里插入图片描述

继承

什么是继承

在生活中什么是继承

简单的来说就是你继承了父亲的财产

在Java中什么是继承

子类使用extends关键字继承父类的属性和方法

为什么需要继承

简化代码,提高代码的复用性

继承的关键字 →extends

语法

public class 子类 extends 父类 {}

继承的特点

  1. 子类完全继承父类的属性和方法
  2. 在Java中一个子类只能有一个父类 →也就是说只能单继承,子类只能继承一个父类
  3. 一个父类可以有多个子类 →也就是说Java中的类可以派生多个类

继承的优点

  1. 实现代码的复用性
  2. 子类中可以拥有父类没有的属性和方法,也就是说子类可以用于独有的属性和方法(注意:父类被子类继承的话父类无法用于独有的属性和方法,所以的属性和方法都会被继承)

继承的实现

// 父类
public class Person {
    private String name;
    private int age;

    /**
     * @return 获取 name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置 name
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return 获取 age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置 age
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
    public void sayHello() {
        System.out.println("啦啦啦");
    }
}
// 子类
public class Teacher extends Person {

}

// 测试类
public class Test {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.sayHello();
    }
}

方法重写

什么是方法重写

在子类中重写父类中拥有的方法

注解

@Override(重写)

@Override //重写
public void sayHello() {
    //super超类也就是父类的意思
    super.sayHello();
}
方法重写的实现
//父类
public class Person {
    private String name;
    private int age;

    /**
     * @return 获取 name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置 name
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return 获取 age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置 age
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public void sayHello() {
        System.out.println("我是Person类中的sayHello()方法,啦啦啦");
    }
}
//学生类
public class Student extends Person {
    
}
//教师类
public class Teacher extends Person {
    @Override //重写
    public void sayHello() {
        System.out.println("我是重写后的sayHello方法,啦啦啦");
    }
}

继承中的构造器

什么是构造器
  1. 构造器就是和类名相同但无返回类型的方法。用于当前或某一对象的实例化,并将当前或某一对象返回。要得到一个类的实例时,往往是要运行其构造函数的。
构造器的作用

用来创建对象

Person person = new Person()

在我们new的时候其实就是调用党构造器的时候,简单的来说我们通过调用构造器来创建实例化的对象

构造器的分类
  1. 有参构造器
public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
  1. 无参构造器
public Person() {
}
构造器的特点
  1. 即使不创建构造器,每一个类中也有一个默认的无参构造器
  2. 一个类中可以没有有参构造器,但无参构造器必须存在
  3. 有参构造器和无参构造器是可以同时存在的
继承者构造器的特点
  1. 当我们创建子类对象的时候,实际上是先调用了父类的构造器,再调用的子类构造器,也就是说我们创建子类的时候,父类已经存在了。

  2. // 父类
    public class Person {
        private String name;
        private int age;
    
        /**
         * @return 获取 name
         */
        public String getName() {
            return name;
        }
    
        /**
         * 设置 name
         *
         * @param name
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * @return 获取 age
         */
        public int getAge() {
            return age;
        }
    
        /**
         * 设置 age
         *
         * @param age
         */
        public void setAge(int age) {
            this.age = age;
        }
    
        public Person() {
            System.out.println("我是父类构造器");
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public void sayHello() {
            System.out.println("我是Person类中的sayHello()方法,啦啦啦");
        }
    }
    // 子类
    public class Teacher extends Person {
        public Teacher() {
            System.out.println("我是子类构造器");
        }
    
        @Override //重写
        public void sayHello() {
            System.out.println("我是重写后的sayHello方法,啦啦啦");
        }
    }
    // 测试类
    public class Test {
        public static void main(String[] args) {
            Teacher teacher = new Teacher();
            teacher.sayHello();
            Student student = new Student();
            student.sayHello();
        }
    }
    // 输出结果:
    我是父类构造器
    我是子类构造器
    我是重写后的sayHello方法,啦啦啦
    我是父类构造器
    我是Person类中的sayHello()方法,啦啦啦
    
    
构造器的调用

使用new关键字创建对象的时候调用构造器,根据参数判断调用哪个构造器

继承中的关键字

  1. this

    1. 和封装中的this关键字作用一样
    2. 代表的当前对象
      1. this是对象中的隐式属性(隐式属性是每个对象中都存在的)这个this代表的就是当前对象
      2. 在这里插入图片描述
  2. super

    1. super的含义
      1. 超级,在Java中,super的意思就是超类,简单的来说就是父类
      2. 他也是隐式属性,每一个对象中都有super这个隐式属性
      3. super执行的就是父类的地址

继承的内存图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值