一、类和对象
1 面向对象编程(理解)
1.1 面向对象编程概念
- 万物皆对象。
- 面向对象指以属性和行为的观点去分析现实生活中的事务。
- 面向对象编程指先以面向对象的思想进行分析,然后使用面向对象的编程语言进行表达的过程。
- 面向对象编程是软件产业化发展的需求。
理解面向对象的思想精髓(封装、继承、多态)。至少掌握-一种编程语言。
2 类和对象及引用
2.1 类和对象的概念
对象主要指现实生活中客观存在的实体 ,在Java语 言中对象体现为内存空间中的一块存储区域。
- 类简单来就是”分类” ,是对具有相同特征和行为的多个对象共性的抽象描述,在Java语言中体现为一种引用数据类型,里面包含 了描述特征/属性的成员变量以及描述行为的成员方法。
- 类是用于构建对象的模板,对象的数据结构由定义它的类来决定。
2.2 类的定义
- class 类名{
类体;
}
- 注意:
通常情况下,类名使用驼峰式(多个字母组成,首字母大写)。
2.3 成员变量的定义
class类名{
数据类型 成员变量名 = 初始值;
}注意:
成员变量使用小驼峰式(第二个字母首字母大写)
2.4 对象的创建
- new 类名();
- 注意:
a.当一个类定义完毕后,可以使用new关键字来创建该类的对象, 这个过程叫做类的实例化。
b.创建对象的本质就是在内存空间的堆区申请一块存储区域 ,用于存放该对象独有特征信息。
2.5 引用的定义
- 基本概念
a.使用引用数据类型定义的变量叫做弓|用型变量,简称为”引用”。
b.引用变量主要用于记录对象在堆区中的内存地址信息,便于下次访问。
- 语法格式
- 类名 引用变量名;
引用变量名.成员变量;
2.6 person案例
- 编程实现Person的使用。
成员变量的初始值
2.7 point案例
- 编程实现Point类的定义,特征有:横纵坐标(整数) ,要求在main方法中声明Point类型的引用指向Point对象并打印特征,然后将横纵坐标修改为3和5后再次打印。
3 成员方法(重要)
3.1 成员方法的定义
- class类名{
返回值类型 成员方法名(形参列表){
成员方法体:
}
}
- 当成员名多个单词组成时,要求小驼峰式(第二个单词起,每个单词的首字母大写)。
3.2 返回类型的详解
- .返回值主要指从方法体内返回到方法体外的数据内容。
- 返回值类型主要指返回值的数据类型,可以是基本数据类型,也可以是引用数据类型。
- 当返回的数据内容是66时,则返回值类型写int即可
- 在方法体中使用return关键字可以返回具体的数据内容并结束当前方法。
- 当返回的数据内容是66时,则方法体中写return 66;即可
- .当该方法不需要返回任何数据内容时,则返回值类型写void即可。
3.3 方法体详解
- 成员方法体主要用于编写描述该方法功能的语句块。
- 成员方法可以实现代码的重用,简化代码。
3.4 方法的调用
- 引用变量名成员方法名(实参列表); p.show();
- 实际参数列表主要用于对形式参数列表进行初始化操作,因此参数的个数、类型以及顺序都要完全一致。
- 实际参数可以传递直接量、变量、表达式、方法的调用等。
3.5 可变长参数
- 返回值类型方法名(参数的类型..参数名)
- 方法参数部分指定类型的参数个数是可以改变的,也就是0~n个。
- 一个方法的形参列表中最多只能声明一个可变长形参,并且需要放到参数列表的末尾。
3.6 方法的传参过程
3.7 参数传递的注意事项
- .基本数据类型的变量作为方法的参数传递时, 形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间;
- 引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变量指向同一块内存空间
- 当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向后再改变指定的内容,则通常不会影响到实参变量指向内容的改变,因为两个变量指向不同的内存空间。
3.8 内存结构之栈区
- 栈用于存放程序运行过程当中所有的局部变量。一个运行的Java程序从开始到结束会有多次方法的调用。
- JVM会为每一 个方法的调用在栈中分配一 个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。
- 当某一个方法调用完成后, 其对应的栈帧将被清除。
3.9 传参的相关概念
- 参数分为形参和实参,定义方法时的参数叫形参,调用方法时传递的参数叫实参。
- 调用方法时采用值传递把实参传递给形参,方法内部其实是在使用形参。
- 所谓值传递就是当参数是基本类型时,传递参数的值,比如传递i=10,真实传参时,把10赋值给了形参。当参数是对象时,传递的是对象的值,也就是把对象的地址赋值给形参。
二、方法和封装
1 构造方法
1.1 构造方法的基本概念
- class类名{
类名(形参列表){
构造方法体
}
}
- 构造方法名和类完全相同并且没有返回值,连void不能有
1.2 默认构造方法
- 当一个类中没有定义任何构造方法时,编译器会提供一个无参空构造方法,叫做默认/缺省构造方法,如:Person(){}
- 若出现了构造方法,则编译器不再提供任何形式的构造方法。
1.3 构造方法的作用
- 使用new关键字创建的对象时,会自动调用构造方法实现类成员的 变量初始化工作。
1.4 Ponit类案例
2 方法重载
2.1 方法重载的概念
- 若方法名称相同,参数列表不同,这样的方法之间构成重载关系(Overload)。
2.2 方法重载的体现形式
- 方法的重载主要体现在:参数的个数不同、参数的类型不同、参数的顺序不同,返回值类型和形参变量名无关,但是建议返回值最好相同(基于代码的可阅读性)
- 判断方法是否构成重载的核心:调用方法时能否加以区分
2.3 Ponit类案例(1.4相同)
Point2.java
2.4 重载的实际意义
- 方法重载的实际意义在于调用者需要记住一个方法名就可以调用各种不同的版本,来实现各种功能
- 如:java.io.PrintStream类中的println方法。
3 this关键字
3.1 this的基本概念
- 若在构造方法中出现了this关键字,则代表当前正在构造对象。
- 若成员方法中出现了this关键字,则代表当前正在调用的对象。
- this关键字本质上就是当前类类型的引用变量。
3.2 工作原理
- .在构造方法中和成员方法中访问成员变量时,编译器会加上this的前缀,而this.相当于汉语中”我的” ,当不同的对象调用同一个方法时,由于调用方法的对象不同导致this关键字不同,从而this.方式访问的结果也就随之不同。
3.3 使用方式
- 当局部变量名与成员变量名相同时,在方法体中会优先使用局部变量(就近原则) ,若希望使用成员变量,则需要在成员变量的前面加上this的前缀,明确要求该变量是成员变量(重中之重)。
- this关键字除了可以通过this的方式调用成员变量和成员方法外,还可以作为方法的返回值(重点)。
- 在构造方法的第一行可以使用this()的方 式来调用本类中的其它构造方法(了解)。
3.4 注意事项
- 引用类型变量用于存放对象的地址,可以给引用类型赋值为null ,表示不指向任何对象。
- 当某个弓|用类型变量为null时无法对对象实施访问(因为它没有指向任何对象)。此时,如果通过引用访问成员变量或调用方法,会产生NullPointerException异常。
4 方法递归调用
4.1 方法案例
- 编程实现参数阶乘并返回,所谓阶乘就是从1累乘到n的结果。
4.2 递归的基本概念
- 递归的本质就是指在方法体的内部直接或者间接调用当前方法自身的形式。
4.3 注意事项
- 使用递归必须有递归的规律以及退出条件。
- 使用递归必须使得问题简单化而复杂化。
- 若递归影响到程序的执行性能,则使用递推取而代之。
4.4 案例题目
- 编程实现费式数列中第n项的数值并返回。
- 费式数列:1 1 2 3 5 8 13 21 ……
5 封装
5.1 封装的概念
- 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值 ,无论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生活不符。
- 为了避免上述错误的发生,就需要对成员变量进行密封包装处理,来隐藏成员变量的细节以及保证成员变量数值的合理性,该机制就叫做封装。
5.2 封装的实现流程
- 私有化成员变量,使用private关键字修饰。
- 提供公有的get和set方法,并在方法体中进行合理值的判断。
- 在构造方法中调用set方法进行合理值的判断。
5.3 案例题目(学生信息)
- 提示用户输入班级的学生人数以及每个学生的信息,学生的信息有:学号、姓名,最后分别打印。
- 提示:Student[] aar = new Student[num];
Student.javaStudentTest.javaStudentTest2.java
5.3 JavaBean的概念
- JavaBean是一 种Java语言写成的可重用组件,其它Java类可以通过反射机制发现和操作这些JavaBean的属性。
- JavaBean本质上就是符合以下标准的Java类:
类是公共的
有一个无参的公共的构造器
有属性,且有对应的get、set方法
三、 Static关键字和继承
1 static关键字
1.1 案例
- 编程实现People类的封装,特征有:姓名、年龄、国际,要求提供打印所有特征的方法。
- 编程实现PeopleTest类,main方法中使用有参方式构造两个对象并打印
1.2 基本概念
- 使用static关键字修饰成员变量表示的静态含义,此时成员变量由对象层级提升类层级,也就是整个类只有一份并被所有对象共享,该成员变量随着类的加载准备就绪,与是否创建对象无关
- static关键字修饰的成员变量可以使用引用.的方式访问,推荐类名.的方式。
1.3 使用方式
- 在非静态成员方法中既能访问非静态成员又能访问静态成员。(成员:成员变量+成员方法,静态成员被所有对象共享)
- 在静态成员方法中只能访问静态成员不能访问非静态成员。(成员:成员变量+成员方法,因此此时可能还没有创建对象)
- 在此以后的开发中只有隶属于类层级并被所有对象共享的内容才可以使用static关键字修饰。(不能滥用static关键字)
1.4 构造块和静态代码块
- 构造块:在类体中直接使用{}括起来的代码块。
- 每创建一个对象都会执行一次代码块。
- 静态的代码块:使用statis关键字修饰构造块。
- 静态代码块随着类的加载时,执行一次
1.5 又见main方法
- 语法格式:public static void main(String[] args){}
1.6 编程实现Sigleton类封装
实现singleton类的测试,要求main方法中能且得到该类的一个对象
1.7 单例设计模式概念
- 在某些特殊场合,一个类对外提供有且一个对象时,这样的类叫做单例类,而设计单例流程和思想叫做单例设计模式。
1.8 单例设计模式的实现流程
- 私有构造方法,使用private关键字修饰。
- 声明本类型的引用指向本类类型的对象,并使用private statis关键字修饰
- 提供公有的get方法负责把对象返回出去,并使用public statis 关键字共同修饰。
1.9 单例设计模式的实现方式
- 单例设计模式的实现方式有两种:饿汉式和懒汉式,在以后的开发中推荐饿汉式。
2 继承
2.1 继承的概念
当多个类之间有相同的特征和行为时,可以将相同的内容提取出来组成一个公共类,让多个类吸收公共类已有的特征和行为而在多个类型只需要编写自己独有特征和行为的机制,叫做继承。
在Java语言中使用extends(拓展)关键字来表示继承的关系
- e.g. :
public class Work extends Persons{} -表示Wor类继承Persons类
其中Persons类叫做超类、父类、基类
其中Work类叫做派生类、子类、孩子类
- 使用继承提高代码的复用性,可维护及扩展性,是多态的前提条件
2.2 继承的特点
- 子类不能继承父类的构造方法和私有方法,但是私有成员变量可以被继承,只是不能访问
- 无论使用什么方式创建的子类对象都会自动的调用父类的无参数构造方法,来初始化从父类中继承的成员变量,相当于在构造方法的第一行增加代码super()的效果
- 使用继承必须瞒住逻辑关系:子类 is a 父类,但是不能滥用继承
- java语言中只支持单继承不支持多继承,也就是说一个子类只能有一个父类但是一个父类可以有多个子类
2.3 方法重写的概念
- 从父类中继承下来的方法不满足子类的需求时候,就需要在子类中重写一个和父类方法一样的方法覆盖从父类中继承下来的版本,该方法就是方法的重写(override)
2.4 方法重写的原则
- 要求方法名字相同、参数列表相同以及返回值类型相同,从java5开始允许返回子类类型
- 要求方法的访问权限不能变小,可以相同或者变大
- 要求方法不能抛出跟大的异常(异常机制)
2.5 继承案例
2.6 又见构造块与静态代码块(笔试经典)
- 先执行父类的静态代码块,在执行子类的静态代码块
- 执行父类的构造块,执行父类的构造方法
- 执行子类的构造块,执行子类的构造方法
3 访问的控制
3.1 常用的访问控制符
注意事项
- public修饰的成员可以在任意位置使用
- private修饰的成员只能在本类中使用
- 通常情况下,成员方法都使用public关键字修饰,成员变量都是使用private关键字修饰
3.2 package语句的由来
- 定义类时需要指定类的名称,但是如果仅仅将类名作为类的唯一标识,则不可避免的出现命名冲突的问题。这会给组件复用以及团队间的合作造成很大的麻烦
- 在java语言中,用包(package)的概念就是解决 命名冲突的问题。
3.3 包的定义
- 在定义一个类时,除了定义类的名称一般还要指定包名,格式如下:
package 包名;
package 包名1.包名2.包名3…..包名n;
- 为了实现项目管理、解决命名冲突以及权限控制的效果。
3.4 定义包的规范
- 如果各个公司或开发组织的程序员都随心所欲的命名包名的话,仍然不能从根本上解决命名冲突的问题。因此,在指定包名的时候应该按照一定的规范。
- org.apache.commons.lang.StringUtil
- 其中StringUtils是类名而org.apache.commons.lang是多层包名, 其含义如下: org.apache表示公司或组织的信息(是这个公司(或组织)域名的反写) ; common表示项目的名称信息; lang表示模块的名称信息。
3.5 包的导入
- 使用import关键字导入包
- 使用import关键字导入静态成员,从java5开始支持
4 final关键字(重点)
4.1 基本概念
- final本意为”最终的、不可改变的”,可以修饰类、成员方法以及成员变量
4.2 使用方式
- final关键字修饰类的体现在该类不能被继承
-主要用于防止滥用继承,如:java.long.String类等
- final关键字修饰成员变量方法体现在该方法不能被重写但是可以被继承
-主要是为了防止不经意间造成重写,如:java.text.Dateformat类中format方法等
- final关键字修饰成员变量体现在该变量必须初始化切不能改变
-主要用于防止不经意间造成改变,如java.long.Thread类中max_PRIORITY
4.3 常量的概念
- 在以后的开发中很少单独使用final关键字来修饰成员变量,通常使用public statis final关键字共同修饰成员变量来表达常量的含义,常量的命名规范要求所有的字母都要大写,但是不同单词之间采用下划线连。
- public static final double PI=3.14;
四、 多态和特殊类
1. 多态
1.1 多态的概念
- 多态指同一事物表现出的多种形态
1.2 多态的语法格式
- 父类类型 引用变量名 = new 子类类型
- e.g. :
Shape sr = new Rect();
sr.show();
1.3 案例题目
1.4 多态的特点
- 当父类类型的引用指向子类类型的对象时,父类类型的引用直接调用父类独有的方法。
- 当父类类型的引用指向子类类型对象时,父类类型引用不可以直接调用子类的独有方法
- 对于父子类都有的非静态方法,编译阶段调用父类版本,运行阶段调用子类重新的版本(动态绑定)
- 对于父子类都有的静态方法来说,编译和运行阶段都是调用父类版本
1.5 引用数据类型之间的转换
- 引用数据类型的转换有两种:自动类型转换和强制类型转换
- 自动类型转换指小类型向大类型转换,也就是子类向父类转换,也就是向上转型
- 强制类型转换指大类型向小类型转换,也就是父类转向子类,就是向下转型或者显式类型转换
引用数据类型之间的转换必须发生在父子类之间,否则编译报错
若强制的目标类型并不是该引用真正指向的数据类型时,则编译通过,运行阶段发生类型转换异常
- 为了避免上述的错误发生,应该在强转之前就判断,格式如下:
if(引用变量instanceof数据类型)
判断引用变量指向的对象是否为后面的数据类型
1.6 多态的实际意义
- 多态的实际意义在于屏蔽不同子类的差异性实现通用编程带来不同的效果
2 抽象类
2.1 抽象方法的概念
- 抽象方法主要指不能具体实现的方法并且使用abstract关键词修饰,也就是没有方法体
- 具体格式如下
访问权限abstract 返回值类型 方法名(形参列表);
public abstract void cry();
2.2 抽象类的概念
- 抽象类指不能具体实例化并且使用abstract关键字修饰,也就是不能创建对象
2.3 抽象类和抽象方法的关系
- 抽象类中可以有成员方法、构造方法、成员变量
- 抽象类中可以没有抽象方法,也可以有抽象方法
- 拥有抽象方法的类必须是抽象类,因此真正意义上的抽象类应该是具有抽象方法并且使用abstract修饰的类
2.4 抽象类的实际意义
- 抽象类的实际意义不在于创建对象而在于被继承
- 当一个类继承抽象类后必须重写抽象方法,否则该类就会变成抽象类,也就是抽象类对子类具有强制性和规范性,因此叫做模板设计模式
2.5 开发经验
- 在以后的开发中推荐使用多态的格式,此时父类类型引用直接调用所有方法一定是父类拥有的方法,若以后更换子类时,只需要将new关键字后面的子类类型修改而其他地方无需改变就可以立即生效,从未提高了代码的可维护性和拓展性
- 该方法的缺点就是:父类引用不能直接调用子类独有的方法,若是调用则需要强制类型装换
2.6 抽象类的应用
- 银行有定期账户和活期账户。继承自账户类。账户类:
- public class Account{
private double money;
public double getLixi(){}
}
3 接口
3.1 接口的基本概念
- 接口就是比抽象类更加抽象的类,体现就在所有的方法都是抽象方法
- 定义类的关键字是class ,而定义接口的关键字是interface
3.2 接口项目
3.3 接口和类之间的关系
3.4 抽象类和接口的主要区别(笔试题)
- 定义抽象类的关键字是abstract class ,而定义接口的关键字是interface
- 继承抽象类的关键字是extends,而实现接口的关键字是implement
- 继续抽象类支出单继承 , 而实现接口支持多实现
- 抽象类中可以有构造方法,而接口中不能有构造方法
- 抽象类中可以有成员变量,而接口只可以有常量
3.5 抽象类和接口的主要区别
- 抽象类可以有成员方法,而接口只可以有抽象方法
- 抽象类中增加方法时子类不用重写,而接口中增加方法时实现类需要重写(java8以前的版本)
- 从java8开始增加新特性,接口允许出现非抽象方法和静态方法,但是非抽象方法需要使用default关键字修饰,从java9开始增加新特性,接口允许出现私有方法
五、 特殊类
1 内部类
1.1 内部类的基本概念
- 当一个类的定义出现在另一个类的类体中时,那么这个类叫做内部类(Inner),而这个内部类所在的类叫做外部类(Outer)
- 类中的内容:成员变量、成员方法、构造方法、静态成员、构造块和静态代码块、内部类
1.2 实际作用
- 当一个类存在价值是为了某个类单独服务时,那么就可以将这个类定义为所有服务类的内部类,这样可以隐藏该类的实现细节可以方便的访问外部类的私有成员而不再需要提供公有的get和set方法
1.3 内部类的分类
- 普通内部类 将定义一个类的定义放在另一个类的类体中
- 静态内部类 使用static关键字修饰的内部类,隶属于类层级
- 局部内部类 直接一个类的定义放在方法体的内部时
- 匿名内部类 就是指没有名字的内部类
1.4 普通(成员) 内部类的格式
- 访问修饰符号cladd外部类的类名{
访问修饰符class 内部类的类名{
内部类的类体;
}
}
1.5 普通内部类的使用方式
- 普通的内部类和普通的类一样可以定义成员变量、成员方法和构造方法等
- 普通内部类和普通类一样可以使用final或者abstract关键字修饰
- 普通内部类还可以使用private或者protected关键字修饰
- 普通内部类需要使用外部类的对象来创建对象
- 如果内部类访问外部类中与本类内部同名的成员变量或方法时,需要使用this关键字
1.6 静态内部类的格式
- 访问修饰符class外部类的类名{
访问修饰符static class 内部类的类名{
内部类的类体;
}
}
1.7 静态内部类的使用方式
- 静态内部类不能直接访问外部类的非静态成员
- 静态内部类可以直接创建对象
- 如果静态内部类访问外部类中与本类内同名的成员变量或方法时,需要使用类名.的方式访问
1.8 局部(方法)内部类的格式
- 访问修饰符class外部类的类名{
访问修饰符 返回值类型 成员方法名(形参列表){
class 内部类的类名{
内部类的类体;
}
}
}
1.9 局部内部类的使用方式
- 局部内部类只能在该方法的内部使用
- 局部内部类可以在方法体内部直接创建对象
- 局部内部类不能直接访问控制符和static关键字修饰符
- 局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局部变量的声明周期不同所致
1.10 回调模式的概念
- 回调模式是指 如果一个方法的参数类型是接口类型,则在调用该方法时需要创建并传递一个实现此接口类型的对象;而该方法在运行时会调用到参数对象中所实现的方法(接口中定义的)
1.11 开发分享
- 当接口/类类型的引用作为方法的形参时,实参的传递方式两种
- 自定义类实现接口/继承类并重写方法,然后创建该类对象作为实参传递
- 使用上述匿名内部类的语法格式得是接口/类类型的引用即可
1.12 匿名内部类的语法格式
- 接口/父类类型 引用变量名 = new 接口/父类类型(){方法的重写};
2 枚举
2.1 枚举的基本概念
- 在日常生活中这些事务的取值只有明确的几个固定值,此时描述这些事物的所有值都是可以 —列举出来,而这个列举出来的类型就叫枚举类型
2.2 枚举的定义
- 使用public static final 表示的常量描述较为繁琐 , 使用enum关键字来定义枚举类型取代常量,枚举类型是从java开始增加的一种引用数据类型
- 枚举值就是当前类的类型,也就是指向本类的对象,默认使用public static final关键字共同修饰,因此采用枚举类型.的方式调用
- 枚举类可以定义构造方法,但是构造方法的修饰符必须是private,默认也是私有。
2.3 Enum类的概念和方法
- 所有的枚举类都是继承java.long.Enum类,常用方法如下:
2.4 枚举类实现接口的方式
- 枚举类实现接口后需要重写抽象方法,而重写方法的方式两种:重写一个,或者每个对象都是重写。
3 注解
3.1 注解的基本概念
- 注解又是标注,是从java5开始增加的一种引用数据类型。
- 注解本质上就是代码中特殊标记,通过这些标记可以在编译、类加载、以及运行时执行指定的处理。
3.2 注解的语法格式
- 访问修饰符@interface注解名称{
注解成员;
}
- 自定义注解自动继承java.long.annotation.Annotation接口。
- 通过@注解名称的方式可以修饰包、类、成员方法、构造方法、参数、局部变量的声明等。
3.3 注解的使用
- 注解中只有成员变量没有成员方法,而注解成员变量以”无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
- 如果注解只有一个参数成员,建议使用名为value,而类型只能八种基本数据类型、String类型、Class类型、enum类型及Annotation类型
3.4 元注解的概念
- 元注解是可以注解到注解的注解,或者说元注解是一种基本注解,但是它能够应用到其他的注解上面
- 元注解主要有@Retention、@Documented 、@Taget 、@Inherited 、@Repeatable
3.5 元注解@Retention
- Retention 应用到一个注解上用于说明该注解的生命周期,取值如下:
- RetentionPolicy.SOURCE注解只在源码阶段保留,在编译器进行编译时它将被忽视
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载jvm中,默认方法
- RetentionPolicy.RUNTIME注解可以保留到程序运行的时候,它会被加载进入jvm中,所以在程序运行时可以获取它们
3.6 元注解@Documented
- 使用javadoc工具可以从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套额API帮助文档,而该该工具抽取时默认不包括注解内容。
- @Documented用于指定该注解将被javadoc工具提取成文档
- 定义为@Documented的注解必修设置Retention 值为RUNTIME。
3.7 元注解@Taget
- @Taget用于指定被修饰的注解用于哪些元素修饰,取值如下:
3.8 元注解@Inherrited
- @Inherited并不是说注解本身可以继承,而是说如果一个超类被该注解标记过的注解进行注解时,如果子类没有被任何注解应用时,则子类就继承超类的注解。
3.9 元注解@Repeatable
- @Repeatable表示自然可重复的含义,从java8开始在增加的新特性
- 从java8开始对元注解@Target的参数类型ElementType枚举增加俩两个
- 其中ElementType.TYPE_PARAMETER表示该注解能写在类型变量的声明语句中,如:泛型
- 其中ElementType.TYPE_USE表示该注解能写在使用类型的任何语句中
3.10 常见的预制注解
- 预制注解就是Java语言自身提供的注解,具体如下:
- 常见的预制注解如下:
2
ar
r内存结构之栈区
内存结构之栈区
内存结构之栈区
内存结构之栈区
内存结构之栈区
内存结构之栈区
内存结构之栈区