增强day03-面向对象高级

  1. 关于Objetct类
  2. Object类是所有类的父类
  3. 一切类都直接或间接继承自Object类
  4. 一个类没有使用extends关键字明确标识继承关系,则默认继承Object类
  5. 接口不继承Objetct类
  6. 所有类都可以继承Object中允许被继承的方法
  7. Objetct类定义了toString()、equals()、HashCode()方法
  8. Objetct类在java.lang包中
  9. 关于外部类和内部类成员的相互访问的规则
  10. 内部类可以直接访问外部类的成员
  11. 外部类可通过创建内部类的实例来访问内部类的成员
  12. 关于泛型的定义
  13. class Test1 {},这是一个泛型类
  14. interface Test2 {},这是一个泛型接口
  15. lass Test3{ void test () {}},这是一个泛型方法,当然我知道这很抽象,举个例子
<T> void printElement(T element) {
    System.out.println(element);
}
嗯,泛型方法就长这样,
需要我们在void前面加一个泛型参数<T>
  1. 还是泛型的定义,我们来看一段代码
如何理解这三个方法?

public Result<T> test(){ return null; }
这是一个普通的公共方法,它返回一个泛型类型为Result<T>的对象。
这个方法可以被类内部和外部的代码调用。

public <T> Result<T> test(){ return null; }
这是一个泛型方法,它在方法名之前有一个类型参数<T>。
这意味着你可以在调用这个方法时传入一个具体的类型。
例如,如果你调用test()并传入了一个String类型,那么方法将返回一个Result<String>类型的对象。

public static <T> Result<T> test(){ return null; }
这是一个静态的泛型方法。它与第二个方法相似,但被声明为静态的。
静态方法属于类而不是实例,所以你可以在没有类实例的情况下调用它。
例如,你可以通过ClassName.test()的方式调用它。

总结
第一个方法是一个普通的泛型方法,可以被实例调用。
第二个方法也是一个泛型方法,但它可以在调用时传入类型参数,可以灵活地返回不同类型的Result<T>。
第三个方法是一个静态的泛型方法,可以在没有类实例的情况下调用,也可以在调用时传入类型参数。
  1. 关于匿名内部类
  2. 匿名内部类是内部类的简化形式
  3. 匿名内部类的前提是必须要继承父类或者实现接口
  4. 匿名内部类的格式是"new父类(参数列表)或父接口(){}"
  5. 匿名内部类内部没有构造方法,因为他们没有类名,不能被直接调用。匿名内部类的实例是通过匿名类的构造方法来创建的,这个构造方法是由编译器生成的。
  6. 关于泛型定义的深入理解
先说结论:泛型类中的静态方法不能使用类的泛型,而应该将该方法定义为泛型方法 
错误示范:
class demo<T>{
    public static T show(T temp) {
        return temp;
    }
} 

正确示范:
class demo<T>{
    public static <T> T show(T temp) {
        return temp;
    }
} 

仔细观察上面两个例子,第二个正确例子是不是在static后面加上了<T>?
这就是关键,加上<T>之后,静态方法-->泛型方法,就可以使用非静态变量了!

就泛型类而言,类实例化时才能传递真正的类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数时,静态方法就已经加载完成。显然,静态方法不能使用/访问泛型类中的泛型。
  1. 为什么内部类里面的成员变量和成员方法不能用static修饰?
  2. 因为内部类说白了就是外部类的实例,相当于外部类的成员变量,每个实例出来的对象,它的成员变量赋值都是互相独立的,互相不会影响
  3. 如果我们允许内部类static的成员变量存在,那么在赋值的时候就会混乱!
class Employee {
    public String name;
    class InnerData {
       public static count; // ??? count of which ? a or b? 
     }
}

