文章目录 1.构造函数抛出异常导致内存泄漏 2.使用智能指针管理内存资源 参考文献 从语法上来说,构造函数可以抛出异常。但从逻辑上和风险控制上,构造函数中尽量不要抛出异常。...同时,由于构造函数本身也是一个函数,在函数体内抛出异常将导致当前函数运行结束,并释放已经构造的成员对象,包括其基类的成员,即执行直接基类和成员对象的析构函数。考察如下程序。...此外,在构造对象b的时候,先要执行其直接基类A的构造函数,再执行其成员对象c的构造函数,然后再进入类B的构造函数。...由于在类B的构造函数中抛出了异常,而此异常并未在构造函数中被捕捉,所以导致类B的构造函数执行中断,对象b并未构造完成。在类B的构造函数“回滚”的过程中,c的析构函数和类A的析构函数相继被调用。...因此,当构造函数不得已抛出异常时,可以利用智能指针 unique_ptr 来防止内存泄露。
如果使用某个变量去获取某个类型的对象创建,但是在这个类型的构造函数调用时抛出异常,请问此变量是否可以拿到对应的对象 如下面代码 private void F1() {...throw new Exception("lindexi is doubi"); } ~Foo() { } } 请问在执行完成 F1 函数前...,在 F1 函数定义的 foo 变量是什么,是空,还是 Foo 对象 答案自然是空,原因是在 .NET 运行时的逻辑是先分配对象内存空间,然后再调用对象的构造函数,接着将对象赋值给到 foo 变量 而在进行第二步时就炸了
如果超类没有不带参数的构造器,并且在子类的构造器又没有显式地调用超类的其他构造器,则 java 编译器将报告错误 情况四:子类和父类有同名同类型的静态常量的时候 public class Main...最后,附上两张图,大家可以明显发发现一些端倪,希望对大家能有记忆作用哈: 图一:构造代码块是在初始化对象属性(成员变量)之前执行的 ?...3、原则上,子类的构造函数不能多于父类的 ? 4、子类构造函数若多余父类(或者类型啥的和父类不匹配),需要显示的调用父类构造函数 ?...我觉得脑子里应该浮现出一个这样的知识点: Java中赋值顺序: 1、父类的静态变量赋值 2、自身的静态变量赋值 3、父类成员变量赋值和父类块赋值 4、父类构造函数赋值 5、自身成员变量赋值和自身块赋值...b变量的赋值语句还没有执行哦~~~) 而对象初始化的顺序为:成员变量 -> 普通代码块 -> 构造函数 因此这一波过后:a=110了。
2017.8.16 构造函数:构造创建对象时调用的函数,可以给对象进行初始化操作 一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数 如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了...构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化操作 一般函数:对象创建后,需要函数功能时才调用 构造函数:对象创建时,会调用只调用一次 一般函数:对象创建后,可以被调用多次 什么时候定义构造函数呢...,而构造函数是给对应的对象进行针对性的初始化 8.18 该类的方法都是静态的,所以该类是不需要的创建对象的,为了保证不让其它成创建该类对象,可以将构造函数私有化 必须对于多个程序使用同一个配置信息对象时...因为调用抽象方法没意义 3.抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则,这个子类还是抽象类 1.抽象类有构造函数嘛? 有,用于给子类对象进行初始化。...throws和throw的区别: 1.throws是使用在函数上,throw使用在函数内 2.throws抛出的是异常类,可以抛出多个,用逗号隔开,throw抛出的是异常对象 异常处理的捕捉形式: 这是可以对异常进行针对性处理的形式
解答:构造函数是一种特殊的方法,用于初始化新创建的对象。在 Java 中,构造函数的名称必须与类名相同,并且没有返回类型。...解答:static 是 Java 中的一个关键字,它可以用来修饰类的成员(成员变量和成员方法),也可以用来创建静态代码块。...静态代码块:static 关键字还可以形成静态代码块以优化程序性能。static 代码块在类加载的时候就运行了,而且只运行一次,同时运行时机是在构造函数之前。...我们可以使用 throw 关键字抛出一个具体的异常对象,这个异常对象必须是 Throwable 类或其子类的实例。throw 语句后面必须立即跟着一个异常对象。...在 Java 中如何自定义一个异常? 解答:在 Java 中,我们可以通过继承 Exception 类或其子类来自定义异常。
2.加载过程:加载一个类的时候,首先去加载父类的静态域,然后再加载自身的静态域,之后去初始化父类的成员变量,后加载父类的构造方法,最后初始化自身的成员变量,后加载自身的构造方法。...(先初始化成员变量,后加载构造函数的原因是,构造函数中可能要用到这些成员变量) 父类静态块——子类静态块——父类块——父类构造器——子类块——子类构造器 最终版本:父类静态域——父类静态块——子类静态域...——子类静态块——父类成员变量及代码块——父类构造器——子类成员变量及代码块——子类构造器。...3.加载次数:加载的动作只会加载一次,该类的静态域或第一个实体的创建都会引起加载。 4.变量的初始化:变量的初始化总是在当前类构造器主体执行之前进行的,且static的成员比普通的成员变量先初始化。...、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数 53、Java变量类型 (1)变量类型 静态变量、成员变量
1、子类只能继承父类所有非私有的成员(成员方法、成员变量) 2、子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法 equals和==的区别 == 比较的是变量在内存中堆内存地址...> 构造代码块 -> 构造函数 继承的子类初始化顺序 父类静态属性 -> 父类静态代码块 -> 子类静态属性 -> 子类静态代码块 -> 父类成员变量 -> 父类构造代码块 -> 父类构造方法 -> 子类成员变量...,程序级别错误,可恢复和预防,创建一个类继承Exception是需检查异常 throw 用在方法体内,抛出异常对象名,可以抛出任意Throwable,需由方法体内的语句或throws抛出处理 throws...用在方法名后,跟的是异常名,表示可能抛出异常,并不一定发生这些异常,由方法调用者处理异常 接口和抽象类的区别 接口 1、不包含非常量成员 2、都是静态抽象方法,可多继承 3、只能public,没有构造方法...,没有main函数不可运行 4、主要作用:API定义和实现分离的目的 抽象类 1、可以有普通成员变量 2、可有成员方法也可有抽象方法,单继承 3、public、protected、private都可以,
子类方法不能抛出比父类方法更多的异常 父类的私有方法不能被子类重写 从静态和非静态上看: 父类的静态方法不能被子类重写为非静态方法 子类可以定义于父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法...可以修改 访问修饰符 子类的访问修饰符范围必须大于等于父类访问修饰符范围 可以修改 抛出异常 子类方法异常必须是父类方法异常或父类方法异常子异常 可以修改 继承与修饰符 Java修饰符的作用就是对类或类成员进行修饰或限制...在Java继承中,父子类初始化先后顺序为: 父类中静态成员变量和静态代码块 子类中静态成员变量和静态代码块 父类中普通成员变量和代码块,父类的构造函数 子类中普通成员变量和代码块,子类的构造函数 总的来说...,就是静态>非静态,父类>子类,非构造函数>构造函数。...而在创建子类对象的时候需要先创建父类对象,所以父类优先于子类。 而在调用构造函数的时候,是对成员变量进行一些初始化操作,所以普通成员变量和代码块优于构造函数执行。
记住:所有对象创建时,都需要初始化才可以使用。 注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。...throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。...注意: 如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。...如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。...在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
什么是构造函数?什么是构造函数重载?什么是复制构造函数? 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。...在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。 Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。...每一个构造函数必须有它自己唯一的参数列表。 Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。...在try块中可以抛出异常吗? Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。...throws用来标明一个成员函数可能抛出的各种”异常”。Finally为确保一段代码不管发生什么”异常”都被执行一段代码。
记住:所有对象创建时,都需要初始化才可以使用。 注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。...throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。...注意:如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。...如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。...在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
,随着类的消失而消失 成员变量随着对象的创建而存在,随着对象的消失而消失 调用不同 静态变量可以通过类名调用,也可以通过对象调用 成员变量只能通过对象名调用 4....加载类中静态成员 执行类中静态代码块 加载对象中普通成员 执行构造代码块 执行构造方法 将new Student()的地址赋值给 s 变量 5.7 子父类中构造方法的执行有什么特点?...先执行所有的静态代码块,再执行所有的构造代码块,最后执行构造方法 静态代码块只执行一次, 构造代码块和构造方法,每创建一次对象就执行一次 5.9 抽象类是什么,抽象类的特点?...Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将被提交给java运行时系统,这个过程称为抛出异常。...throws通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。
两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异 常,真正的处理异常由函数的上层调用处理。 5.1.2. JAVA 反射 5.1.2.1....动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结 构上的变化。...JAVA 内部类 Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类。根 据定义的方式不同,内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种。...静态内部类可以访问外部类所有的静态变量和方法,即使是 private 的也一样。 2. 静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。 3....像这种和外部 类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。 5.1.4.2. 成员内部类 定义在类内部的非静态类,就是成员内部类。
静态内部类可以包含静态成员,也可以包含非静态成员,但是静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。...静态内部类是外部类的一个静态成员,因此外部类的所有方法、所有初始化块中可以使用静态内部类来定义变量、创建对象。...PS Java 还允许在接口里定义内部类,接口里的内部类默认是 public static 修饰 1.2.1 创建静态内部类实例 在外部类中,可以直接按照普通的创建对象的形式创建内部类实例 其他类中:...规则: 匿名内部类不能是抽象类 不能定义构造器,但可以定义初始化块,来完成构造器的工作。...当通过实现接口创建匿名内部类时,括号里不能有参数; 当通过继承父类来创建匿名内部类时,将拥有和父类相似的父类构造器(相同的形参列表),会根据参数列表调用父类构造器。类体里可以重写父类的普通方法。
静态变量可以实现让多个对象共享内存。 补充:在Java开发中,上下文类和工具类中通常会有大量的静态成员。...答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。 如何实现对象克隆? 答:有两种方式: 1)....答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。 Java 中的final关键字有哪些用法?...创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。 数据类型之间的转换: - 如何将字符串转换为基本数据类型?...当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。
对所有类可见 构造方法、成员变量初始化以及静态成员变量三者的初始化顺序?...详细的先后顺序:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。...static修饰的方法无需创建对象就可以被调用。static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和静态成员方法。 修饰代码块。...Java代码块执行顺序 父类静态代码块(只执行一次) 子类静态代码块(只执行一次) 父类构造代码块 父类构造函数 子类构造代码块 子类构造函数 普通代码块 Java中一维数组和二维数组的声明方式?...String用于字符串操作,属于不可变类。String对象一旦被创建,其值将不能被改变。而StringBuffer是可变类,当对象创建后,仍然可以对其值进行修改。
Optional 类位于 java.util 包下,自 JDK 1.8 版本新增的,它是一个 final 类,不能被继承,且构造函数是 private 的,不能被实例化,它提供了一系列对 null 空值的处理方法...,是一个包装类,既可以包装非空对象,也可以包装空值,下面来看看它的定义以及默认构造函数。...1、构造函数 Optional 类提供了两个构造函数,都是 private 的,如下: private Optional() { this.value = null; } private Optional...(T value) { // value 值不能为 null,否则会抛出空指针异常 this.value = Objects.requireNonNull(value); } 因为构造函数是私有的...可以通过以下的三个方法: empty() :通过静态工厂方法创建一个空的 Optional 实例; of() :将指定值用 Optional 封装之后返回,如果该值为 null ,则抛出一个 NullPointerException
静态变量可以实现让多个对象共享内存。在Java开发中,上下文类和工具类中通常会有大量的静态成员。 28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?...答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,因此在调用静态方法时可能对象并没有被初始化。 29、如何实现对象克隆?...抽象类是否可继承具体类(concrete class)? 答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承具体类,但前提是具体类必须有明确的构造函数。...35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制? 答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。 36、Java 中的final关键字有哪些用法?...创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。 38、数据类型之间的转换: 1)如何将字符串转换为基本数据类型?
被private修饰的属性和方法,只能由本类使用,其子类不可以访问,更不可以跨包访问。 default Java语言权限修饰符,在java语句中,通常称为 默认修饰符,只允许同包的中的类进行访问。...static static被解释为静态方法,静态方法不需要依赖任何对象就可以访问,所有,对于静态方法来说,是没有this的,但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法...所以当在父类中定义了有参构造函数,还是没有定义无参构造函数时,IDE会强制要求我们定义一个相同参数类型的构造器。...第一种情况:编译不通过 不能直接继承A类,因为A类中存在有参构造函数 第二种情况:编译不通过 重写有参函数以后,还是报错,因为在子类的构造方法中,系统会默认这个有参函数是父类的,不是子类的。...你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字。
构造函数不可以被继承 默认构造函数指没有参数的构造函数 如果编写的类没有构造函数,系统会自动提供一个默认构造函数,它把所有的属性设为默认值(比如一些基本数据类型)。...2 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。...3 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。...throws用来标明一个成员函数可能抛出的各种“异常”。 Finally为确保一段代码不管发生什么“异常”都被执行一段代码。...可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,“异常”的框架就放到堆栈上面,直到所有的try语句都完成。
领取专属 10元无门槛券
手把手带您无忧上云