全局可见,任意类都可以访问修饰,同一包或不同包
类、方法、变量、接口、构造器
所有代码使用的类、常量、方法
// 类全局可见
public class Animal
{
// 变量全局可见
public String name;
public void eat()
{
// 方法全局可见
System.out.println("Eating...");
}
}
①public
类的类名必须和文件名一致
②public
类的类名不能滥用
同一包内可以使用 + 不同包只有子类可用(通过继承)(子类为继承protected修饰的类的子类)
方法、变量(不能修饰外部类)
在基类中定义允许子类重写或访问的成员
// Parent.java(包 example)
public class Parent
{
// 同包内均可访问
protected void show()
{
System.out.println("父亲、母亲");
}
}
//Child.java(不同的包)
//先声明引用的包 import 包名.类名
import example.Parent
//在不同包 只有继承了父类的类可以使用
public class Child extends Parent
{
void nameshow()
{
//不同包只能子类使用
super.show();
/
}
}
①不同包的非子类无法访问 protected
成员
②在子类中访问父类的 protected
成员时,必须通过继承关系(如 super.show()
)
仅一个包内可以使用
类、变量、方法、接口
包内共享的类或方法
class Logger
{ // 默认修饰符类,仅同一包内可访问
String logLevel; // 默认修饰符变量
void log(String message)
{
// 默认修饰符方法
System.out.println("Log: " + message);
}
}
在不同包中无法使用
仅当前类内部可见
方法、变量、内部类
封装类的内部状态或工具方法
public class BankAccount {
private double balance; // 私有变量,外部无法直接访问
// 通过公共方法访问私有变量
public double getBalance() {
return balance;
}
private void validateTransaction() { // 私有方法,仅在类内使用
// 校验逻辑
}
}
外部类不能使用 private
修饰符(内部类可以)
私有成员无法被子类继承
方法、变量等
static
修饰后为属于类,叫类变量,所有实例共享一份内存,可以被任何实例修改class Animals
{
//任意实例都可使用 且为 永久修改
static int num = 0;
int catNum()
{
return num++;
//此时为 1
}
int dogNum()
{
return num++;
//此时为 2
}
}
类名.类方法名
直接调用this
或super
class Animal
{
static string aname;
static void animalName(string name)
{
//使用类变量
aname = name;
}
}
//调用 Animal animal = new Animal();
// animal animalName("小猫");
//或 直接调用 Animal.animalName("小猫");
核心作用
不可变,(不可修改、不可覆盖、不可继承)
** 作用范围**
类、方法、变量、参数
// 不可被继承
final class ImmutableClass
{
// 类内容
}
class Parent
{
public final void finalMethod()
{ // 子类无法重写此方法
System.out.println("Final method");
}
}
void printMessage(final String message)
{
// message = "New"; ❌ 禁止修改
System.out.println(message);
}
final
注意事项:
final
修饰的引用类型变量不可变的是引用,而非对象内容final
方法可以被重载(但不可被重写)static
注意事项:
this
关键字,用于指代当前对象的实例
当类的成员变量与方法参数或局部变量同名时,使用this
显式访问当前对象的成员变量,避免歧义
public class Parent
{
//当前类的age
private int age;
//参数名 为 新的age
void people(int age)
{
this.age=age;
//前者的this.age为 当前类的age
//后者的age为 参数age
}
}
每个类中都有构造方法,但一般是系统默认隐藏创建的,但当人为创建时,子类的构造方法必须调用父类构造方法
super(参数列表);
super(参数列表)
,这个参数列表名为子类创建的参数名super( );
class Parent
{
//父类构造方法,无参数的
Parent(){}
//父类构造方法,有参数的
Parent(int x)
{
System.out.println("Parent构造方法: "+x);
}
}
class Child extends Parent
{
Child(int a)
{
super(a);
// 显式调用父类有参构造方法
// 并且以 参数名调用
// 或者 super(与父类构造方法同类型的值)
// 如 super(7);
System.out.println("Child构造方法");
}
}
等(还没有学习到)
子类重写父类方法后,可通过
super.方法名()
调用父类被覆盖的方法
class Parent
{
void show()
{
System.out.println("Parent的法");
}
}
class Child extends Parent
{
void show()
{
super.show(); // 调用父类方法
System.out.println("Child的方法");
}
}
当子类与父类有同名属性时
使用super.属性名
访问父类属性(通常会避免属性同名,优先用private
封装)
代码
class Parent
{
protected int num = 5;
}
class Child extends Parent
{
int num = 10;
void show()
{
System.out.println(super.num);
// 输出5(父类属性)
System.out.println(num);
// 输出10(子类属性)
}
}
多层继承:super
仅指向直接父类,无法直接访问祖父类成员
静态上下文:super
不能在静态方法或静态块中使用
设计原则:优先通过方法覆盖而非属性隐藏实现多态,属性会设为private