美文网首页
[java]5、面向对象

[java]5、面向对象

作者: 史记_d5da | 来源:发表于2021-10-05 23:02 被阅读0次

1、继承关系中,父子类构造方法的访问特点

1、子类构造方法当中有一个默认隐含的”super()“调用,所以一定是先调用的父类构造,后执行的子类构造。
2、子类构造可以通过super关键字来调用父类重载构造。
3、super的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。

2、super关键字用来访问父类的内容,而this关键字用来访问本类内容。用法也有三种

1、在本类的成员方法中,访问本类的成员变量
2、在本类的成员方法中,访问本类的另一个成员方法
3、在本类的构造方法中,访问本类的另一个构造方法
this(...)调用也必须是构造方法的第一个语句,唯一一个
super和this两种构造调用,不能同时使用

// Fu
public class Fu {
    int num = 20;
}
// Zi
public class Zi extends  Fu{
    int num = 20;

    public Zi() {
        this(123); // 本类的无参构造,调用本类的有参构造
    }

    public Zi(int n) {
    }
    public void showNum() {
        int num = 10;
        System.out.println(num); // 10
        System.out.println(this.num); // 20
        System.out.println(super.num); // 30
    }

    public void methodA() {
        System.out.println("AAA");
    }

    public void methodB() {
        this.methodA();
        System.out.println("BBB");
    }
}

3、抽象类

1、抽象类不能够创建对象,如果创建,编译无法通过而报错。
2、抽象类中可以有构造方法,是供子类创建对象时,初始化父类成员使用。
3、抽象类中,不一定包含抽象方法,但是抽象方法的类必定是抽象类。
4、抽象类的子类,必须重写抽象父类中的抽象方法,否则,编译无法通过而报错。

4、Interface

在任何版本的Java中,接口都能定义抽象方法。
格式:
public abstract 返回值类型 方法名称(参数列表)
注意事项:
1、接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
2、这两个关键字可以选择性的省略

public interface MyInterfaceAbstract {
    // 下面都是抽象方法
    public abstract  void method1();
    abstract  void method2();
    public  void method3();
    void method4();
}

3、接口的默认方法,可以通过接口实现类对象,直接调用
4、接口的默认方法,也可被接口实现类覆盖重写。

public interface MyInterfaceAbstract {
    public default void method1() {
        System.out.println("我是一个默认方法");
    };
}

5、从java8开始接口中允许定义静态方法
调用方式:接口名称.静态方法名(参数)
6、从java9开始,接口当中允许定义私有方法。
普通私有方法:解决多个默认方法之间重复代码问题。
静态私有方法:解决多个静态方法之间重复代码问题。

public interface MyInterfacePrivate {
    public static void method1() {
        System.out.println("静态方法1");
        methodCommon();
    }
    public static void method2() {
        System.out.println("静态方法2");
        methodCommon();
    }

    private static void methodCommon() {
        System.out.println("AAA");
        System.out.println("BBB");
    }
}

7、一个类实现多个接口的方法
注意点:
1)、如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
2)、如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
3)、一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。
4)、多个父类接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,【而且带着default关键字】。

5、final

可以修饰一个类、方法、局部变量、成员变量
由于成员变量具有默认值,所以用了final之后必须手动赋值,不会在给默认值了。
对于final成员变量,要么直接赋值,要么通过构造方法赋值。
必须保证类中的所有重载的构造方法,都最终会对final成员变量赋值。

6、访问权限

权限 public protected (default) private
同一个类 YES YES YES YES
同一个包 YES YES YES NO
不同包子类 YES YES NO NO
不同包非子类 YES NO NO NO

注:(default)代表不写

7、内部类

1、成员内部类
2、局部内部类(包含匿名内部类)
1、间接方式:在外部类的方法当中,使用内部类:然后main只是调用外部类的方法。
2、直接方法,公式:类名称 对象名 = new 类名称()
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

// Hear class
// ========
public class Body {
    public class Heart {
        // 内部类的方法
        public void beat() {
            System.out.println("心脏跳动");
            System.out.println("我叫:" + name);
        }
    }
    private String name = "外部类成员";
    public void  methodBody() {
        System.out.println("外部类方法");
        new Heart().beat(); // 间接调用
    }
}
// main class
// ========
public class Demo01HeartClass {
    public static void main(String[] args) {
        // 间接调用
        Body body = new Body();
        body.methodBody();
        // 直接调用
        Body.Heart heart = new Body().new Heart();
        heart.beat();
    }
}

3、如果出现了重名现象:外部类名称.this.外部类成员变量名

public class Outer {
    int num = 10;
    public class Inner {
        int num = 20;
        public void methodInner() {
            int num = 30;
            System.out.println(num); // 局部变量就近原则
            System.out.println(this.num); // 内部类的成员变量
            System.out.println(Outer.this.num); // 外部类的成员变量
        }
    }
}

4、从java8开始,只要局部变量事实不变,那么final关键字可以省略

public class Outer {
    public void methodOuter() {
        int num = 10; // 所在方法的局部变量
        class MyInner {
            public void methodInner() {
                System.out.println(num);
            }
        }
    }
}

5、匿名内部类
如果接口实现类,只需要使用唯一一次
那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】。

// MyInterface
// =========
public interface MyInterface {
    public void method();
}
// ========
MyInterface obj = new MyInterface() {
    @Override
    public void method() {
        System.out.println("匿名内部类");
    }
};
obj.method();

相关文章

网友评论

      本文标题:[java]5、面向对象

      本文链接:https://www.haomeiwen.com/subject/qeygnltx.html