面向对象02

封装详解

本质上来说就是把该隐藏的隐藏起来,不允许外部干涉,仅暴露一些少量接口供外部使用。比如一台电视机,只需要暴露出红外换台的接口即可,不需要将内部结构展示出来。

这也是我们程序设计所遵循的原则,即高内聚(类的内部数据操作细节自己完成),低耦合(仅暴露少量方法给外部使用)。

封装一句本质:属性私有,get/set

封装的好处:
1.安全:
可以防止系统被破坏,举一个例子。
比如我们给一个学生传入年龄,如果我们传入负数或者999等很大的数其实就是对系统的破坏,通过封装我们可以进行规避。
因为封装使用了private关键字,传入值时必须使用get,set方法,这里可以在set方法中写代码进行规避。

public class student {
    private int age;

   

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age>120||age<0)
        { System.out.println("输入错误");
    }else{
            this.age = age;}
    }

这里就对年龄的数值进行了限制,达到防止恶意输入数据的问题。

2.隐藏细节,统一接口
封装的代码对外是隐藏的,只提供一个外部访问的接口
3.可维护性高

继承

继承的本质是对一批类的抽象,从而实现对现实世界更好的建模。
Java是单继承的,没有多继承。但是可以实现表面上的多继承,实际还是单继承。
所有的类都是object的子类,也就是说所有的类都直接或者间接继承了object类

private私有方法和属性不能被继承

super详解

请输入图片描述
对象实例化后,父类无参构造先执行之后再执行子类无参构造
this与super的使用
前提:
this:没有继承也可以使用
super:只能在继承条件下才可以使用
构造方法:
this():本类的构造
super():父类的构造

方法重写

重写都是方法的重写,与属性无关。
子类继承了父类才能重写父类的方法
重写:
1.方法名必须相同
2.参数列表必须相同
3.修饰符范围不能缩小
4.抛出的异常范围可以被缩小但不能扩大
为什么需要重写?
因为父类的功能子类不一定需要或者不一定满足

回顾方法重载
重载就是方法名相同参数列表不同,重载是在一个类中的。
说明:
参数列表不同包括:个数不同、顺序不同、类型不同。
仅仅参数变量名称不同是不可以的。
跟成员方法一样,构造方法也可以重载。
声明为final的方法不能被重载。
声明为static的方法不能被重载,但是能够被在此声明。
代码演示:
定义一个父类:

package review06;

public class B {
    public static void test (){
        System.out.println("B的test方法");
    }
}

定义一个子类继承父类:

package review06;

public class A extends B {
public static void test(){
    System.out.println("A的test方法");
}
}

main方法:

package review06;

public class extendsTest {
    public static void main(String[] args) {
        A a=new A();
        a.test();
//父类的引用指向了子类
        B b=new A();
        b.test();
    }
}

运行结果:
A的test方法
B的test方法
解析:
这里的B b=new A();如何理解?
B是父类,子类A继承了父类,这句代码表示定义了一个B类型的引用指向A类型的对象。
由于A是继承父类B,所以B类型的引用是可以指向A类型的对象的,这个称之为向上转型

这样做有何意义?

因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,父类引用是无法调用的。

静态方法和非静态方法区别很大,非静态方法才能被重写
同样是上面的代码,我们吧static关键字去掉会怎样呢?
定义一个父类:

package review06;

public class B {
    public  void test (){
        System.out.println("B的test方法");
    }
}

定义一个子类继承父类:

package review06;

public class A extends B {
public  void test(){
    System.out.println("A的test方法");
}
}

main方法:

package review06;

public class extendsTest {
    public static void main(String[] args) {
        A a=new A();
        a.test();
//父类的引用指向了子类
        B b=new A();//子类重写了父类的方法
        b.test();
    }
}

运行结果:
A的test方法
A的test方法

这是因为子类重写了父类的方法

无标签
打赏
评论区
头像
    头像

    不戳