1.static修饰的成员变量和方法有什么特点? 如何访问?
static 是 Java 中的一个关键字,用于声明类的静态成员,包括静态变量(也称为类变量)和静态方法(也称为类方法)。
静态成员变量特点:
1.共享性:被 static 修饰的成员变量被类的所有对象所共享,也就是说,无论创建多少个该类的对象,静态变量在内存中只有一个副本。
2.生命周期:静态变量随着类的加载而存在,不依赖于任何对象的存在。
3.内存分配:静态变量存储在方法区的静态区域,而非堆内存。
4.访问方式:可以通过类名直接访问,也可以通过对象访问,但推荐使用类名以明确表示它是静态的。
静态成员方法特点:
1.无需实例化:静态方法不需要创建类的实例就可以直接访问。
2.访问权限:只能直接访问类的静态成员,不能直接访问实例成员。
3.内存分配:静态方法存储在方法区,与对象无关。
4.生命周期:随着类的加载而存在,不依赖于任何对象的存在。
5.不能使用 this 或 super 关键字:因为静态方法不属于特定的对象实例。
2.静态代码块的语法、特点和作用分别是什么?
1.语法:
public class MyClass {
static {
// 静态代码块的内容
// 这里的代码会在类加载时执行
}
}
2.特点:1.随类加载而执行:
静态代码块会在类首次被 JVM 加载时执行。
2.只执行一次:每个类的静态代码块只会执行一次,即使创建该类的多个实例也是如此。
3.优先于构造函数执行:静态代码块的执行发生在任何构造函数执行之前。
4.初始化静态变量:通常用于初始化类中的静态变量。
5.执行顺序:如果一个类继承自另一个类,父类的静态代码块会先于子类的静态代码块执行。
6.独立于对象:静态代码块不依赖于任何对象的存在。
3.作用:1.初始化静态变量:
静态代码块可以用于初始化类中的静态变量,确保在使用这些变量之前它们已经被正确初始化。
2.执行一次性初始化操作:可以用于执行一次性的初始化操作,比如读取配置文件、建立数据库连接等。
3.预加载资源:可以在类加载时预加载一些资源,以提高程序的性能。例如,预加载一些常用的数据,减少后续操作的延迟。
3.什么是继承?有什么特点和优点?
继承是面向对象编程(OOP)中的一个核心概念,它允许创建新的类(子类)来继承现有类(父类)的属性和方法。通过继承,子类可以重用父类的功能,并且还可以添加自己的特性或者覆盖父类的行为。
继承的特点:
1.单继承:Java 支持单继承,即一个类只能直接继承一个父类。
2.多层继承:尽管 Java 不支持多继承(即一个类不能同时继承多个父类),但它支持多层继承,即一个类可以继承另一个类,后者又可以继承另一个类,以此类推。
3.方法和属性的传递:子类自动获得父类的所有非私有(public 和 protected)方法和属性。
4.构造器不被继承:子类不会继承父类的构造器,但可以通过 super() 显式地调用父类的构造器。
5.访问控制:子类只能访问父类中声明为 public 或 protected 的成员,不能访问 private 或默认(包访问)的成员。
6.初始化顺序:在创建子类对象时,会首先初始化父类,然后再初始化子类。
7.耦合性:继承使得类与类之间的耦合度增加,因为子类依赖于父类的具体实现。
继承的优点:
1.代码复用:通过继承,子类可以重用父类的方法和属性,减少了代码重复,提高了代码的复用性。
2.易于维护:修改父类的行为可以影响所有继承它的子类,这使得维护更加容易。
3.扩展性:可以轻松地为现有类添加新功能而不改变原始类的设计。
4.多态性:继承是实现多态的基础,子类对象可以被当作父类对象使用,从而实现了接口的一致性和灵活性。
5.逻辑清晰:继承可以反映现实世界中的“is-a”关系,使类之间的关系更加直观和逻辑清晰。
4.java中的四种权限修饰符的作用是什么?
public: 最广泛的访问级别,任何地方都可以访问。
protected: 同一包内和子类可以访问。
default: 仅限于同一包内的类可以访问。
private: 仅限于声明它的类可以访问。
public:
作用范围: 可以在任何地方被访问,包括其他包中的类。
用途: 当你需要让一个成员对所有其他类都可见时使用。
protected:
作用范围: 可以在同一包内的类和不同包中的子类中被访问。
用途: 当你需要让一个成员对同一包中的类和所有子类可见时使用default (无修饰符):
作用范围: 只能在同一包中的类中被访问。
用途: 当你需要让一个成员仅对同一包中的其他类可见时使用。private:
作用范围: 只能在声明它的类中被访问。
用途: 当你需要让一个成员仅对声明它的类可见时使用。
5.什么是方法重写? 有什么注意事项和场景?
方法重写(Method Overriding)是指在继承关系中,子类重新定义了从父类继承的方法的行为。这意味着子类中的方法与父类中的方法具有相同的方法名、返回类型以及相同的参数列表,并且子类方法覆盖了父类的方法。方法重写允许子类根据自己的需求改变或扩展父类的方法行为。
应用场景:
1.定制化行为:当父类提供的方法不符合子类的具体需求时,可以通过方法重写来调整或扩展行为。
2.多态性:方法重写支持多态性,即可以根据对象的实际类型调用相应的方法实现。
3.接口实现:实现接口时,通常需要重写接口中声明的所有抽象方法。
4.标准方法的特定实现:比如 Object 类中的 equals() 和 toString() 方法经常被重写以提供更具体的实现
注意事项:
1.权限修饰符:子类重写的方法的访问级别不能低于父类中被重写的方法的访问级别。
例如,如果父类中的方法是 public 的,那么子类重写的方法也必须是 public 的。
子类不能重写父类中 private 或 final 的方法。
2.方法签名:重写的方法必须与父类中的方法具有完全相同的方法签名(方法名、参数列表)。
3.返回类型:重写的方法的返回类型必须与父类中的方法相同或者为父类返回类型的子类型(对于泛型的情况)。
4.抛出异常:子类重写的方法所抛出的异常不能比父类方法抛出的异常更多或者更宽泛。
5.静态方法:静态方法不能被重写。子类可以有一个与父类静态方法同名的静态方法,但这不是重写而是重载。
6.使用 @Override 注解:在子类中重写父类的方法时,可以使用 @Override 注解来帮助编译器检查是否正确地重写了父类的方法。
6.什么是this和super关键字?作用是什么?
this 关键字
1.引用当前对象:在类的实例方法中,this 关键字可以用来引用当前对象本身。
2.区分成员变量与局部变量:当成员变量与方法中的局部变量名称相同时,可以使用 this 来明确地引用成员变量。
3.调用本类中的其他构造方法:在构造方法中,this 可以用来调用同一个类中的另一个构造方法。
4.作为方法参数传递:可以将 this 作为参数传递给其他方法。
5.返回当前对象:在某些情况下,方法可能需要返回当前对象自身,这时可以使用 this。
super 关键字
1.调用父类的构造方法:子类的构造方法中可以使用 super 来调用父类的构造方法。
2.访问父类的成员变量:子类中可以使用 super 来访问父类中的成员变量。
3.调用父类的方法:子类中可以使用 super 来调用父类中的方法,这在方法重写时特别有用,可以在子类中调用父类的实现。
使用注意事项
1.this 和 super 都不能在静态方法中使用,因为静态方法不依赖于对象实例。
2.this 构造方法调用必须是构造方法中的第一条语句。
3.super 必须用于调用父类的构造方法,同样也是构造方法中的第一条语句。
4.super 不能用于调用父类的私有成员(变量或方法)。
7.继承中构造方法的访问有什么特点?
在Java中,继承关系中构造方法的访问特点主要包括以下几点:
1.构造方法的调用顺序:
子类构造器会隐式或显式地调用其直接父类的构造器。
如果子类构造器中没有显式地调用父类的构造器(使用 super 关键字),则会默认调用父类的无参数构造器。
2.显式调用父类构造器:
可以使用 super() 显式调用父类的无参构造器。
可以使用 super(参数列表) 显式调用父类的某个带参数的构造器。
3.构造器链:
当父类构造器被调用时,它可能会继续调用更上层的父类构造器,形成一个构造器调用链。
4,调用位置:
super 关键字调用父类构造器的语句必须是子类构造器的第一条语句。
总结来说,在继承关系中,构造方法的访问特点主要体现在构造方法的调用顺序和方式上。构造方法总是首先调用父类的构造方法,然后才执行子类自身的构造逻辑。这种机制确保了父类的初始化逻辑能够在子类对象创建之前得到执行,从而保证了对象状态的一致性和完整性。