组合(Composition)
继承(Inheritance)
// 主板类(被组合的类)
class Motherboard {
private String brand;
private String model;
public Motherboard(String brand, String model) {
this.brand = brand;
this.model = model;
}
public String getInfo() {
return "主板:" + brand + " " + model;
}
}
// CPU类(被组合的类)
class CPU {
private String brand;
private String model;
private int coreCount;
public CPU(String brand, String model, int coreCount) {
this.brand = brand;
this.model = model;
this.coreCount = coreCount;
}
public String getInfo() {
return "CPU:" + brand + " " + model + "(" + coreCount + "核)";
}
}
// 电脑类(组合其他类的新类)
public class Computer {
private String name;
private Motherboard motherboard; // 组合Motherboard对象
private CPU cpu; // 组合CPU对象
// 通过构造函数初始化组合的对象
public Computer(String name, Motherboard motherboard, CPU cpu) {
this.name = name;
this.motherboard = motherboard;
this.cpu = cpu;
}
// 展示电脑配置的方法(复用组合对象的功能)
public void showConfig() {
System.out.println("电脑名称:" + name);
System.out.println(motherboard.getInfo()); // 调用主板对象的方法
System.out.println(cpu.getInfo()); // 调用CPU对象的方法
}
public static void main(String[] args) {
// 创建被组合的对象
Motherboard mb = new Motherboard("华硕", "ROG Z690");
CPU cpu = new CPU("英特尔", "i9-13900K", 16);
// 创建组合后的电脑对象
Computer myPC = new Computer("游戏主机", mb, cpu);
// 调用电脑对象的方法,间接使用组合对象的功能
myPC.showConfig();
}
}被组合的类(零件类)
Motherboard和CPU是独立的类,各自封装了属性和功能(如getInfo()方法返回自身信息)。组合的实现
Computer类中声明了Motherboard和CPU类型的成员变量,通过构造函数将这两个对象 “组合” 成电脑的一部分。功能复用
Computer的showConfig()方法通过调用motherboard.getInfo()和cpu.getInfo(),复用了主板和 CPU 类的功能,而无需关心它们的内部实现。Object。继承是面向对象语言的核心特性,允许新类(子类)复用现有类(父类)的属性和方法。extends关键字声明继承关系,例如public class Detergent extends Cleanser,表示Detergent类继承自Cleanser类。super关键字的作用
super用于明确指定 “调用父类的方法”,避免与子类自身方法混淆。super。方法重写与接口扩展
@Override注解标记),以修改其行为;同时也可添加新方法,扩展接口功能。访问权限与继承的关系
public修饰的方法可被所有子类访问;若父类方法为包访问权限(默认修饰符),则仅同包的子类可访问。为便于继承,通常建议父类字段设为private,方法设为public。类的main()方法
main()方法用于测试,运行时仅执行命令行指定的类的main()。例如java Detergent会运行Detergent的main(),其中可显式调用父类的main()(如Cleanser.main(args))。父类的非静态属性。
private修饰A,子类无法继承,无法直接访问,如子类.A。 但是可以通过有访问权限的函数如getA()来访问。
protected修饰B,跨包子类内部可以访问。但是跨包非子类如OutClass类里的子类实例不能访问。child.B 会报错。
public修饰C, 可以通过子类实例直接访问。(只要父类属性未被重写或隐藏)
private属性不会被子类继承,因此子类对象无法通过任何方式直接操纵(只能通过父类的公共方法间接操作)。default、protected、public)的属性会被子类继承,子类对象可根据访问权限直接操纵。属性隐藏(Hiding)场景:
class Parent {
protected int field = 100;
}
class Child extends Parent {
protected int field = 200; // 隐藏父类的field
public void test() {
System.out.println(field); // 输出200(子类自己的field)
System.out.println(super.field); // 输出100(父类的field)
super.field = 150; // 操纵父类的field
}
}派生类(子类)的对象包含一个基类(父类)的子对象,这个子对象就像独立的基类对象一样,被 “包装” 在派生类对象内部。从外部看,派生类对象拥有基类的接口,还可能有自己新增的方法和属性。
super())。1.分配内存空间
JVM 在堆内存中为派生类对象分配空间,包含:
int age、String name)。所有非静态字段默认初始化为零值(基本类型)或null(引用类型)。
2.基类非静态成员初始化
{})。3.基类构造函数调用
super(...)):super()。super(参数)调用,否则编译报错。4.派生类非静态成员初始化
5.派生类构造函数执行
显式调用基类有参构造函数
Game(int i)),派生类必须在构造函数首行用super(参数)显式调用基类的有参构造函数,否则编译器报错(找不到基类无参构造函数)。调用顺序的强制性
super(...))必须是派生类构造函数的第一个操作,否则编译错误。class Dog extends Animal {
private String breed;
public Dog(String name, int age, String breed) {
// 必须在首行显式调用基类有参构造函数
super(name, age); // 调用Animal(String, int)
this.breed = breed;
System.out.println("Dog构造函数:品种=" + breed);
}
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。