封装

  • 该露的露,该藏的藏

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

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

package com.oop.demo4;
/**
 * 封装 get set方法
 */
public class Student {
    //将数据私有化
    private String name;
    private int age;
    private char sex;

    //通过get方法去获取属性值
    public String getName() {
        return name;
    }
    //通过set方法给属性设置值
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }
}

继承

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

  • extents的意思是“扩展”,子类是父类的扩展

  • java中只有单继承,没有多继承

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

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

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

  • Object类 (所有的类都直接或间接的继承了Object类)

  • super

    super注意点:
    	#1.super调用父类的构造方法,必须在构造方法的第一行
    	#2.super必须只能出现在子类的方法或者构造方法中!
    	#3.super和this不能同时调用构造方法
    super和this:
    	#代表的对象不同:
    		this:代表的是本身调用者这个对象
    		super:代表的是父类对象的引用
    	#前提:
    		this:没有继承关系也能使用
    		super:只能在继承关系中使用
    	#构造方法:
    		this():本类的构造
    		super():父类的构造
    
  • 方法重写

    package com.oop.demo5;
    /**
     * 静态方法和非静态方法区别很大 加static的静态方法 看左边定义的是哪个类就调用哪个类的静态方法
     * 非静态方法 看右边的类
     * 重写:需要有继承关系,子类重写父类的方法!
     *  1.方法名必须相同
     *  2.参数列表必须相同
     *  3.修饰符:子类重写父类方法的修饰符不能小于父类 public>protected>default>private
     *  4.抛出的异常:子类重写父类方法抛出的异常不能大于父类
     *  重写:子类的方法和父类必须要一致:方法体不同
     *  为什么要重写?
     *  父类的方法不满足子类的需求
     *  父类的方法不满足子类的需求
     *  什么情况下不能重写:
     *  1.加了static的方法 static是属于类的
     *  2.加了final的方法
     *  3.加了private的方法
     */
    public class Test {
        public static void main(String[] args) {
            Student student = new Student();
           // student.say("张三");
            Person a=new Student();
            student.say();
        }
    }
    

多态

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

  • 一个对象的实际类型是确定的,但是指向对象的引用的类型有很多(父类,有关系的类)

  • 多态存在的条件

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

package com.oop.demo6;

/**
 * 多态注意事项
 * 1.多态是方法的多态,属性没有多态
 * 2.父类和子类有关系,属性转换异常(ClassCaseException)
 * 存在关系 继承 子类需要重写父类方法 父类引用指向子类
 */
public class Test {
    public static void main(String[] args) {
        // new Student()一个对象的实际类型是确定的 但是可以指向的引用类型就不确定了:父类引用指向子类
        //能不能调用看=左边引用类型   具体调用谁是看=右边实际类型
        //父类不能调用子类特有的方法 如果需要调用 则需要转型(强转)
        Student student=new Student();
        Person p = new Student();
      student.eat();
      p.eat();
      student.study();
        ((Student)p).study();
    }
}

instanceof和类型转换

instanceof 判断对象类型是否一致

Object o = new Student();
        System.out.println(o instanceof Student);
        System.out.println(o instanceof Person);
        System.out.println(o instanceof Object);
        System.out.println(o instanceof Thread);
        System.out.println(o instanceof String);
        Person person = new Student();
        System.out.println(person instanceof Student);
        System.out.println(person instanceof Person);
        System.out.println(person instanceof Object);
        /*System.out.println(person instanceof Thread);
        System.out.println(person instanceof String);*/