一切皆对象(2)

访问控制权限

——总结自《java编程思想》
package用于控制构件构建捆绑到一个内聚的类库单元中。访问修饰符会因此受到影响。访问权限控制的等级,从最小到最大权限依次为:public,protected、包访问权限、private

java可运行程序是一组可以打包并压缩为一个java文档文件(jar)的.class文件。java解释器负责这些文件的查找、装载、解释。

类库实际上是一组类文件、其中每个文件都有一个public类以及任意数量的非public类。因此每个文件都有一个构件。可以使用关键字package使这些构件从属于一个群组。

java解释器的运行过程:

首先找出环境变量CLASSPATH,CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包的名称并且将每个句点替换成反斜杆,以从CLASSPATH中产生一个路径名称。得到的路径与CLASSPATH中的各个不同的项相连接,解释器就在这些目录中查找与你所要创建的类名称相关的.class文件。

在这里插入图片描述

复用类

复用类包括组成语法和继承语法以及代理

继承语法:继承并不只是复制基类的接口。当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与用基类直接创建的对象是一样的。二者的区别在,后者来自于外部,而基类的子对象被包装在导出类的对象内部。

代理:java并没有提供对它的直接支持。这是继承与组合之间的中间件。

名称屏蔽:如果java的基类拥有某个已经被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽器在基类中的任何版本。因此,无论是在该层或者它的基类中对方法进行定义,重载机制都可以正常工作。

一个既是static又是final的域只占据一段不能改变的存储空间。

使用final方法:把方法锁定,以防任何继承类修改它的含义。类中所有的private方法都隐式地指定是final的。

多态

多态的作用是消除类型之间的耦合关系

向上转型:把对某个对象的引用视为对其基类型的引用。

java中除了static方法和final方法之外,其它所有的方法都是后期绑定。(关于前期绑定和后期绑定在一切皆对象(1)有相关简介)

在父类构造器中,应当调用private ,final ,static 修饰的不具备多态特性的方法,否则可能会造成麻烦。例如:

public class A {

    A() {
        System.out.println("A start to run");
        start();
        System.out.println("A end  run ");
    }

    void start() {
        System.out.println("A is start run");
    }

}

class B extends A {

    private String name = "zs";

    B(String name) {
        this.name = name;
        System.out.println("B,init name " + this.name);
    }

    @Override
    void start() {
        System.out.println(name + " b is start run");
    }

    public static void main(String[] args) {
        new B("ls");
    }

}
/*
输出结果:
A start to run
null b is start run
A end  run 
B,init name ls
*/

原因:第一:初始化子类对象时,总是先向上初始化父类对象。级别越高,越先初始化,Object最先被初始化。本例中,在初始化B对象时,那么先调用父类对象A的构造器,来初始化父类对象。那么当程序运行至start方法时,将调用子类B重写后的start方法。

第二:类中的成员变量,依据声明顺序初始化。本例中,B构造器默认第一句调用A构造器,此时,B尚未被初始化,B中的成员变量name 只是分配了内存地址并被系统赋予默认值,此时为null。

协变返回类型:表示在导出类中被覆盖方法可以返回基类方法的返回类型的某种导出类型。子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。

接口

interface中的变量都是默认public static final修饰的

interface中的方法都是默认public abstract修饰的

因为放入接口总的任何域都自动是static和final额,所以接口就成为了一种很便捷的用来创建常量组的工具。例:

public interface Day{
    int
        one=1, two=2,three=3,
    	four=4,five=5,six=6;
}

接口是实现多重继承的途径,而生成遵循某个接口的对象的典型方式就是工程方法设计模式。

java8 接口的新特性

static方法、default方法

public interface InterfaceA {
     /**
        静态方法
        实现接口的类或者子接口不会继承接口中的静态方法
     */
    static void showStatic() {
        System.out.println("it is interfaceA");
    }
    /*
      默认方法
      如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。
      如果实现多个接口时,每个接口都有相同的default方法需要重写该方法。
     */
    default void showDefault() {
        System.out.println("it is interfaceA");
    }

}

public class InterfaceAImpl implements InterfaceA{

    
}

public class Test {
    public static void main(String[] args) {
        InterfaceA.showStatic();
        new InterfaceAImpl().showDefault();
    }
}

内部类

可以将一个类的定义放在另一个类的定义内部

当成员内部类拥有和外部类同名的成员变量或这方法时, 默认情况下访问的是内部类的成员, 如要访问外部类的同名成员, 需要使用以下形式:

​ 外部类.this.成员变量
​ 外部类.this.成员方法

在拥有外部类对象之前是不可能创建内部类对象的。这是因为内部类对象会暗暗地连接到创建它的外部类对象上。但是如果创建的是嵌套类(静态内部类)就不需要对外部类的引用(不能从嵌套类的对象中访问非静态的外围类对象)。

接口内部的类

public interface ClassInterface {
    void show();
    class Test implements ClassInterface{

        @Override
        public void show() {
            System.out.println("show!");
        }

        public static void main(String[] args) {
            new Test().show();
        }
    }
}
/*
	输出结果
	show!
*/

内部的覆盖:当继承了某个外围类的时候,内部类并没有发生什么特别的变化。这两个内部类是完全独立的两个实体

局部内部类不能有访问说明符,因为它不是外围类的一部分,但是可以访问当前代码块内的常量以及此外围类的所有成员。

内部类标识符:由于每个类都会产生一个.class文件,内部类也必须生成一个包含它们的class对象信息。外围类的名字加上" " " "再加上内部类的名字。如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。如果内部类是嵌套在别的内部类中,只需将它们的名字加在其外围类标识符与" "的后面。

发布了12 篇原创文章 · 获赞 1 · 访问量 201

猜你喜欢

转载自blog.csdn.net/qq_42885587/article/details/104363476