D03 第三部分 面向对象任务

Java基础 面向对象 

一、基础任务

  1. 举例说明什么是类,什么是对象,什么是面向对象?

    类:对有共同属性,共同行为的事物的抽象描述。动物。    
    类是一种抽象的模板,用于描述对象的属性和行为
    
    对象:现实世界中实际存在的独立的实体。狗,猫。      
    对象是类的具体实例,是类的一个具体实体,具有类定义的属性和行为。
    
    面向对象:使用事物工具来做对应的事情。             
    面向对象是一种编程范式,将程序组织为对象的集合,每个对象都是类的实例,可以通过对象之间的交互来完成任务。

  2. 属性与成员变量的区别是什么?

    属性是现实事物在类的概念(描述类)
    成员变量是在类中声明的变量,用于存储对象的状态或类的特征。(描述对象)
    ​
    ​
    ​

  3. 什么是封装?封装一般会用到什么访问修饰符?

    封装是将对象的数据隐藏,使外部数据不能直接调用,对外提供get和set方法来访问和设置数据。
    private

  4. 成员方法、类方法、构造方法有什么区别?

    调用:对象名调用,类名调用(或对象名调用),创建对象时JVM自动调用

  5. 父类所有的属性方法都可以被继承吗?

    属性可以全继承,但私有属性子类无法直接访问。
    方法,可以添加到虚方法表中的方法可以被继承:非static,非final,非private

  6. 子类如何重写父类方法?

    子类通过创建一个具有相同签名(方法名称、参数类型、返回类型)的方法来重写父类的方法。
    @Override

  7. 方法重写时,@Override注解是否必须添加?

    不是必须的。但是一种检查的规范。

  8. 重写和重载的区别是什么?

    重写:对父类继承到的虚方法表中的方法进行覆盖。子类重新定义父类的方法,方法名、参数列表和返回类型必须相同。发生在继承关系中。
    重载:在同一个类中,可以定义多个方法,它们有相同的名称但参数列表不同(参数类型、个数、顺序)。发生在同一个类中。

  9. 构造方法可否被重载?重写呢?

    构造方法可以被重载,即在同一个类中定义多个构造方法,它们有不同的参数列表。
    构造方法不能被重写,因为构造方法不可以继承。

  10. 每个类都会有构造方法吗?

    如果你不显式定义构造方法,Java会为每个类提供一个默认的无参构造方法。
    但如果你显式定义了构造方法,Java就不再提供默认的构造方法。

  11. 辨析this和super关键字,举例他们的使用场景。

    this关键字表示当前对象的引用,用于区分成员变量和局部变量。
    super关键字表示父类对象的引用,用于调用父类的方法或访问父类的成员。

  12. 多态的三个前提条件是什么?

    继承:必须有继承关系。
    重写:子类必须重写父类的方法。
    父类引用指向子类对象:通过父类类型的引用来引用子类对象。

  13. 如何理解“父身子象”这个词?

    使用父类的引用指向子类的对象。
    成员变量:编译看左边,运行也看左边。
    方法:编译看左边,运行看右边。

  14. 在多态的情况下,子类独有的属性方法是否可以被调用?

    如果不做处理,无法调用。

  15. 在多态的情况下,子类重写了父类的方法,程序执行时会优先调用父类的方法实现还是子类的方法实现?

    子类。

  16. 在多态的情况下,若想恢复子类的身份,该进行哪步操作?

    向下转型。

  17. static关键字修饰的变量及方法,需要实例后才能使用吗?

    不想要

  18. 接口中可以使用哪些权限修饰符,抽象类呢?

    public 和 default。接口中的成员变量默认为 public static final,方法默认为 public abstract。
    抽象类:public、protected、default、private。

  19. final关键字有哪些用途,分别有什么作用?

    用于修饰类:表示该类不能被继承,是最终的类。
    用于修饰方法:表示该方法不能被子类重写。
    用于修饰变量:表示该变量是一个常量,只能被赋值一次。

  20. 有抽象方法的类一定是抽象类吗?

  21. 一个类可以继承几个类?可以实现几个接口?

    一个类可以继承一个类(单继承),但可以实现多个接口(多实现)。

  22. 抽象方法一定需要子类实现吗?接口中的方法呢?

    子类必须实现抽象类中的所有抽象方法,否则它们自身也会被声明为抽象类。
    
    接口中的方法也是抽象的,但不需要使用关键字 abstract,而是默认为抽象方法,实现接口的类必须提供方法的具体实现。

