Java核心卷I学习笔记(三)——继承、泛型、反射

2024-09-02 22:58

本文主要是介绍Java核心卷I学习笔记(三)——继承、泛型、反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第五章 继承

1、集继承(Inheritence)是基于已经存在的类构造一个新类,继承已经存在类就可以复用(继承)这些类的方法和域;同时在此基础上可以添加一些新的方法和域,以满足新的需求。

2、利用关键字extends来基于已存在类实现新的类;已存在的类称为超类(superclass)、父类(parentclass)、基类(baseclass),新的类称为子类(subclass)、派生类(derivedclass)、或者孩子类(childclass)。

3、覆盖(override)方法:在子类中定义和父类方法名、参数、返回类型完全一样的方法,在方法内部重新定义内容称为覆盖或者重写。

A、利用super可以调用父类的内容,比如父类的方法、父类的构造函数;同时可以通过super可以访问父类的private对象。

使用super必须放在构造器的第一句;

public class Manager extends Employee {private double solary=10000.0;public Manager(String name) {//name通过super(这里super是父类Employee)可以初始化name;//而Manager是无法直接访问Employee的私有变量name的,即Manager自己无法初始化name的值;super(name);}@Overridepublic String info(){//利用super调用父类的info()方法String temp=super.info();return temp+this.solary;}	public double getSolary() {return solary;}public void setSolary(double solary) {this.solary = solary;}
}

4、多态,对于这种一个对象变量可以指向多种实际类型的现象称为多态(Polymorphism);在运行时能够自动的选择调用哪个方法的现象称为动态绑定(dynamic binding)。

多态简单的理解就是一个Employee对象既可以引用一个Employee类的对象;又可以引用一个Employee类的子对象Manager,这种现象被称为多态。

因为多态、重写,父类和子类有同样的方法;当子类调用该方法时该执行父类还是子类的方法呢?

对象指向某个类型的引用即执行谁的方法;Employee e1=new Manager(); Employee e2=new Employee();e1指向Manager,会执行Manger的方法;e2指向Employee会执行Employee的方法。

5、方法是如何执行调用的?(下文提到的e1、e2对象就是上文的e1、e2)

A、编译器会先查看对象的类型与方法名;假设调用e1.find(param),编译器会查找e1类名为find的方法(可能存在多个,比如find(String str)、find(int a)等),以及e1父类中访问属性为public且名字为find的方法(即继承的方法也会被找到);

至此,编译已经获得了所有可能被调用的“候选”方法。

B、接下来,编译器查看参数的调用类型;所有为find的方法中与提供的参数类型完全匹配的,就选择执行这个方法;这个过程被称为重载解析(overloading resolution)。

这个过程对编译器来说会比想象中的复杂,因为可能存在类型转换,比如int可以转换为String,Manger可以被转换为Employee;最终如果编译器没有找到参数类型匹配的方法,或者经过类型转换以后有多个方法匹配,就会报告一个错误;

此致,编译已经获得了需要的方法名字和参数类型。

6、动态绑定与静态绑定;

A、以上这些查找方法的过程,就是动态绑定;即在执行之前编译器并不确定要执行哪个方法,通过一系列分析才确定。

D、静态绑定:如果是private方法、static方法、final方法或者构造器,那么编译器可以准确的知道应该调用哪个方法,这种调用方式成为静态绑定(static binding)。

C、上文中动态绑定搜索方法的过程明显效率低下,时间开销较大,因此虚拟机就预先为每个类创建了一个方法表(method table),每次搜索直接查找这个表就可以了;另外对于super修饰的方法,编译器会直接去查找超类。

7、阻止集成:final类和方法

A、有时候希望阻止利用某个类定义子类,这种不允许扩展的类利用final修饰,被称为final类。

B、利用final修饰的类,所有方法自动成为final方法,但是类的域并不是final类型的(即属性并不是final的)。

C、定义为final的目的主要是为了确保他们不会在子类中改变语义。String就是一个final类,因此一个String对象必定是String型的,不存在多态导致是其他类型。

8、抽象类(abstract class)

A、用abstract修饰的类被称为抽象类,抽象类可以理解为是占位符,提供一些通用的但是又暂时不想实现的方法;

B、抽象方法中除抽象方法外,还可以包含具体的数据和具体的方法;

C、抽象类的实现子类中,如果全部实现了抽象方法,那么这个类就不再是抽象类;子类实现部分抽象方法或者完全不实现抽象类的方法,这样子类也必须标记为抽象类;

D、类即使不包含抽象方法也是可以声明为抽象类的;

F、抽象类不能被实例化,但是抽象类可以利用子类(子类不是抽象类)来实例化。

9、类的保护(protected),private谁也无法访问,而public又谁都可以访问不安全,因此可以用protected来修饰;protected修饰的属性或者方法可以被继承,在同一个包内可以被访问。

10、Object类:所有类的超类

equals方法,它用于检测一个对象是否等于另外一个对象,在Object类中,这个方法判断对象是否具有相同的引用;然而在现实中这种比较意义不大,现实中比较的是两个对象的状态是否相等;

比如:两个Employee比较,对比的是他们的name、address、solary这些是否相等;而并不会去比较两个employee是否指向的是同一个对象的引用。

11、泛型数组列表

A、ArrayList数组,eg:ArrayList<Employee> staff=new ArrayList<Employee>();//第二个Employee可以省略,即new ArrayList<>();

B、数组的长度确定以后想改变非常费事,而ArrayList可以通过自己的add方法动态增加,而程序员不需要动态调节数组的容量。

C、ArrayList有get、set、add等方法,add方法可以添加一个数组,添加一个元素后,后续元素全部往后移动,这种添加效率较低,开销较大,因此长度较大且常执行添加、删除的数组,建议采用LinkList。

12、对象包装器与自动装箱

A、Java有八种基本类型,但是有时候需要将int这类基本类型转换为对象,这就需要有与之对应的类,int对象的类型是Integer,这种类被称为包装器(wrapper)。八种:Integer、Float、Double、Long、Short、Byte、Character、Void、Boolean。

B、对象包装器类是不可变的,即一旦构造了包装器,就不能再更改包装器中的值;同时这8个类是final类型的,不允许被继承。

C、假设定义一个整型数组,他的类型是不允许是基本类型,这里就需要用到Integer;同时添加元素的时候会发生“自动装箱”