Employee的内部类InnerData里面有一个静态变量count
我们new一个外部类:Employee a = new Employee(); 
然后给a的count赋值:a.new InnerData().count=3new一个外部类:Employee b = new Employee(); 
然后给b的count赋值:b.new InnerData().count=4
这时候是不是就混乱了?我给b赋值的时候把a的count也给修改了,因为他们公用一个count在内存中
  1. 如果我们想要内部类里面的成员变量或者方法用static修饰,那么内部类也要用static修饰
  2. 还有一句话也很重要:无法从static上下文引用非static上下文
  3. 简介的介绍一下Java的修饰权限:
  4. private: 具有最低权限,只在声明它的类内部可见。
  5. default (没有修饰符): 也称为包级访问权限。在同一包内可见,不可以跨包访问。
  6. protected: 对同一包内的类和所有子类可见。不同包中的子类也可以访问,但前提是子类要继承父类。
  7. public: 具有最高权限。被声明为 public 的类、方法、变量可以被任何其他类访问。
  8. Object类的常见方法:
  9. equals(Object obj) - 用于比较两个对象是否相等。
  10. toString() - 用于返回对象的字符串表示。
  11. hashCode() - 返回对象的哈希码值。
  12. getClass() - 返回对象的运行时类。
  13. clone() - 用于创建并返回此对象的一个副本。
  14. finalize() - 在垃圾收集器删除对象之前调用。
  15. notify() - 唤醒等待中的单个线程。
  16. notifyAll() - 唤醒等待中的所有线程。
  17. wait() - 导致当前线程等待直到另一个线程调用 notify()notifyAll() 方法。
  18. wait(long timeout) - 导致当前线程等待直到另一个线程调用 notify()notifyAll() 方法,或者指定的时间已经过去。
  19. 关于基本类型和包装类
  20. image.png
  21. 基本数据类型不能调用方法,但可以通过对应的包装类进行方法调用。
字符串转换成整型
String str = "123";
Integer a = Integer.parseInt(str);

整型转换成字符串
int a = 123;
String str = a.toString;//走的Integer的类
String str = Integer.toString(a);//走的Integer的类
String str = String.valueof(a);//走的是toString
String str = a+"";
  1. 基本类型和对应的包装类之间会进行自动转换(自动装箱和自动拆箱)
  2. 静态内部类的加载时机?
  • 静态内部类的加载时机是在外部类加载时,不需要依赖外部类的实例。静态内部类会随着外部类的加载而加载,而且只会加载一次。
  1. 什么是枚举?枚举同静态常量有何区别?
  • 枚举是一种特殊的数据类型,用于表示一组固定的常量。枚举类型可以包含多个枚举常量,每个枚举常量都是一个唯一的实例。相比之下,静态常量是通过关键字 static 来定义的类成员,它们的值可以在运行时改变。
  1. 什么是泛型?有几种泛型定义方式?
  • 泛型是一种可以在类、接口、方法中使用的类型参数,使得这些类、接口、方法可以在使用时指定具体的数据类型。有两种泛型定义方式:类泛型和方法泛型。
  1. 泛型注意事项什么?
  • 泛型不能使用基本数据类型,只能使用对象类型。
  • 泛型只能编译阶段有效,一旦编译成字节码,字节码中是不包含泛型的
  • 泛型通配符 ? 表示未知类型,不能用于实例化泛型对象。
  1. 什么是浅克隆?什么是深克隆?
  • 浅克隆是指在克隆对象时,只复制对象的基本数据类型字段,而对于引用类型字段,只复制了引用而没有复制引用指向的对象。
  • 深克隆是指在克隆对象时,不仅复制了对象的基本数据类型字段,也复制了引用类型字段指向的对象,使得原对象和克隆对象的引用类型字段指向不同的对象实例。
  1. JDK提供的包装类有什么作用?
  • JDK提供的包装类是为了将基本数据类型转换为对象,以便可以在需要对象的上下文中使用基本数据类型。这些类还提供了许多实用的方法来处理基本数据类型的操作,如转换、比较等。例如,Integerint 的包装类,它允许你在需要对象的情况下操作整数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值