Java基础重点知识-(面向对象的特性)

面向对象的三大特性是什么?

  • 封装: 封装就是将将数据和操作数据的方法捆绑在一起, 形成一个独立的, 可控的单位. 通过封装, 对象的内部实现细节就被隐藏起来了, 这样就只能通过对象提供的接口来访问对象的属性和方法, 这样就保证了数据的安全性和一致性.
// Person 类
class Person {
    private String name;
    private int age;

    // 构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 获取姓名
    public String getName() {
        return name;
    }

    // 设置姓名
    public void setName(String name) {
        this.name = name;
    }

    // 获取年龄
    public int getAge() {
        return age;
    }

    // 设置年龄
    public void setAge(int age) {
        // 年龄范围限制在 0 到 150 之间
        if (age >= 0 && age <= 150) {
            this.age = age;
        } else {
            System.out.println("年龄输入错误!");
        }
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 创建 Person 对象
        Person person = new Person("张三", 25);

        // 获取姓名和年龄
        System.out.println("姓名:" + person.getName());
        System.out.println("年龄:" + person.getAge());

        // 设置年龄为 160,超出范围,会提示错误信息
        person.setAge(160);
    }
}
  • 继承 继承就是顾名思义"子承父业", 子类继承父类, 就可以使用父类的属性和方法, 同时还可以实现自己特有的属性和方法, 通过继承, 可以实现代码的复用和扩展, 减少了代码冗余, 也提高了代码可维护性和可扩展性.
// Animal 类
class Animal {
    // Animal 类的方法
    public void eat() {
        System.out.println("动物正在吃饭");
    }
}

// Dog 类,继承自 Animal
class Dog extends Animal {
    // Dog 类的方法,重写了父类 Animal 中的 eat 方法
    @Override
    public void eat() {
        System.out.println("狗正在吃骨头");
    }

    // Dog 类独有的方法
    public void bark() {
        System.out.println("汪汪汪!");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 创建 Animal 对象
        Animal animal = new Animal();
        animal.eat();  // 输出:动物正在吃饭

        // 创建 Dog 对象
        Dog dog = new Dog();
        dog.eat();  // 输出:狗正在吃骨头
        dog.bark(); // 输出:汪汪汪!
    }
}
  • 多态多态就是同一个类的对象, 在不同的情况下表现出不同的行为, 多态可以提高代码的灵活性和可扩展性.
// Animal 类
class Animal {
    // 动物发声的方法
    public void makeSound() {
        System.out.println("动物发出叫声");
    }
}

// Dog 类,继承自 Animal
class Dog extends Animal {
    // 重写父类的 makeSound 方法
    @Override
    public void makeSound() {
        System.out.println("狗发出汪汪汪的叫声");
    }
}

// Cat 类,继承自 Animal
class Cat extends Animal {
    // 重写父类的 makeSound 方法
    @Override
    public void makeSound() {
        System.out.println("猫发出喵喵喵的叫声");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 创建 Dog 对象并向上转型为 Animal 类型
        Animal animal1 = new Dog();
        // 创建 Cat 对象并向上转型为 Animal 类型
        Animal animal2 = new Cat();

        // 调用 makeSound 方法,由于向上转型,会根据具体对象的类型调用对应的方法
        animal1.makeSound(); // 输出:狗发出汪汪汪的叫声
        animal2.makeSound(); // 输出:猫发出喵喵喵的叫声
    }
}

在这里插入图片描述

怎么理解多态特性?

多态通俗点说就是多个对象调用同一个方法, 得到了不同的结果.
想要实现多态, 需要满足几个条件:

  1. 子类必须继承父类(有继承关系)
  2. 子类重写父类的方法
  3. 父类引用指向子类,就是 父类类名 引用名称 = new 子类类名(); 这个就涉及到类型转换的过程, 此处就是 向上转型. 后面会讲到.

通过上面的例子,

  • 我们创建了一个 Animal 类和两个子类 Dog 和 Cat。
  • 在测试类 Main 中,我们分别创建了一个 Dog 对象和一个 Cat 对象,并将它们向上转型为 Animal 类型。
  • 然后,我们调用了这两个对象的 makeSound 方法。由于向上转型,编译器会将这些方法调用解释为 Animal 类型的方法,但在运行时,实际上会根据具体对象的类型调用对应的重写方法,实现了多态的特性。

什么是向上转型和向下转型?

  • 向上转型就是把一个子类的对象引用赋给父类引用的过程
    在向上转型中, 子类可以自动转化为父类对象, 无需显示转换, 这样就只能访问父类的成员变量和方法, 而不能访问子类中定义的成员变量和方法.
    语法格式: 父类类型 引用名称 = new 子类对象();
  • 向上转型就是把一个父类的对象引用赋给子类引用的过程
    在向下转型中, 需要进行显示的类型转换, 这样父类就能访问子类的特有属性和方法了.
    语法格式:子类类型 引用名称 = (子类类型)父类对象;
// Animal 类
class Animal {
    public void eat() {
        System.out.println("动物正在吃饭");
    }
}

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

