面向对象——02

137 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天

封装

封装和隐藏

面向对象的三个特征是,封装,继承,多态。

封装的含义简单来说就是将该隐藏的隐藏起来,将该暴露的暴露出来。而这些功能都是需要java提供的访问控制符来完成的。

为了实现比较好的封装:

->将对象的成员变量和实现细节隐藏起来

->把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作

使用访问控制符

java提供了三个访问控制符,private,protected,public来对成员变量,方法和构造器进行修饰。另外如果不加访问控制符的话,访问控制符为default。访问控制级别按照private,default,protected,public进行排序。

  1. private(当前类访问权限):只能在类的内部被访问
  2. default(只有同一个的包访问权限*):包直译过来就是package,因为在命名的过程中经常会出现重名的情况。所以出现了package这个概念
  3. protected(子类访问权限):
  4. public(公共访问权限):最宽松的访问级别

image.png

package包

package lee;
public class Arraytest
{

    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

image.png 则在这个packag lee下建立的类都在lee这个软件包下,不会出现和其他类重名的情况。

继承

继承最大的好处就是可以代码复用

方法重载(overload)

重载是发生在同一个类的多个同名方法之间的

方法重载(Overload)指方法名相同,形参列表不同的方法。Java 通过参数类型来判断该方法是否为重载方法。修饰符不同或返回值类型不同的方法不能称为方法重载!

Java的继承通过extends关键词来实现,实现继承的类是子类(例如苹果),被继承的类被称为父类(也叫基类,超类)(例如水果)。因为子类是一种特殊的父类,所以父类包含的范围总比子类包含的范围要大,所以可以认为父类是大类,子类是小类。

语法格式如下

修饰符 class 子类名 extends 父类名
{
    //类的定义部分
}
public class Fruit {
    public double weight;

    public void info() {
        System.out.println("我是一个水果!重"+weight+"g");

    }
}
public class Apple extends Fruit {
    @Override
    public void info() {
        System.out.println("我变红了");
    }

    public static void main(String[] args) {
        var a=new Apple();
        a.weight=56;
        a.info();
    }
}

如果父类跟子类的方法名相同,则执行子类里的方法.@Override是方法重写的标志-

如果定义一个java类的时候没有指定这个类的直接父类,那么这个类默认扩展为java.lang.Object类.

多态

多态是指同一个类型的多个实例,在执行同一个方法时,呈现出多种行为特征。

public class Bird {
    protected void fly ()  {
        System.out.println("鸵鸟地上跑");

    }
}//定义了一个Bird的父类
public class Sparrow extends Bird{
    @Override
    protected void fly() {
        System.out.println("麻雀天上飞");
    }
}//定义了一个Sarrow的子类
public class Ostrich extends Bird{

}//定义了一个Ostrich的子类
public class Main {
    public static void main(String[] args) {
        Bird b1=new Sparrow();
        Bird b2=new Ostrich();
        b1.fly();
        b2.fly();
    }
}//main函数

image.png

由此可见,在同样一个fly的方法,显现出来了不同的结果,这就被称为多态。

变量的类型

编译时类型:声明该变量时指定的类型。在 Java 程序编译阶段,Java 编译器只认编译时类型。当调用子类有而父类没有的方法,且使用向上转型时,编译器将报错。

运行时类型:该变量实际所引用的类型。

向上转型

子类的对象可以直接赋值给父类变量,其可以自动完成。

构造器重载要求形参列表不同

Super限定

使用super来调用重复的方法的示例如下,同样也可以用super来调用父类里面重复命名的变量:

s
class Fruit {
    public double weight;
    int b=6;
    public void info() {
        System.out.println("我是一个水果!重"+weight+"g");

    }
}//-------------------------------------------父类
public class Apple extends Fruit {
    @Override
    public void info() {
        System.out.println("我变红了");
    }
    protected void callinfo()  {
        super.info();//可以用super调用父类中重复命名的方法
        System.out.println(super.b);
    }

    public static void main(String[] args) {
        var a=new Apple();
        int b=7;
        a.weight=56;
        a.info();
        a.callinfo();
    }
}-----------------------------------------子类

image.png