static都可以修饰哪些?分别有什么用?被static修饰的变量属于类还是属于对象?
static不仅可以修饰变量 还可以修饰方法
静态变量(类变量) 属于类 在计算机中仅存储一份 会被类的全部对象共享 如果一个数据只需要一份并且能够被共享访问和修改 那么我们就可以使用静态变量 例如可用于统计创建出来的对象数量,在构造器中对静态变量++
public class Counter {
// 这是一个静态变量
public static int count = 0;
// 这是一个实例变量
public int instanceCount = 0;
// 构造方法
public Counter() {
// 每次创建对象时,实例变量都会增加
instanceCount++;
// 静态变量也会增加,但由于它是静态的,所有对象共享同一个静态变量
count++;
}
}
静态方法(类方法) 属于类 可以直接通过类名调用 不需要创建对象实例 但是 静态方法只能访问静态变量和其他静态方法
public class test {
// 这是一个静态方法
public static void printHelloWorld() {
System.out.println("Hello, World!");
}
// 这是一个实例方法
public void printGoodbyeWorld() {
System.out.println("Goodbye, World!");
}
public static void main(String[] args) {
// 调用静态方法,不需要创建对象
test.printHelloWorld();
// 调用实例方法,需要通过对象来调用
test T = new test();
T.printGoodbyeWorld();
}
}
注意
- 类方法可以直接访问类成员 不可以访问实例成员;
- 实例方法可以访问类成员也可以访问实例成员;
- 实例方法可以出现this关键字 类方法不可以出现this关键字
继承的关键字是什么?子类和父类之间,方法有什么关系?请画一个韦恩图表示子类和父类关系、相同父类不同子类之间的关系?
继承 class B extend A A称为父类(基类 或 超类)B称为子类 (派生类)
extend 子类可以继承父类的属性和方法 同时也可以添加自己的属性和方法 或者重写父类的方法
注意 在地球上一个儿子只有一个爸爸 所以在java中子类只能继承一个父类 但是可以多层继承 在java中所有类的祖宗是 Object类 子类只能继承非私有成员(没有用private修饰的成员)
权限修饰符都有什么?分别作用范围有哪些?
在这之前 我们要清楚一个概念 包(package)
比如 java.lang 这是java的基础包 包含了java程序运行所需的基本类 例如String Math Thread(多线程) 还有java.util 这个包就包括了许多使用的工具类 例如 Arrays Random HasSet HashMap
总的来说包就是类容器 用于存放某些特定功能类的集合
- private
- 用该修饰符修饰的变量或方法 我们称为私有变量或私有方法 只能在该类中访问这些变量或方法
- protected
- 可以被同一个包下的其他类以及不同包下的子类访问
- public
- 可以被任何其他类或对象访问 无论是否在一个包下
什么是重载?什么是重写?哪个必须有继承关系?
重载
在一个类中 方法名相同但参数列表不同 可以是参数类型 参数数量 参数顺序
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Dog dog = new Dog();
// 调用无参的makeSound方法,对于Animal对象将调用默认实现,对于Dog对象将调用重写后的实现
animal.makeSound(); // 输出: The animal makes a sound
dog.makeSound(); // 输出: The dog barks
// 调用带参数的makeSound方法,仅对Animal对象有效,因为Dog类没有提供带参数的makeSound方法
animal.makeSound("roar"); // 输出: The animal makes a roar
// dog.makeSound("bark"); // 这行会编译错误,因为Dog类没有定义接受字符串参数的makeSound方法
}
}
重写(必须有继承关系)
当父类方法无法满足子类需求,子类可以重写与父类同名 同参数列表的方法 去覆盖父类的这个方法 用来实现不同的功能 重写后 方法的访问遵循就近原则
注意
- 需要使用@Override 注解 (检查正确性 提高可读性);
- 子类重写的权限要大于或等于父类的权限;
- 私有的静态方法无法被重写
public class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
public class Dog extends Animal {
// 重写父类的makeSound方法
@Override
public void makeSound() {
System.out.println("The dog barks");
}
}
什么是super、this,在构造方法调用顺序是什么?
super 用于引用父类的属性和方法
this 用于引用当前对象的属性和方法
要想了解构造顺序 我们必须了解子类构造器的特点
- 先调用父类构造器 再执行自己 ;
- 默认子类无参构造器有super调用父类的无参构造器;
- 当父类没有无参构造器时 我们必须在子类构造器的第一行手写super指定父类的构造器
看个例子
// 父类,没有无参构造器,但有一个带参数的构造器
class Parent {
int value;
// 父类的带参数构造器
public Parent(int value) {
this.value = value;
}
}
// 子类,继承自Parent类
class Child extends Parent {
// 子类的构造器,由于父类没有无参构造器,我们必须在子类构造器的第一行显式调用父类的构造器
public Child() {
// 调用父类的带参数构造器,传递一个初始值
super(10); // 这一行是必须的,否则编译器会报错
// 接下来可以执行子类特有的初始化操作
}
}
public class Main {
public static void main(String[] args) {
// 创建子类对象
Child child = new Child();
// 访问子类对象中的属性(这些属性实际上是从父类继承的)
System.out.println(child.value); // 输出:10
}
}