封装,继承(方法的重写),多态(instanceof;类型转换)

封装

  • 该露的露,该藏的藏

    • 我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
  • 封装(数据的隐藏)

    • 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
  • 属性私有,get/set

  • package com.mao.oop.demo04;
    
    //类 private:私有
    public class Student {
    
        //属性私有
        private String name;//名字
        private int id;//学号
        private char sex;//性别
        private int age;//年龄
    
        //提供一些可以操作这个属性的方法!
        //提供一些public的get、set方法
    
        //get 获得这个数据
        public String getName(){
            return this.name;
        }
    
        //set 给这个数据设置值
        public void setName(String name){
            this.name = name;
        }
    
        //alt + insert可以自动生成get set方法
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public char getSex() {
            return sex;
        }
    
        public void setSex(char sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            if (age>120 || age<0){
                this.age = 3;
            }else{
                this.age = age;
            }
    
        }
    }
    /*
        package com.mao.oop;
    
    
    import com.mao.oop.demo04.Student;
    
        /*
        1.提高程序的安全性,保护数据
        2.隐藏代码的实现细节
        3.统一接口
        4.系统的可维护性增加了
         */
    
    /*
    //一个项目一个只存在一个main方法
    public class Application {
        public static void main(String[] args) {
            Student s1 = new Student();
    
            s1.setName("大猫");
    
            //方法名,参数列表
            System.out.println(s1.getName());
    
            s1.setAge(999);//不合法的
            System.out.println(s1.getAge());
        }
    }
     */
    

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模

  • extends的意思是“扩展”。子类是父类的扩展

  • JAVA中类只有单继承,没有多继承

  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等

  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示

  • 子类和父类之间,从意义上讲具有“is a”的关系

  • object类

  • super

    • super注意点:
          1.super调用父类的构造方法,必须在构造方法的第一个
          2.super必须只能出现在子类的方法或者构造方法中!
          3.superthis不能同时调用构造方法!
      
      Vs this:
          代表的对象不同:
              this:本身调用者这个对象
              super:代表父类对象的应用
          前提
              this:没有继承也可以使用
              super:只能在继承条件才能使用
          构造方法
              this();本类的构造
              super():父类的构造
      
  • 方法重写

  • package com.mao.oop.demo05;
    
    //重写都是方法的重写,和属性无关
    public class B {
    
        public void test(){
            System.out.println("B=>test()");
        }
    }
    
    重写:需要有继承关系,子类重写父类的方法!
        1.方法名必须相同
        2.参数列表必须相同
        3.修饰符:范围可以扩大:public > protected > default > private
        4.抛出的异常:范围,可以被缩小,但不能扩大  ClassNotFoundException --> Exception(大)
    
    重写,子类的方法和父类必须要一致,方法体不同!
    
    为什么要重写:
        1.父类的功能,子类不一定需要,或者不一定满足!
        Alt + Insert    :   override
    

多态

  • 动态编译:类型:可扩展性

  • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式

  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

  • 多态存在的条件

    • 有继承关系
    • 子类重写父类方法
    • 父类引用指向子类对象
  • 注意:多态是方法的多态,属性没有多态性

    • package com.mao.oop.demo06;
      
      public class Person {
      
          public void run(){
      
          }
      }
      
      package com.mao.oop.demo06;
      
      public class Student extends Person {
      
          @Override
          public void run() {
              System.out.println("son");
          }
      
          public void eat(){
              System.out.println("吃");
          }
      }
          /*
          多态注意事项:
          1.多态是方法的多态,属性没有多态
          2.父类和子类,有联系 类型转换异常  ClassCastException
          3.存在条件:继承关系,方法需要重写,父类引用指向子类对象   Father f1 = new Son();
      
              1.static    方法,属于类,不属于实例
              2.final     常量:
              3.private   方法
           */
      
      package com.mao.oop;
      
      
      import com.mao.oop.demo06.Person;
      import com.mao.oop.demo06.Student;
      
      //一个项目一个只存在一个main方法
      public class Application {
          public static void main(String[] args) {
      
      
              //一个对象的实际类型是确定的
              //new Student();
              //new Person();
      
              //可以指向的引用类型就不确定了:父类的引用指向子类
      
              //Student能调用的方法都是自己的或者是继承父类的
              Student s1 = new Student();
              //Person父类型,可以指向子类,但是不能调用子类独有的方法
              Person s2 = new Student();
              Object s3 = new Student();
      
              s2.run();//子类重写了父类的方法,就指向子类的方法
              s1.run();//
      
              //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
      //        s2.eat();
              ((Student)s2).eat();//通过强制类型转换可以调用Student的方法
              s1.eat();
          }
      
      }
      
  • instanceof

    • package com.mao.oop.demo06;
      
      public class Person {
      
      }
      
      package com.mao.oop.demo06;
      
      public class Student extends Person {
      
      
      }
      
      package com.mao.oop.demo06;
      
      public class Teacher extends Person {
      }
      
      package com.mao.oop;
      
      
      import com.mao.oop.demo06.Person;
      import com.mao.oop.demo06.Student;
      import com.mao.oop.demo06.Teacher;
      
      //一个项目一个只存在一个main方法
      public class Application {
          public static void main(String[] args) {
      
              //Object > Person > Student
              Object object = new Student();
      
              //System.out.println(X instanceof Y);//能不能编译通过!
      
              System.out.println(object instanceof Student);//true
              System.out.println(object instanceof Person);//true
              System.out.println(object instanceof Object);//true
              System.out.println(object instanceof Teacher);//false
              System.out.println(object instanceof String);//false
              System.out.println("=====================");
              Person person = new Student();
              System.out.println(person instanceof Student);//true
              System.out.println(person instanceof Person);//true
              System.out.println(person instanceof Object);//true
              System.out.println(person instanceof Teacher);//false
              //System.out.println(person instanceof String);//编译报错!
              System.out.println("=====================");
              Student student = new Student();
              System.out.println(student instanceof Student);//true
              System.out.println(student instanceof Person);//true
              System.out.println(student instanceof Object);//true
              //System.out.println(student instanceof Teacher);//编译报错
              //System.out.println(student instanceof String);//编译报错!
      
          }
      
      }
      
  • 类型转换

    • package com.mao.oop.demo06;
      
      public class Person {
      
          public void run(){
              System.out.println("run");
          }
      }
      
      package com.mao.oop.demo06;
      
      public class Student extends Person {
          public void go(){
              System.out.println("go");
          }
      
      }
      
      package com.mao.oop.demo06;
      
      public class Teacher extends Person {
      }
      
      package com.mao.oop;
      
      
      import com.mao.oop.demo06.Person;
      import com.mao.oop.demo06.Student;
      
      //一个项目一个只存在一个main方法
      public class Application {
          public static void main(String[] args) {
              //类型之间的转化:父     子
      
              //高                     低
              Person obj = new Student();
      
              //student将这个对象转换为Student类型,我们就可以使用Student类型的方法了
              ((Student) obj).go();//1
              Student student = (Student) obj;//2
              student.go();
      
              //子类转父类,可能会丢失自己本来的一些方法
              Student student1 = new Student();
              student.go();
              Person person = student1;
      
          }
      }
          /*
          1.父类引用指向子类的对象
          2.把子类转换为父类,向上转型:
          3.把父类转换为子类,向下转型:需要强制转换
          4.方便方法的调用,减少重复的代码!可以使代码变得简洁
           */
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九命猫小宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值