二、进阶任务

  1. 查阅大/小驼峰命名规则,说明类名/变量名/方法名应该使用哪种?

    大,小小。

  2. 什么是构造方法链?

    构造方法链是指在一个类的构造方法中调用同类的其他构造方法,以实现在不同场景下的对象初始化。通过构造方法链,可以避免在每个构造方法中重复相似的初始化代码,提高代码的可维护性和复用性。

      将会调用沿着继承链的所有父类的构造方法。 

  3. 辨析什么是内部类、成员内部类、局部内部类、匿名内部类、静态内部类?

    1.内部类是指定义在另一个类内部的类。
    2.成员内部类是定义在类内部的普通类。
    3.局部内部类是定义在方法或作用域内部的类。
    4.匿名内部类是没有显式定义类名的内部类,通常用于创建接口的实例或继承父类。
    5.成员位置并被声明为静态的类。

  4. 静态变量和实例变量的区别?请从jvm执行的角度去理解。

    静态变量: 在类加载时,静态变量会被分配内存空间,并在类的方法区中进行初始化。所有的类共享同一份静态变量,因此在内存中只存在一份拷贝。静态变量的值可以在没有实例对象的情况下被访问。
    实例变量: 在对象创建时,实例变量会被分配内存空间,并随着对象的创建而初始化。每个对象都有一份独立的实例变量,存储在对象的堆内存中。在访问实例变量时,需要先创建对象的实例。

  5. 理解什么是代码块,并掌握代码块的执行顺序。

    局部代码块: 位于方法内部,主要用于限定变量的作用范围。运行结束后消失
    构造代码块:每次调用构造方法都会执行
    静态代码块:使用 static 关键字修饰,类加载时执行,仅执行一次。

  6. 判断说法是否合理“类是对对象的抽象,抽象类是对类的抽象,接口是对方法的抽象。”

三、进阶任务

  1. 被封装的属性就一定安全吗?

    可以利用反射机制获取
    
    使用反射机制可以绕过访问控制,这可能导致被封装的属性的不安全访问。反射是一种强大的机制,允许在运行时检查或修改类的属性、方法和构造函数等信息,即使它们在编译时是私有的。

  2. 泛型一般使用哪些字母,分别有什么含义?

    E:表示元素(Element),常用于集合类,如List、Set等。
    T:表示类型(Type),常用于泛型类、泛型方法。
    K:表示键(Key),常用于表示Map中的键的类型。
    V:表示值(Value),常用于表示Map中的值的类型。
    N:表示数字(Number)。
    R:表示返回值(Return),常用于表示方法的返回值类型。

  3. 抽象类和接口的区别是什么?

构造方法:抽象类可以有构造方法,而接口不能有构造方法。
实现:一个类只能继承一个抽象类,但可以实现多个接口。
成员类型:抽象类可以包含实例变量,而接口中只能包含常量(static final变量)。
访问修饰符:抽象类的成员可以有各种访问修饰符,而接口的成员默认为public,且只能是public。
构造方法调用:在子类中构造方法中调用抽象类的构造方法时,会隐式调用父类的构造方法;而接口没有构造方法,无法通过构造方法来调用。

4.除了new关键字,还能怎么创建对象。

1.通过反射(Reflection): 使用Java的反射机制可以在运行时动态创建对象。通过Class类的newInstance方法或者Constructor类的newInstance方法,可以实例化一个类。

// 使用 Class 类的 newInstance 方法
Class<?> clazz = MyClass.class;
Object obj = clazz.newInstance();

// 使用 Constructor 类的 newInstance 方法
Constructor<MyClass> constructor = MyClass.class.getConstructor();
MyClass obj = constructor.newInstance();

注:在Java 9及以后版本,newInstance方法已被废弃,推荐使用getDeclaredConstructor().newInstance()。

2.使用反序列化(Deserialization): 通过将对象序列化(转换为字节流),然后再反序列化为对象来创建对象。这通常涉及实现Serializable接口。

// 序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.ser"));
out.writeObject(new MyClass());
out.close();

// 反序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.ser"));
MyClass obj = (MyClass) in.readObject();
in.close();

注意:反序列化可能会有一些安全性和性能方面的考虑,因此要谨慎使用。

3.使用工厂方法(Factory Method): 通过调用类的静态方法或者非构造方法来获取对象实例。

public class MyClass {
    private MyClass() {
        // 私有构造方法
    }

    public static MyClass createInstance() {
        return new MyClass();
    }
}

// 使用工厂方法创建对象
MyClass obj = MyClass.createInstance();

工厂方法通常用于封装对象的创建逻辑,提供更灵活的对象创建方式。

4.clone方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值