构造方法:
- Java中的构造方法是一种特殊类型的方法,它的作用是在创建对象时对对象进行初始化。构造方法的名称必须与类名相同,它没有返回类型,甚至没有void。构造方法在使用new关键字创建对象时自动调用,用于初始化对象的状态。
- 构造方法的作用:
-
- 初始化对象:构造方法用于初始化对象的状态,为对象的数据成员赋予初始值,以确保对象在创建后处于一个合理的状态。
-
- 提供灵活性:构造方法可以接受参数,根据不同的参数值对对象进行不同的初始化,从而提供了灵活性。
-
- 隐藏对象的实现细节:构造方法可以隐藏对象的实现细节,使得对象的创建过程对外部代码透明,只需要调用new关键字即可创建对象。
-
- 1: 构造方法是在创建对象时调用 new 类名(); new 类的构造方法名()
- 2: 构造方法多用于初始化一个对象: 比如给对象的属性赋值 调用需要提前执行的方法
- 3: 构造方法是每个类都默认自带的一个方法 但是这个构造方法没有参数 以及方法内容
- 4: 可以自己在类中创建构造方法(包括带参数以及不带参数的)
- 5: 使用构造方法可以将赋值的代码提前写好,之后创建对象时,只需要给值就可以了不需要
使用对象变量名一个一个的给属性赋值 - 例如:
public class Car {
private String brand;
private String model;
// 构造方法
public Car(String brand, String model) {
this.brand = brand;
this.model = model;
}
public static void main(String[] args) {
// 创建Car对象时自动调用构造方法进行初始化
Car myCar = new Car("Subaru", "Brz" );
System.out.println(myCar.brand +" " + myCar.model);
}
}
运行结果:
在这个示例中,Car类定义了一个构造方法,用于初始化Car对象的状态。在main方法中,使用new关键字创建Car对象时,构造方法会自动调用,从而对Car对象进行初始化。
方法重载:
- 方法重载是指在一个类中定义多个方法,它们具有相同的名称但具有不同的参数列表。在Java中,构造方法可以被重载,即可以定义多个构造方法,只要它们的参数列表不同即可。
- 参数列表的不同点可以体现在:
- 数量、类型 、顺序
- 方法重载的作用:
-
- 提高代码的可读性和可用性:重载让方法的命名更加直观,使得相似的功能可以通过相同的方法名来访问,这有助于提高代码的可读性和可用性。
-
- 使代码更加清晰:通过重载方法而不是为每个功能提供唯一的方法名,可以减少方法数量,使得类的结构更加清晰简洁。
-
- 提供方便的调用方式:方法重载允许在不牺牲表达性的前提下,为用户提供多种方式来执行相似的操作,使得方法的调用更加灵活。
-
- 提升程序性能:在某些情况下,方法重载可以提供一种优化的方式,允许针对不同的数据类型使用更高效的算法或处理逻辑。
-
- 可以通过下图调用JFrame时的实例理解:
构造方法与方法重载的关系:
- 构造方法也可以被重载。这意味着一个类可以有多个构造方法,只要它们的参数列表不同。构造方法的重载使得当你创建类的实例时,可以有多种方式来初始化对象的状态,提供了灵活性。
继承:
- 在Java中,继承是面向对象编程的一个基本特性,允许一个类(称为子类)继承另一个类(称为父类)的属性和方法。继承是用来实现代码复用的重要机制,同时也有助于实现运行时多态。
- 格式:
public class 子类名 extens 父类名 { }
public class Parent {
public void parentMethod() {
System.out.println("Hello,I amparent!");
}
}
public class Child extends Parent {
public void childMethod() {
System.out.println("Hello,I am child!");
}
}
- 子类可以继承父类的什么? (回答这个问题之前我们需要知道一个类中具备哪些不同的代码)
- 主要是对象成员属性和方法,但是构造部分内容联代调用,静态资源共享
- 一个类中可以定义什么:
- 与对象相关的:
- 成员属性: 继承
- 成员方法: 继承
- 构造方法: 没继承 但是子类创建对象在调用自己的构造方法之前会将父类的构造方法调用
- 构造代码块: 向上联代调用:子类创建对象时 父类的构造代码块都会执行
- 与类有关的,与对象无关:
- 静态属性: 继承 但是是与父类共用同一个
- 静态方法: 子类名也可以直接调用
- 静态代码块: 只在类第一次加载时执行 且只执行一次
- 与对象相关的:
// 一个类中可以定义什么
public class Student {
// - 与对象相关的:
// - 成员属性: 对象调用才可以使用
String name;
// - 成员方法: 对象名调用
public void setName(String name) {
this.name = name;
}
// - 构造方法: 创建对象时执行
public Student() {
System.out.println("Hello 我是构造方法");
}
// - 构造代码块: 创建对象时执行
{
System.out.println("Hello 我是构造代码块");
}
// - 与类有关的,与对象无关
// - 静态属性: 与类绑定,在内存中只会创建一份 类名可以直接调用
static int count;
// - 静态方法:
public static void staticMethod() {
System.out.println("Hello 我是静态方法,可以被类名调用");
}
// - 静态代码块
static {
System.out.println("Hello 我是静态代码块 一个程序运行过程中只执行一次");
}
}
方法重写:
- 在Java中,方法重写(Method Overriding)是指子类中定义一个方法,其名称、返回类型以及参数列表都与父类中某个方法的定义相同。这允许子类提供父类方法的具体实现或者自定义实现。
- 注意:
- 子类中重写父类的方法,进行扩展改造方法体 ,但是保持与父类方法的格式一致
- 子类如果重写了父类的方法,子类中以及子类对象会优先调用重写之后的方法
public class Animals{
// 父类中的方法
public void action() {
System.out.println("some action");
}
}
public class bird extends action {
// 子类重写父类中的方法
@Override //用于检测重写是否正确
public void birdaction() {
System.out.println("fly");
}
}
super:
- 子类重写方法之后还是需要调用父类的方法时,可以使用 super关键字调用
- super 关键字,在子类中指代父类 可以调用父类的属性 方法以及构造方法
- 属性以及方法的调用格式: super.属性 super.方法名();
- 调用构造方法的格式: super(); 必须放在子类的构造方法中第一行
-
- 访问父类的构造方法:
- 在子类的构造方法中,可以使用 super() 来调用父类的构造方法。父类的构造方法可以是无参的或者带参数的。如果子类的构造方法中没有显式地调用父类的构造方法,则Java编译器会自动插入对父类无参构造方法的调用。
class Student{
Student() {
System.out.println("Student constructor");
}
}
class UNStudent extends Student {
UNStudent() {
super(); // 调用父类的构造方法
System.out.println("UNStudent constructor");
}
}
- 2. 访问父类的属性和方法
- 如果子类需要引用父类的属性或方法,可以使用 super 关键字。这在父类和子类有同名属性或方法时特别有用,以便明确指出是要访问父类的成员。
//访问方法
class Student{
void display() {
System.out.println("This is the Student class");
}
}
class UNStudent extends Student{
void display() {
super.display(); // 调用父类的display()方法
System.out.println("This is the UNStudent class");
}
}
//访问属性
class Student{
String name = "Student";
}
class UNStudent extends Student{
String name = "UNStudent ";
void printName() {
System.out.println(super.name); // 输出 Parent
System.out.println(this.name); // 输出 Child
}
}
- 3. 解决方法重写中的隐藏问题
- 当子类重写了父类的方法时,如果在子类的方法中还想调用父类被重写的方法,可以通过super关键字来实现。
class Student{
void show() {
System.out.println("Student's show()");
}
}
class UNStudent extends Student{
void show() {
super.show(); // 调用父类的show()方法
System.out.println("UNStudent's show()");
}
}