菜鸟学习Android之路---java基础笔记-(3)继承以及封装

继承是Java面向对象的三大特征之一,Java的继承是单继承的,每一个子类只有一个直接的父类;

 在Java中使用extends关键字完成类的继承关系,操作格式:

class 父类{}  // 定义父类

class 子类 extends 父类{}  // 使用extends关键字实现继承

为什么叫子类,父类呢?我是这样理解的,父类就像人的祖先那样,那只猴,而现在的人就是猴的子类;

父类与子类用离散数学来讲就是一般和特殊的关系,(我认为)也可以说是特殊的“父类”;所以父类包含的范围比子类大的多;

写一个例子:

public class Dog{

    public void eat(){

        System.out.println("我会吃骨头");

    }

    private void play(){

        System.out.println("我在玩");

    }

}

public RedDog extends Dog{

/    /重写父类的eat()方法,方法重写

    public void eat(){
    
        System.out.println("RedDog 会吃骨头");

    }

}

注意,父类中private的方法是对子类隐藏的,不能被子类继承重写。

总结类的格式:
 类:属性+方法
 class 类名称{
     属性;
     方法([参数]){
       方法代码;
    }
 }
 属性:数据类型  属性名称;
     数据类型:基本数据类型   或者  引用数据类型
方法:访问修饰符  返回值数据类型   方法名称([参数]){方法体;}
    访问修饰符:public protected  private  default
 返回值数据类型:
        有返回值:基本数据类型   或者  引用数据类型    方法代码中需要return
         没有返回值:void修饰
     参数:数据类型  参数名称
方法:
    --无返回值的方法
    --有返回值的方法:返回的是基本 数据类型    返回引用数据类型
     --无参数的方法
     --有参数的方法
 --方法的重载:同一个类中,方法名称相同,参数类型或者参数个数不同,实现不同功能
 --特殊的方法:构造方法
     --构造方法的名称与类名称一样,没有返回值,且不用void修饰
     --作用:实例化对象+为类的属性初始化(属性赋值)
     --如果定义了一个类,那么系统会提供一个无参的什么都不做的隐藏的构造
        但如果构造被重载,则提供的无参的什么都不做隐藏的构造就不存在了,除非人为显式保留
 ====================================================================================
 1、Java面向对象的语言
 --特征:封装性、继承性、多态性
 
 2、封装性:就是让类的某些代码,在类的外部不可见,从而达到保护类代码安全的作用
     --言外之意:不封装就会有不安全不合理的操作存在
     --代码上如何实现?先要看代码不封装会存在什么问题?
    --如果类的属性外部可见,则会存在赋值不合理或者非法的情况,因此需要屏蔽-封装-关键字private修饰
      --用关键字private修饰后,外部的确不可见了
   --虽然对每个属性编写了对外的设置和取值方法后,外部可以见了,但是不合理赋值还是存在
     --在相关的属性的设置和取值中加入验证,既保证外部可用,又保证属性赋值合理
 
 3、所谓封装,其实就是用关键字private修饰属性,让属性外部不可见,之后提供属性的公共设置取值方法,在方法中加入验证
 分步骤:
 --封装类的所有属性
 -为被封装的属性提供对外的公共setter和getter方法
 --在属性先关的setter和getter方法中加入验证代码,既保证外部可见属性,又保证属性赋值合理
 以下就是封装的例子:

/**
 * @ClassName: EmployeeInfor.java
 * @Description: 该类的功能描述
 *1、类名称必须有实际意义,可以明确描述出某一类实体,例如学生、教师等;类<属性、方法>的起名,顾名思义
 *2、类中的所有属性必须使用private进行封装;
 *3、所有封装的属性必须提供setter和getter方法;
 *4、类中可以定义若干构造方法,但必须明确保留一个无参构造方法定义;构造为属性初始化,再保留无参构造
 *5、类中不允许出现任何输出操作,所有的输出必须将数据返回给调用处输出;即类中提供一个可以取得对象完整信息的方法,方法名称暂定位getInfo(),提供给调用出调用输出对象完整信息;方法的返回值必须是一个具体返回值类型,不再用void修饰之后在方法中自己System.out.println()
 *6、编写测试类进行验证。
 * @version: v1.0.0
 * @date: 2019年10月11日 下午1:31:11
 */
public class EmployeeInfor {
    public static void main(String[] args) {
        Employee employ = new Employee();
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入职工编号:");
        int number = scan.nextInt();
        employ.setEmpNo(number);
        System.out.println("请输入职工姓名:");
        String name = scan.next();
        employ.setEmpName(name);;
        System.out.println("请输入职位:");
        String job = scan.next();
        employ.setEmpJob(job);
        System.out.println("请输入工资:");
        Float salay = scan.nextFloat();
        employ.setEmpSal(salay);
        System.out.println(employ.getInfo());
        
    }
    static class Employee{
        private int empNo;//职工编号
        private String empName;//职工姓名
        private String empJob;//职位
        private float empSal;//职工薪水
        //无参构造方法
        public Employee() {
        }
        
        /**
         * @param empNo
         * @param empName
         * @param empJob
         * @param empSal
         * 有参构造方法
         */
        public Employee(int empNo, String empName, String empJob, float empSal) {
            super();
            this.empNo = empNo;
            this.empName = empName;
            this.empJob = empJob;
            this.empSal = empSal;
        }

        public int getEmpNo() {
            return empNo;
        }
        public void setEmpNo(int empNo) {
            this.empNo = empNo;
        }
    
        public String getEmpName() {
            return empName;
        }
    
        public void setEmpName(String empName) {
            this.empName = empName;
        }
        public String getEmpJob() {
            return empJob;
        }
        public void setEmpJob(String empJob) {
            this.empJob = empJob;
        }
        public float getEmpSal() {
            return empSal;
        }
        public void setEmpSal(float empSal) {
            this.empSal = empSal;
        }
        public String getInfo(){
            return "职工编号:"+getEmpNo()+";职工名:"+getEmpName()
                    +";职位:"+getEmpJob()+";工资:"+getEmpSal();
        }
    }

}

最后一个是整一个继承和封装的实例;

public class E {
    public static void main(String[] args) {
         Monkey m = new Monkey("小明的祖宗");
            m.speak();
         People2 p = new People2("小明");
            p.speak();
            p.think();

    }

}

//父类
class Monkey{
    public Monkey(String s){
        super();
    }
    public void speak(){
        System.out.println("咿咿呀呀......");
    }
}

class People2 extends Monkey{
    public People2(String s) {
        super(s);
    }
    //方法覆写
    public void speak(){
        System.out.println("小样的,不错嘛!会说话了!");
    }
    public void think(){
        System.out.println("别说话!认真思考!");
    }
    
}

方法重写和方法重载的区别

每天进步一点点,离成功就不远了,一起加油!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值