        ArrayList<Integer> alist=new ArrayList<>();alist.add(3);//自动装箱,本剧代码会在执行时,自动变为下一句的写法alist.add(Integer.valueOf(3)); 

13、参数可变的方法,java支持在方法中利用省略号(...)的方式来实现可变(不确定参数个数)参数;

  //计算N个整数之和public static int sum(int ...value){int sum=0;for(int i=0;i<value.length;i++){sum=value[i]+sum;}return sum;}

14、枚举类、定义:public enum Size{SMALL,MEDIUM,LARGER,EXTRA_LARGER}; 枚举类中可以定义方法和实例域。

15、反射(reflection )

A、Class类,获取三种方式:(1)e.getClass(); (2)Class.forName("java.util.int");(3)int.class;

B、能够分析类能力的程序称为反射(reflective);反射机制拥有极其强大的能力,他的使用者主要是是工具的构造者,而不是应用程序员;

16、利用反射分析类的能力,解析类

package com.supermap.reflection;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;public class ReflectionTest {public static void main(String[] args) {//1)利用反射的能力解析类String name="java.lang.Integer";try {//类本身及集成Class cl=Class.forName(name);Class supercl=cl.getSuperclass();String modifiers=Modifier.toString(cl.getModifiers());if(modifiers.length()>0)System.out.println(modifiers+" ");if(supercl!=null&&supercl!=Object.class)System.out.println("extends:"+supercl.getName());//开始分析构造函数printConstructors(cl);//开始分析方法System.out.println("开始打印方法————————");printMethods(cl);//打印字段方法略Field[] fields=cl.getFields();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 打印一个类的所有构造函数*/public static void printConstructors(Class cl){Constructor[] constructors=cl.getDeclaredConstructors();for(Constructor c:constructors){String name=c.getName();String modifiers=Modifier.toString(c.getModifiers());if(modifiers.length()>0)System.out.println(modifiers+"  ");System.out.println(name+"  (");Class[] paramTypes=c.getParameterTypes();for(int i=0;i<paramTypes.length;i++){if(i>0)System.out.println(", ");System.out.println(paramTypes[i].getName());}System.out.println(");");}}/*** 打印一个类的所有方法*/public static void printMethods(Class cl){Method[] methods=cl.getDeclaredMethods();for(Method m:methods){Class retType=m.getReturnType();String name=m.getName();String modifiers=Modifier.toString(m.getModifiers());if(modifiers.length()>0)System.out.println(modifiers+"  ");System.out.println(retType.getName()+"  "+name+"(");Class[] paramTypes=m.getParameterTypes();for(int i=0;i<paramTypes.length;i++){if(i>0)System.out.println(",");System.out.println(paramTypes[i].getName());}System.out.println(");");}}}

17、在运行时,使用反射分析对象

在编写程序时查看类的域名和类型很容易;而利用反射可以查看编译时还不清楚的对象域。

	    //2)利用反射的能力解析运行中的对象Manager mm=new Manager("张三");mm.ID="12345678";Class mmcl=mm.getClass();Field mmf=mmcl.getDeclaredField("ID");//name为private时这句会报错,java安全机制阻止访问private字段//Field mmf=mmcl.getDeclaredField("name");//mmf.setAccessible(true);//添加这句就不会报错;通过设置true可以覆盖java的访问控制Object v=mmf.get(mm);System.out.println(v);

18、

这篇关于Java核心卷I学习笔记(三)——继承、泛型、反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1131310

相关文章

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

eclipse如何运行springboot项目

《eclipse如何运行springboot项目》:本文主要介绍eclipse如何运行springboot项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目js录当在eclipse启动spring boot项目时出现问题解决办法1.通过cmd命令行2.在ecl

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos