9、Java基础篇——面向对象进阶(static&继承)

1、如何定义类

我们在这里复习一下之前讲过的类、封装、构造方法等内容。在Java中,通过关键字"class"来定义类。类是对象的模板,用于定义对象的属性和行为。

public class Dog {
    // 属性(成员变量)
    String name;
    int age;
    
    // 方法(成员方法)
    public void bark() {
        System.out.println("汪汪!");
    }
}

2、如何通过类创建对象

通过使用关键字"new",可以根据类创建对象。对象是类的实例,可以访问类中定义的属性和方法。

public class Main {
    public static void main(String[] args) {
        // 创建Dog类的对象
        Dog myDog = new Dog();
        
        // 访问对象的属性和方法
        myDog.name = "旺财";
        myDog.age = 3;
        myDog.bark();
    }
}

3、封装的步骤实现

封装是面向对象编程的重要原则之一,它用于隐藏对象的内部实现细节,并通过公共方法来访问和操作对象的数据。

封装的步骤如下:

将类的属性设置为私有(private)访问权限。
提供公共(public)的getter和setter方法来访问和修改属性值。

public class Dog {
    private String name;
    private int age;
    
    // getter方法
    public String getName() {
        return name;
    }
    
    // setter方法
    public void setName(String newName) {
        name = newName;
    }
    
    // getter方法
    public int getAge() {
        return age;
    }
    
    // setter方法
    public void setAge(int newAge) {
        if (newAge >= 0) {
            age = newAge;
        }
    }
}

4、构造方法

构造方法是用于创建对象时进行初始化的特殊方法。它具有与类名相同的名称,并且没有返回类型。构造方法可以重载,即可以定义多个不同参数的构造方法。

public class Student {
    private String name;
    private int age;
    
    // 无参构造方法
    public Student() {
        name = "Unknown";
        age = 0;
    }
    
    // 带参构造方法
    public Student(String newName, int newAge) {
        name = newName;
        age = newAge;
    }
    
    // getter和setter方法
    // ...
}

public class Main {
    public static void main(String[] args) {
        // 创建Student对象
        Student student1 = new Student(); // 使用无参构造方法
        Student student2 = new Student("Alice", 20); // 使用带参构造方法
        
        // 访问对象的属性值
        System.out.println(student1.getName()); // 输出:"Unknown"
        System.out.println(student2.getName()); // 输出:"Alice"
    }
}

5、this关键字的作用

(1)用于普通的getter与setter方法:

public class Person {
    private String name;
    
    public String getName() {
        return this.name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

(2)用于构造方法中:

public class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

6、static关键字

static关键字用于修饰类的成员(方法和变量),表示这些成员属于类本身而不是实例。可以直接通过类名访问静态成员,而无需创建对象。

public class MathUtils {
    public static int sum(int a, int b) {
        return a + b;
    }
    
    public static final double PI = 3.14159;
}

7、继承

继承是面向对象编程的重要概念之一,它允许一个类从另一个类派生出来,并继承其属性和方法。被继承的类称为父类或超类,继承的类称为子类或派生类。

(1)继承的格式:

public class Animal { // 父类
    public void eat() {
        System.out.println("动物正在吃食物");
    }
}

public class Dog extends Animal { // 子类
    public void bark() {
        System.out.println("汪汪!");
    }
}

(2)子类不能继承的内容:

子类不能继承父类中声明为私有(private)的属性和方法。

public class Animal {
    private String name;
    
    private void privateMethod() {
        System.out.println("这是父类的私有方法");
    }
}

public class Dog extends Animal {
    public void accessPrivateMethod() {
        // 无法访问父类的私有方法privateMethod()
        // privateMethod();  // 编译错误
    }
}

(3)继承后的特点—成员变量:

子类继承了父类的成员变量,可以直接访问父类的非私有成员变量,也可以通过super关键字访问父类的成员变量。

public class Animal {
    public String name;
    protected int age;
    private String color;
}

public class Dog extends Animal {
    public void printInformation() {
        System.out.println("姓名:" + name);  // 可以直接访问父类的非私有成员变量name
        System.out.println("年龄:" + age);   // 可以直接访问父类的受保护成员变量age
        //System.out.println("颜色:" + color); // 无法直接访问父类的私有成员变量color
    }
}

(4)继承后的特点—成员方法:

子类继承了父类的成员方法,可以直接调用父类的非私有方法,也可以通过super关键字调用父类的方法。

public class Animal {
    public void eat() {
        System.out.println("动物正在吃食物");
    }
    
    protected void sleep() {
        System.out.println("动物正在睡觉");
    }
    
    private void run() {
        System.out.println("动物在奔跑");
    }
}

public class Dog extends Animal {
    public void play() {
        System.out.println("狗正在玩耍");
    }
    
    public void sleepAndRun() {
        sleep();  // 可以直接调用父类的受保护方法sleep()
        //run();    // 无法直接调用父类的私有方法run()
    }
}

8、方法重写

方法重写是指子类重新定义父类中已经存在的方法。在子类中重写的方法具有相同的名称、参数列表和返回类型。

public class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

public class Cat extends Animal {
    @Override
    // @Override重写注解,这个注解标记的方法,就说明这个方法必须是重写父类的方法,否则编译阶段报错。
    public void makeSound() {
        System.out.println("猫发出喵喵的声音");
    }
}

9、继承后的特点—构造方法

子类在实例化时,会自动调用父类的无参构造方法。如果父类没有无参构造方法并且定义了带参数的构造方法,子类需要使用super关键字来显式调用父类的构造方法。

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
    }
}

public class Dog extends Animal {
    private int age;
    
    public Dog(String name, int age) {
        super(name); // 调用父类的带参数构造方法
        this.age = age;
    }
}

以上就是Java面向对象进阶(static&继承)的全部内容,作者能力有限,如果不足请及时指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值