// 测试类
public class Main {
    public static void main(String[] args) {
        // 向上转型
        Animal animal = new Dog();
        animal.eat(); // 输出:动物正在吃饭
        //animal.bark(); // 编译错误,无法调用子类独有的方法

        // 向下转型
        Dog dog = (Dog) animal;
        dog.bark(); // 输出:汪汪汪!
    }
}

Java 可以多继承吗?

Java 是不支持多继承的. 首先是一个菱形继承问题, 其次不支持多继承对于设计者来说, 实现起来也比较简单(简化语言设计), 对于学习者来说学习也比较简单. 还有就是避免了多继承的层次膨胀.

什么是菱形继承问题:
菱形继承问题是指, 一个类继承两个具有相同父类的子类, 这两个类又有着相同的属性和方法, 这时候这个类调用父类相同的方法时编译器就不知所措了.

在这里插入图片描述

接口和抽象类有什么区别?

接口和抽象类都是用来定义公共行为的.

  • 接口是对行为的抽象, 是抽象方法的一个集合, 利用接口可以实现 API 的定义和实现分离.
  • 抽象类是不能实例化的类, 用 abstract 修饰, 主要目的是复用代码, 除了不能实例化, 和普通类区别不大.
    具体区别有:
  • 抽象类是单继承, 接口是多实现
  • 抽象类方法和属性访问修饰符使用无限制, 只是抽象类中抽象方法, 不能被 private 修饰, 而接口默认都是 public , 不能被其它修饰符修饰
  • 抽象类中普通方法必须要有实现, 抽象方法必须不能有实现, 而接口中的普通方法也不能有实现, 除了默认方法.
  • 抽象类是为了复用代码, 而接口是为了定义规范.

方法重写和重载有什么区别?

  • 方法重载就是在一个类中定义多个同名的方法, 这些方法具有相同的名字, 但是参数列表不同(参数列表包括:参数个数, 参数类型, 参数顺序).
  • 方法重写发生在子父类之间, 就是子类对父类已有的方法进行重新定义, 方法名, 参数列表, 返回值都得一样.

具体区别有:

  • 方法重载发生在一个类中, 而方法重写发生在两个类中.
  • 方法重载要求参数列表不同, 方法重写要求参数列表相同.
  • 方法重载不考虑返回值类型, 方法重写要求返回值相同或是其子类型.
  • 方法重载是为了提供多个功能相似的方法, 可以选择不同的参数进行调用, 而方法重写是为了覆盖父类的方法实现具有自身特性的方法.
  • 方法重载是静态绑定的, 在编译的时候就确定了调用的方法, 而方法重写是动态绑定的, 在运行的时候根据对象的实际类型选择调用的方法.
// 父类
class Animal {
    // 父类方法
    public void makeSound() {
        System.out.println("动物发出叫声");
    }
}

// 子类 Dog 继承自 Animal,并重写了 makeSound 方法
class Dog extends Animal {
    // 子类重写父类方法
    @Override
    public void makeSound() {
        System.out.println("狗发出汪汪汪的叫声");
    }
}

// 测试类
public class Main {
    // 方法重载,两个参数版本
    public void printMessage(String message, int count) {
        for (int i = 0; i < count; i++) {
            System.out.println(message);
        }
    }

    // 方法重载,一个参数版本
    public void printMessage(String message) {
        System.out.println(message);
    }

    public static void main(String[] args) {
        Main obj = new Main();
        
        // 方法重写示例
        Animal animal = new Dog(); // 向上转型
        animal.makeSound(); // 输出:狗发出汪汪汪的叫声
        
        // 方法重载示例
        obj.printMessage("Hello"); // 输出:Hello
        obj.printMessage("Hi", 3); // 输出:Hi Hi Hi
    }
}

Animal 类有一个 makeSound 方法,在子类 Dog 中被重写。
Main 类中有两个 printMessage 方法,它们的参数列表不同,构成了方法重载。

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
大一Java程序设计的基础知识重点包括以下几个方面: 1. Java语言基础:了解Java的基本语法、数据类型、运算符、控制流程等基础知识,能够编写简单的Java程序。 2. 面向对象编程:理解面向对象的概念和特性,包括类与对象、封装、继承、多态等,能够使用Java创建类和对象,并进行简单的面向对象编程。 3. 方法和参数传递:掌握方法的定义和调用,了解方法的返回值和参数传递方式(值传递),能够编写带有参数和返回值的方法。 4. 数组:了解数组的概念和用法,能够声明和初始化数组,访问和修改数组元素,以及使用循环遍历数组。 5. 字符串处理:熟悉字符串的常见操作,如字符串连接、截取子串、查找字符或子串等,能够使用String类提供的方法对字符串进行处理。 6. 异常处理:了解异常的概念和分类,学会使用try-catch语句捕获和处理异常,以及使用throws关键字声明方法可能抛出的异常。 7. 文件输入输出:掌握文件读写的基本操作,包括创建文件、打开文件、读取和写入文件内容等,能够使用Java的IO类库进行文件操作。 8. 面向对象设计原则:了解面向对象设计的基本原则,如单一职责原则、开闭原则、依赖倒置原则等,能够应用这些原则进行简单的类设计。 9. 主类和入口方法:理解Java程序中主类的概念和作用,知道主类是包含main()方法的类,能够编写带有main()方法的主类,并运行Java程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北冥有鱼-.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值