面向对象(一)封装,继承

一,类和对象

类是对象的抽象,对象是类的具体(也就是说类不是具体存在的,看不见摸不着的。对象就是实实在在存在的,是一个具体的事物)

二,封装

一般属性私有化(private),方法公有化(public),除非方法只是用来内部调用,可以用private修饰(把属性私有化,实现了对外界的隐藏,然后通过共有的getter和setter方法对属性进行获取和赋值,保证了操作的安全性)

1,对属性使用private 私有化进行修饰,实现了对外界的隐藏外界不能够直接操作类的属性。

2,定义针对属性的getter和setter方法,完成对属性的获取和设置值,在发放中可以完成安全验证。

对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。使用封装的好处:


良好的封装能够减少耦合。
类内部的结构可以自由修改。
可以对成员进行更精确的控制。
隐藏信息,实现细节。

    封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

class People{
    public String name;
    public int age;
}
public class Test {
    public static void main(String[] args) {
        People people = new People();
        people.name = "小明";
        people.age = 18;
        System.out.println("姓名:"+people.name+" 年龄:"+people.age);
    }
}

运行结果

在这里插入图片描述

 这样的代码必须要了解 People 这个类的才能类内部的实现, 才能够使用这个类. 学习成本较高。
而且一旦类的实现者把name这两个字段修改成myName,外部就无法调用了,那么类的调用者就需要大量的修改代码,维护成本就非常高了。

使用 private 封装属性, 并提供 public 方法供类的调用者使用.

class People{
    private String name;
    private int age;
    
    public void show() {
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}
public class Test {
    public static void main(String[] args) {
        People people = new People();
        people.show();
    }
}

此时字段已经使用 private 来修饰. 类的调用者(main方法中)不能直接使用. 而需要借助 show 方法.
此时类的使用者就不必了解 Person 类的实现细节. 同时如果类的实现者修改了字段的名字,
类的调用者不需要做出任何修改(类的调用者根本访问不到 name, age这样的字段).
 

那么问题来了,我们前面说过 private 修饰的字段只能在当前类中使用。也就是说现在我们访问不到了name和age了。这就得用到 ger 和 set 方法了

3. getter和setter方法
当我们用private修饰字段后,这个字段就无法被直接使用了。
这个时候就用到了 get 和 set 方法了

class People{
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public void show() {
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}
public class Test {
    public static void main(String[] args) {
        People people = new People();
        people.setName("小明");
        people.setAge(18);
        people.show();
    }
}

运行结果

在这里插入图片描述

 getName 即为 getter 方法, 表示获取这个成员的值.
setName 即为 setter 方法, 表示设置这个成员的值
不是所有的字段都一定要提供 setter / getter 方法, 而是要根据实际情况决定提供哪种方法.

在 IDEA中快速生成 get 和 set 方法
Alt+Insert 键或者点鼠标右建找到Generate

三,继承

继承的定义:把几个类中相同的属性和方法抽离出来定义在基类中,子类不再需要定义这些属性和方法,继承之后,就相当于拥有了这些属性和方法。

1,子类继承父类,父类定义的公共的属性和方法子类会拥有,但是父类定义的私有化的属性和方法,子类不能继承

继承的意义:代码的重复使用

/**
 * @author ZhangXiaoDie  2022/11/11  15:24
 * @version 1.0   子类
 */
public class student {


    private String name;
    private int  age;
    private  String  height;
    private  int  studentId;

    public  void   study(){
        System.out.println("学习");
    }
    public  void   sleep(){
        System.out.println("睡觉");
    }
    public  void   eat(){
        System.out.println("吃饭");
    }
    public  void  study1(){
        System.out.println("在教室学习");
    }

}




/**
 * @author ZhangXiaoDie  2022/11/12  18:28
 * @version 1.0  子类
 */
public class teacher {

    private String name;
    private int  age;
    private  String  height;
    private  int  teacherId;

    public  void   study(){
        System.out.println("学习");
    }
    public  void   sleep(){
        System.out.println("睡觉");
    }
    public  void   eat(){
        System.out.println("吃饭");
    }
    public  void  study1(){
        System.out.println("在办公室学习");
    }
}




/**
 * @author ZhangXiaoDie  2022/11/12  18:28
 * @version 1.0  父类
 */
public class person {
    private String name;
    private int  age;
    private  String  height;

    public  void   study(){
        System.out.println("学习");
    }
    public  void   sleep(){
        System.out.println("睡觉");
    }
    public  void   eat(){
        System.out.println("吃饭");
    }

}




继承之后   继承关键词  extends

/**
 * @author ZhangXiaoDie  2022/11/11  15:24
 * @version 1.0
 */
public class student extends  person {


    
    private  int  studentId;

   
    public  void  study1(){
        System.out.println("在教室学习");
    }

}





/**
 * @author ZhangXiaoDie  2022/11/12  18:28
 * @version 1.0
 */
public class teacher  extends  person{


    private  int  teacherId;


    public  void  study1(){
        System.out.println("在办公室学习");
    }
}



/**
 * @author ZhangXiaoDie 2022/11/12  18:28
 * @version 1.0
 */
public class person {
    private String name;
    private int  age;
    private  String  height;

    public  void   study(){
        System.out.println("学习");
    }
    public  void   sleep(){
        System.out.println("睡觉");
    }
    public  void   eat(){
        System.out.println("吃饭");
    }

}



方法的重写:

2,父类继承过来方法,子类可以进行改造,重新实现功能(方法的重写),调用的时候执行的是子类新实现的方法。

/**
 * @author ZhangXiaoDie  2022/11/12  18:28
 * @version 1.0
 */
public class person {
    private String name;
    private int  age;
    private  String  height;

    public  void   study(){
        System.out.println("学习");
    }
    public  void   sleep(){
        System.out.println("睡觉");
    }
    public  void   eat(){
        System.out.println("吃饭");
    }

}



public class student extends  person {



    private  int  studentId;

    public static void main(String[] args) {

    }
    public  void  study1(){
        System.out.println("在教室学习");
    }
    public void eat(){
        System.out.println("在餐馆吃饭");
    }
}

执行的是子类里新实现的方法:”在餐馆里吃饭“

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值