default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
所有字符串变量都是String类的实例,String是java自带的类
在Java中,final关键字用于表示常量。它可以与变量,方法和类一起使用。
任何实体(变量,方法或类)一旦被声明final后,只能分配一次。也就是,
final变量不能用另一个值重新初始化
final方法不能被重写
final类不能被继承
在Java中,instanceof关键字是二进制运算符。它用于检查对象是否是特定类的实例。
运算符还检查对象是否是实现接口的类的实例
result = objectName instanceof className;
左操作数是对象名,右操作数是类名。如果对象是类的实例,则结果为true;如果不是,则为false
继承是一个OOP面向对象属性,它使我们可以从现有的类(父类)派生一个新的类(子类),而子类继承超类的属性和方法。
现在,如果在父类和子类中都定义了相同的方法,则子类的方法将覆盖超类的方法。这称为方法覆盖(方法重写)。
父类和子类都必须具有相同的方法名称,相同的返回类型和相同的参数列表。
我们不能重写声明为final和static的方法。
我们应该始终重写超类的抽象方法(将在以后的教程中进行讨论)。
在Java中执行重写时出现的一个常见问题是:
我们可以在重写后访问超类的方法吗?
答案是肯定的。要从子类访问超类的方法,我们使用super关键字。
需要注意的是,Java中的构造函数不会被继承。因此,在Java中不存在诸如构造函数重写之类的问题。
在Java中,抽象类被创建为其他类的父类(基类)。而且,如果类包含抽象方法,则必须重写它。
abstract class Animal { public void displayInfo() { System.out.println(“I am an animal.”); } abstract void makeSound(); }
抽象类即对某事物的逻辑抽象,也可以理解为对一群对象共性的提取,比如‘人’就是一个抽象的概念
抽象类是无法实例化的类,但是我们可以从中创建子类。我们可以创建子类的对象来访问抽象类的成员。
抽象方法声明了一个方法而没有实现
注意:只有一个抽象类才能包含抽象方法
抽象类无法实例化。要访问抽象类的成员,我们必须继承它。
在Java中,必须在子类中重写超类的抽象方法。这是因为子类继承了超类的抽象方法。
因为我们的子类包含抽象方法,所以我们需要重写它们(子类不是抽象类,不能包含抽象方法,所以要重写)。
注意:如果子类也被声明为抽象,则不必强制重写抽象方法。
接口强调特定功能的实现,而抽象类强调所属关系。
接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。
抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号
在Java中,多态可以分为两种类型:
运行时多态:方法重写
编译时多态:方法重载,运算符重载
封装是面向对象编程的重要功能之一。封装是指将字段和方法绑定在单个类中。
将类中的类似字段和方法捆绑在一起也有助于隐藏数据。
为了创建非静态类Reptile的对象,我们使用了
Animal.Reptile reptile = animal.new Reptile()
为了创建静态类Mammal的对象,我们使用了
Animal.Mammal mammal = new Animal.Mammal()
在Java中,一个类可以包含另一个称为嵌套类的类。可以在不提供任何名称的情况下创建嵌套类。
没有任何名称的嵌套类(内部类)称为匿名类。
必须在另一个类中定义一个匿名类。因此,它也被称为匿名内部类
匿名类通常继承子类或实现接口。
关于单例引用自:https://www.cnblogs.com/cielosun/p/6582333.html
一. 什么是单例模式
因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。
二. 单例模式的特点
1. 单例模式只能有一个实例。
2. 单例类必须创建自己的唯一实例。
3. 单例类必须向其他对象提供这一实例。
三. 单例模式VS静态类
在知道了什么是单例模式后,我想你一定会想到静态类,“既然只使用一个对象,为何不干脆使用静态类?”,这里我会将单例模式和静态类进行一个比较。
1. 单例可以继承和被继承,方法可以被override,而静态方法不可以。
2. 静态方法中产生的对象会在执行后被释放,进而被GC清理,不会一直存在于内存中。
3. 静态类会在第一次运行时初始化,单例模式可以有其他的选择,即可以延迟加载。
4. 基于2, 3条,由于单例对象往往存在于DAO层(例如sessionFactory),如果反复的初始化和释放,则会占用很多资源,而使用单例模式将其常驻于内存可以更加节约资源。
5. 静态方法有更高的访问效率。
6. 单例模式很容易被测试。
enum Size { //枚举常量,调用枚举构造函数 SMALL("尺寸很小。"), MEDIUM("尺寸中等。"), LARGE("尺寸很大。"), EXTRALARGE("尺寸超大。"); private final String pizzaSize; //私有枚举构造函数 private Size(String pizzaSize) { this.pizzaSize = pizzaSize; } 我们将SMALL分配给枚举变量size。 然后,常量SMALL以字符串为参数调用构造函数Size,还可以重写toString方法修改默认的字符串值
反射是java的一个特性,在Java中,反射允许我们在运行时检查和操作类、接口、构造函数、方法和字段
Java中有一个名为Class的类,该类在运行时保留有关对象和类的所有信息。
Class对象描述了特定类的属性。该对象用于执行反射。
Class c1 = Class.forName("Dog");//从类名返回Class类对象 Class c1 = d1.getClass();//从对象返回Class类对象 Class c1 = Dog.class;//使用.class后缀返回Class对象
创建Class对象后,我们可以使用这些对象执行反射
我们可以使用Class的getInterfaces()方法来收集类实现的接口的信息。此方法返回一个接口数组。
//创建一个Dog类的对象 Dog d1 = new Dog(); //使用getClass()创建Class对象 Class obj = d1.getClass(); //查找由Dog实现的接口 Class[] objInterface = obj.getInterfaces();
该软件包java.lang.reflect提供了可用于操作类成员的类。例如,
方法类 - 提供有关类中方法的信息,Method类,
//使用getDeclaredMethod()获取所有方法 Method[] methods = obj.getDeclaredMethods();
字段类 - 提供有关类中字段的信息,Field类,
Field field1 = obj.getField("type");//可以使用field1去访问事物类的字段
构造函数类 - 提供有关类中构造函数的信息,Constructor类
//使用getDeclaredConstructor()获取一个类中的所有构造函数 Constructor[] constructors = obj.getDeclaredConstructors();
异常层次结构还具有两个分支:RuntimeException和IOException。
运行时异常发生由于编程错误。它们也称为非检查异常。你可以这样想:“如果这是一个运行时异常,那就是你的错”
IOException也称为检查异常。它们由编译器在编译时检查,并提示程序员处理这些异常。比如尝试打开不存在的文件会导致 FileNotFoundException
可能有几个方法会导致异常。为每种方法编写try...catch将是乏味的,并且代码将变得冗长且难以理解。
当您已检查了不希望在当前方法中捕获的异常(必须处理的异常)时,throws也很有用。
Java注解是我们程序源代码的元数据(有关数据的数据,即说明数据的信息)。
它们向编译器提供关于程序的附加信息,但不是程序本身的一部分。这些注解不会影响已编译程序的执行。
注解以@开头。
标记注解不包含成员/元素。它仅用于标记声明。
@Override
单个元素注解仅包含一个元素。
@AnnotationName(value = "elementValue")或者
@AnnotationName("elementValue")
这些注解包含多个用逗号分隔的元素。
@AnnotationName(element1 = "value1", element2 = "value2")
Java中的断言通过测试我们认为是正确的代码来帮助检测错误。
使用assert关键字进行断言。
其语法为:
assert condition;
assert condition : expression;
这里condition是一个布尔表达式,我们假定在程序执行时为真。
默认情况下,断言在运行时被禁用并被忽略。
为了启用断言,我们使用:
java -ea:arguments
为了对程序Main的所有类启用断言,
java -ea Main
只启用一个类,
java -ea:AnimalClass Main
这只允许在Main程序的AnimalClass中使用断言。
在包名称中启用断言
要对包com.animal及其子包启用断言
java -ea:com.animal... Main