三大特征
封装性(encapsulation)
①将属性进行私有化(private),通过公共方法(public)进行赋值和读取
②不对外暴露的私有方法
③单例模式
......
继承性(extends)
好处
>减少了代码的冗余,提高了代码的复用性
>便于功能的扩展
>为多态性的使用,提供前提
格式
>class A extends B{}
| A:子类,派生类,subclass
| B:父类,超类,基类,super class
>一旦子类A继承父类B以后,A就获取了B中声明的所有的结构:属性,方法
>子类在继承以后,还可以声明自己特有的属性和方法:实现功能的扩展
>extends :延展 、 扩展
规定
>一个父类可以被多个子类继承:Java中的多层继承性
>一个子类只能有一个父类:Java中的单继承性
>子父类是相对概念的
>子类直接继承的父类,称为直接父类。间接继承的父类,称为间接父类
>子类继承父类以后,就获取了直接父类及所有间接父类中声明的属性和方法
Object类
>如果我们没有显示的声明一个类的父类的话,则此类继承于java.lang.Object类
>所有的Java类(除了java.lang.Object类)都直接或间接的继承于java.lang.Object类
>意味着,所有的java类具有java.lang.Object 类声明的功能。
方法:equals()/toString()/getClass()/hashCode()/clone()/
finalize()/wait()/notify()/notifyAll()
多态性( polymorphism)
理解:一个事物的多种形态
对象的多态性:父类的引用指向子类的对象
| Person p = new Man();
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----虚拟方法调用
| 在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
| 总结:多态是运行时行为 编译:看左边 ---父类 运行:看右边---子类
| 多态性只适用于方法,不适用于属性(编译和运行都看左边---父类)
使用前提
>类的继承关系
>方法的重写
常用关键字
this
>用来修饰属性、方法、构造器
>将this理解成当前对象
>使用"this.属性"和"this.方法"来调用当前对象的属性和方法
>在类的构造器中,可以使用"this(形参列表)",来调用本类中指定的其他构造器
>不能通过"this(形参列表)"来调用自己
>规定:"this(形参列表)"必须声明在当前构造器的首行
>在构造器内部,最多只能有一个"this(形参列表)"
>在类中,有n个构造器时,此时最多调用n-1个“this(形参列表)”
super:父类的
可以用来调用属性、方法、构造器
使用
>可以在子类的方法或构造器当中,使用“super.属性”或“super.方法”的方式,显示的调用父类中声明的属性和方法
| 例如在子类中声明了与父类同名的属性时,使用“super.属性”来显示调用父类中声明的属性
| 在子类中有重写的方法的情况时,想调用父类中被重写的方法,使用“super.方法”来显示调用父类中被重写的方法
在类的构造器当中,可以使用“super(形参列表)”来调用父类中对应的构造器
规定:
>"super(形参列表)"必须声明在当前构造器的首行
>我们在类的构造器中,“this(形参列表)”和“super(形参列表)”只能二选一
>在构造器中的首行没有显示调用“this(形参列表)”或“super(形参列表)”时,系统会默认有一个“super()”
>在类的多个构造器中,至少有一个构造器中使用了“super(形参列表)”,来调用父类中的构造器
static:静态的
static可以用来修饰:属性、方法、代码块、内部类
使用static修饰属性:静态变量(或类变量)
>属性,按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
>实例变量:我们创建了类 的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的被修改
>静态属性:我们创建了类的多个对象,多个对象 共享同一个静态属性。当通过某一个对象修改静态属性时,会导致其他对象调用此静态属性时,是修改过的。
static修饰属性的其他说明
>静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
>静态变量的加载要早于对象的创建。
>由于类只会加载一次,则静态变量在内存中也只会 存在一份:存在方法区的静态域中。
>静态变量(类变量)能够被 类和对象 调用; 实例变量能只能被 对象 调用
使用static修饰方法:
>随着类的加载而加载,可以通过“类.静态方法”来进行调用
>静态方法能被 类和对象 调用; 非静态方法只能被对象调用
> 静态方法中,只能 调用静态方法或属性; 非静态方法中,既可以调用非静态的方法和属性,也可以调用静态的方法和属性
注意点:
>静态方法中,不能使用this关键字、super关键字
>关于静态属性和静态方法的使用,从生命周期的角度去理解
在以下情况中使用static修饰属性或方法
>属性是可以被多个对象所共享的,不会随着对象的不同而不同
>操作静态属性的方法,通常设置为static的
>工具类中的方法,习惯上生命为static的。比如:Math、Arrays、Collections
final:最终的
final可以用来修饰的结构:类、方法、变量
修饰类:此类就不能被其他类继承 格式:权限修饰符 final 类名{} 例:public final String{}
修饰方法:此方法不能被重写 格式:权限修饰符 final 返回值类型 方法名(){} 例:public final void fun(){}
修饰变量:此时“变量”就称为是一个常量
>修饰属性:可以考虑赋值的位置有:显示初始化、非静态代码块中、构造器中
>修饰局部变量:尤其在final修饰形参时,表明形参是一个常量,当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内使用形参,但不能进行重新赋值。
static final 用来修饰:属性(全局属性)、方法;
abstract 抽象的
可以用来修饰类、方法
修饰类(抽象类)
>格式:缺省/public abstract class 类名{}
>抽象类不能实例化
>抽象类中一定有构造器,便于子类实例化时调用
>开发中,都会提供抽象类的子类,让子类对象实例化,完成相关操作
修饰方法(抽象方法)
>格式:public/protected/缺省 abstract 访问修饰符 方法名(形参列表);
>抽象方法只有方法的声明,没有方法体
>包含抽象方法的类一定是抽象类,反之,抽象类中不一定有抽象方法。
>子类只有重写了父类中(抽象类)所有的抽象方法,才可以实例化
> 若是子类没有重写父类中的所有抽象方法,则子类也是抽象类,需要用abstract修饰
注意点
>abstract不能修饰属性、构造器等结构
>abstract不能修饰私有(private)方法、静态(static)方法、final修饰的方法、final修饰的类
interface(接口)
java中,接口和类是并列的两个结构
如何定义接口:定义接口中的成员
JDK7以前: 只能定义全局常量和抽象方法
| >全局常量:public static final定义的属性 但是书写时,可以省略不写
| >抽象方法:public abstract定义的方法 但是书写时,可以省略不写
JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
| 静态方法:public static void method1(){ System.out.println("method1");}
| 默认方法:public default void method2(){ System.out.println("method2");}
接口中不能定义构造器,意味着接口不能实例化
Java开发中,接口通过让类去实现
>如果实现类覆盖了接口中所有的抽象方法,则次实现类就可以实例化
>如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为抽象类
Java类可以实现多个接口 --->弥补了Java单继承性的局限性
>格式:class AA extends BB implements CC,DD,EE{}
接口和接口之间可以继承,而且可以多继承
如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
| 格式:调用父类:super.方法 调用接口:接口.super.方法
| 例如:super.method3(); //父类中的方法
| NewFeature.super.method3();//接口中的 默认方法
| NewFeature1.super.method3();//接口中的默认方法
接口中的静态方法只能通过接口调用
通过实现类的对象,可以调用接口中的默认方法
>如果子类(实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法--->类优先原则
>如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么实现类在没有重写此方法的情况下,系统会报错。--->接口冲突
这就需要我们必须在实现类中重写此方法
package
>为了更好的实现项目中类的管理,提供包的概念
>使用package声明类或接口所属的包,声明在源文件的首行
>包,属于标识符,遵循标识符命名规则、规范(xxxyyyzzz小写)、“见名知意”
>每 " . "一次,就代表一层文件目录
>同一个包下 ,不能命名同名的接口、类··········
import(导入)
>在源文件中显示的使用import结构导入指定包下的类、接口
>声明在包的声明和类的声明之间
>如果需要导入多个结构,则并列写出即可
可以使用"xxx.*"的方式,表示导入xxx包下的所有结构
| 例:可以使用"java.util..*"的方式,一次性导入util包下的所有类或接口
>如果使用的类或接口是java.lang包下定义的,则可以省略import结构
>如果使用的类或接口是本包定义的,则可以省略import结构
>如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示调用
>使用"xxx.*"方式表明可以调用xxx包下的所有结构,但是如果使用的是xxx子包下的结构,则仍需显示使用import关键字导入包
>import static组合使用:调用指定类或接口下的静态的属性或方法
| import static java.lang.System.*;表示可以使用System类下的静态的结构
| 例:可以使用"out.println("Hello World!");"
instanceof
>a instanceof A : 判断对象a是否为类A的实例。如果是,返回true, 如果不是,返回false
>使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。
如果a instanceof A返回true,则a instanceof B 也返回true
| 其中类B是类A的父类
①将属性进行私有化(private),通过公共方法(public)进行赋值和读取 ②不对外暴露的私有方法 ③单例模式 ......
继承性(extends)
好处
>减少了代码的冗余,提高了代码的复用性
>便于功能的扩展
>为多态性的使用,提供前提
格式
>class A extends B{}
| A:子类,派生类,subclass
| B:父类,超类,基类,super class
>一旦子类A继承父类B以后,A就获取了B中声明的所有的结构:属性,方法
>子类在继承以后,还可以声明自己特有的属性和方法:实现功能的扩展
>extends :延展 、 扩展
规定
>一个父类可以被多个子类继承:Java中的多层继承性
>一个子类只能有一个父类:Java中的单继承性
>子父类是相对概念的
>子类直接继承的父类,称为直接父类。间接继承的父类,称为间接父类
>子类继承父类以后,就获取了直接父类及所有间接父类中声明的属性和方法
Object类
>如果我们没有显示的声明一个类的父类的话,则此类继承于java.lang.Object类
>所有的Java类(除了java.lang.Object类)都直接或间接的继承于java.lang.Object类
>意味着,所有的java类具有java.lang.Object 类声明的功能。
方法:equals()/toString()/getClass()/hashCode()/clone()/
finalize()/wait()/notify()/notifyAll()
多态性( polymorphism)
理解:一个事物的多种形态
对象的多态性:父类的引用指向子类的对象
| Person p = new Man();
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----虚拟方法调用
| 在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
| 总结:多态是运行时行为 编译:看左边 ---父类 运行:看右边---子类
| 多态性只适用于方法,不适用于属性(编译和运行都看左边---父类)
使用前提
>类的继承关系
>方法的重写
常用关键字
this
>用来修饰属性、方法、构造器
>将this理解成当前对象
>使用"this.属性"和"this.方法"来调用当前对象的属性和方法
>在类的构造器中,可以使用"this(形参列表)",来调用本类中指定的其他构造器
>不能通过"this(形参列表)"来调用自己
>规定:"this(形参列表)"必须声明在当前构造器的首行
>在构造器内部,最多只能有一个"this(形参列表)"
>在类中,有n个构造器时,此时最多调用n-1个“this(形参列表)”
super:父类的
可以用来调用属性、方法、构造器
使用
>可以在子类的方法或构造器当中,使用“super.属性”或“super.方法”的方式,显示的调用父类中声明的属性和方法
| 例如在子类中声明了与父类同名的属性时,使用“super.属性”来显示调用父类中声明的属性
| 在子类中有重写的方法的情况时,想调用父类中被重写的方法,使用“super.方法”来显示调用父类中被重写的方法
在类的构造器当中,可以使用“super(形参列表)”来调用父类中对应的构造器
规定:
>"super(形参列表)"必须声明在当前构造器的首行
>我们在类的构造器中,“this(形参列表)”和“super(形参列表)”只能二选一
>在构造器中的首行没有显示调用“this(形参列表)”或“super(形参列表)”时,系统会默认有一个“super()”
>在类的多个构造器中,至少有一个构造器中使用了“super(形参列表)”,来调用父类中的构造器
static:静态的
static可以用来修饰:属性、方法、代码块、内部类
使用static修饰属性:静态变量(或类变量)
>属性,按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
>实例变量:我们创建了类 的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的被修改
>静态属性:我们创建了类的多个对象,多个对象 共享同一个静态属性。当通过某一个对象修改静态属性时,会导致其他对象调用此静态属性时,是修改过的。
static修饰属性的其他说明
>静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
>静态变量的加载要早于对象的创建。
>由于类只会加载一次,则静态变量在内存中也只会 存在一份:存在方法区的静态域中。
>静态变量(类变量)能够被 类和对象 调用; 实例变量能只能被 对象 调用
使用static修饰方法:
>随着类的加载而加载,可以通过“类.静态方法”来进行调用
>静态方法能被 类和对象 调用; 非静态方法只能被对象调用
> 静态方法中,只能 调用静态方法或属性; 非静态方法中,既可以调用非静态的方法和属性,也可以调用静态的方法和属性
注意点:
>静态方法中,不能使用this关键字、super关键字
>关于静态属性和静态方法的使用,从生命周期的角度去理解
在以下情况中使用static修饰属性或方法
>属性是可以被多个对象所共享的,不会随着对象的不同而不同
>操作静态属性的方法,通常设置为static的
>工具类中的方法,习惯上生命为static的。比如:Math、Arrays、Collections
final:最终的
final可以用来修饰的结构:类、方法、变量
修饰类:此类就不能被其他类继承 格式:权限修饰符 final 类名{} 例:public final String{}
修饰方法:此方法不能被重写 格式:权限修饰符 final 返回值类型 方法名(){} 例:public final void fun(){}
修饰变量:此时“变量”就称为是一个常量
>修饰属性:可以考虑赋值的位置有:显示初始化、非静态代码块中、构造器中
>修饰局部变量:尤其在final修饰形参时,表明形参是一个常量,当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内使用形参,但不能进行重新赋值。
static final 用来修饰:属性(全局属性)、方法;
abstract 抽象的
可以用来修饰类、方法
修饰类(抽象类)
>格式:缺省/public abstract class 类名{}
>抽象类不能实例化
>抽象类中一定有构造器,便于子类实例化时调用
>开发中,都会提供抽象类的子类,让子类对象实例化,完成相关操作
修饰方法(抽象方法)
>格式:public/protected/缺省 abstract 访问修饰符 方法名(形参列表);
>抽象方法只有方法的声明,没有方法体
>包含抽象方法的类一定是抽象类,反之,抽象类中不一定有抽象方法。
>子类只有重写了父类中(抽象类)所有的抽象方法,才可以实例化
> 若是子类没有重写父类中的所有抽象方法,则子类也是抽象类,需要用abstract修饰
注意点
>abstract不能修饰属性、构造器等结构
>abstract不能修饰私有(private)方法、静态(static)方法、final修饰的方法、final修饰的类
interface(接口)
java中,接口和类是并列的两个结构
如何定义接口:定义接口中的成员
JDK7以前: 只能定义全局常量和抽象方法
| >全局常量:public static final定义的属性 但是书写时,可以省略不写
| >抽象方法:public abstract定义的方法 但是书写时,可以省略不写
JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
| 静态方法:public static void method1(){ System.out.println("method1");}
| 默认方法:public default void method2(){ System.out.println("method2");}
接口中不能定义构造器,意味着接口不能实例化
Java开发中,接口通过让类去实现
>如果实现类覆盖了接口中所有的抽象方法,则次实现类就可以实例化
>如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为抽象类
Java类可以实现多个接口 --->弥补了Java单继承性的局限性
>格式:class AA extends BB implements CC,DD,EE{}
接口和接口之间可以继承,而且可以多继承
如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
| 格式:调用父类:super.方法 调用接口:接口.super.方法
| 例如:super.method3(); //父类中的方法
| NewFeature.super.method3();//接口中的 默认方法
| NewFeature1.super.method3();//接口中的默认方法
接口中的静态方法只能通过接口调用
通过实现类的对象,可以调用接口中的默认方法
>如果子类(实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法--->类优先原则
>如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么实现类在没有重写此方法的情况下,系统会报错。--->接口冲突
这就需要我们必须在实现类中重写此方法
package
>为了更好的实现项目中类的管理,提供包的概念
>使用package声明类或接口所属的包,声明在源文件的首行
>包,属于标识符,遵循标识符命名规则、规范(xxxyyyzzz小写)、“见名知意”
>每 " . "一次,就代表一层文件目录
>同一个包下 ,不能命名同名的接口、类··········
import(导入)
>在源文件中显示的使用import结构导入指定包下的类、接口
>声明在包的声明和类的声明之间
>如果需要导入多个结构,则并列写出即可
可以使用"xxx.*"的方式,表示导入xxx包下的所有结构
| 例:可以使用"java.util..*"的方式,一次性导入util包下的所有类或接口
>如果使用的类或接口是java.lang包下定义的,则可以省略import结构
>如果使用的类或接口是本包定义的,则可以省略import结构
>如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示调用
>使用"xxx.*"方式表明可以调用xxx包下的所有结构,但是如果使用的是xxx子包下的结构,则仍需显示使用import关键字导入包
>import static组合使用:调用指定类或接口下的静态的属性或方法
| import static java.lang.System.*;表示可以使用System类下的静态的结构
| 例:可以使用"out.println("Hello World!");"
instanceof
>a instanceof A : 判断对象a是否为类A的实例。如果是,返回true, 如果不是,返回false
>使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。
如果a instanceof A返回true,则a instanceof B 也返回true
| 其中类B是类A的父类
>减少了代码的冗余,提高了代码的复用性 >便于功能的扩展 >为多态性的使用,提供前提
格式
>class A extends B{}
| A:子类,派生类,subclass
| B:父类,超类,基类,super class
>一旦子类A继承父类B以后,A就获取了B中声明的所有的结构:属性,方法
>子类在继承以后,还可以声明自己特有的属性和方法:实现功能的扩展
>extends :延展 、 扩展
规定
>一个父类可以被多个子类继承:Java中的多层继承性
>一个子类只能有一个父类:Java中的单继承性
>子父类是相对概念的
>子类直接继承的父类,称为直接父类。间接继承的父类,称为间接父类
>子类继承父类以后,就获取了直接父类及所有间接父类中声明的属性和方法
Object类
>如果我们没有显示的声明一个类的父类的话,则此类继承于java.lang.Object类
>所有的Java类(除了java.lang.Object类)都直接或间接的继承于java.lang.Object类
>意味着,所有的java类具有java.lang.Object 类声明的功能。
方法:equals()/toString()/getClass()/hashCode()/clone()/
finalize()/wait()/notify()/notifyAll()
多态性( polymorphism)
理解:一个事物的多种形态
对象的多态性:父类的引用指向子类的对象
| Person p = new Man();
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----虚拟方法调用
| 在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
| 总结:多态是运行时行为 编译:看左边 ---父类 运行:看右边---子类
| 多态性只适用于方法,不适用于属性(编译和运行都看左边---父类)
使用前提
>类的继承关系
>方法的重写
常用关键字
this
>用来修饰属性、方法、构造器
>将this理解成当前对象
>使用"this.属性"和"this.方法"来调用当前对象的属性和方法
>在类的构造器中,可以使用"this(形参列表)",来调用本类中指定的其他构造器
>不能通过"this(形参列表)"来调用自己
>规定:"this(形参列表)"必须声明在当前构造器的首行
>在构造器内部,最多只能有一个"this(形参列表)"
>在类中,有n个构造器时,此时最多调用n-1个“this(形参列表)”
super:父类的
可以用来调用属性、方法、构造器
使用
>可以在子类的方法或构造器当中,使用“super.属性”或“super.方法”的方式,显示的调用父类中声明的属性和方法
| 例如在子类中声明了与父类同名的属性时,使用“super.属性”来显示调用父类中声明的属性
| 在子类中有重写的方法的情况时,想调用父类中被重写的方法,使用“super.方法”来显示调用父类中被重写的方法
在类的构造器当中,可以使用“super(形参列表)”来调用父类中对应的构造器
规定:
>"super(形参列表)"必须声明在当前构造器的首行
>我们在类的构造器中,“this(形参列表)”和“super(形参列表)”只能二选一
>在构造器中的首行没有显示调用“this(形参列表)”或“super(形参列表)”时,系统会默认有一个“super()”
>在类的多个构造器中,至少有一个构造器中使用了“super(形参列表)”,来调用父类中的构造器
static:静态的
static可以用来修饰:属性、方法、代码块、内部类
使用static修饰属性:静态变量(或类变量)
>属性,按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
>实例变量:我们创建了类 的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的被修改
>静态属性:我们创建了类的多个对象,多个对象 共享同一个静态属性。当通过某一个对象修改静态属性时,会导致其他对象调用此静态属性时,是修改过的。
static修饰属性的其他说明
>静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
>静态变量的加载要早于对象的创建。
>由于类只会加载一次,则静态变量在内存中也只会 存在一份:存在方法区的静态域中。
>静态变量(类变量)能够被 类和对象 调用; 实例变量能只能被 对象 调用
使用static修饰方法:
>随着类的加载而加载,可以通过“类.静态方法”来进行调用
>静态方法能被 类和对象 调用; 非静态方法只能被对象调用
> 静态方法中,只能 调用静态方法或属性; 非静态方法中,既可以调用非静态的方法和属性,也可以调用静态的方法和属性
注意点:
>静态方法中,不能使用this关键字、super关键字
>关于静态属性和静态方法的使用,从生命周期的角度去理解
在以下情况中使用static修饰属性或方法
>属性是可以被多个对象所共享的,不会随着对象的不同而不同
>操作静态属性的方法,通常设置为static的
>工具类中的方法,习惯上生命为static的。比如:Math、Arrays、Collections
final:最终的
final可以用来修饰的结构:类、方法、变量
修饰类:此类就不能被其他类继承 格式:权限修饰符 final 类名{} 例:public final String{}
修饰方法:此方法不能被重写 格式:权限修饰符 final 返回值类型 方法名(){} 例:public final void fun(){}
修饰变量:此时“变量”就称为是一个常量
>修饰属性:可以考虑赋值的位置有:显示初始化、非静态代码块中、构造器中
>修饰局部变量:尤其在final修饰形参时,表明形参是一个常量,当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内使用形参,但不能进行重新赋值。
static final 用来修饰:属性(全局属性)、方法;
abstract 抽象的
可以用来修饰类、方法
修饰类(抽象类)
>格式:缺省/public abstract class 类名{}
>抽象类不能实例化
>抽象类中一定有构造器,便于子类实例化时调用
>开发中,都会提供抽象类的子类,让子类对象实例化,完成相关操作
修饰方法(抽象方法)
>格式:public/protected/缺省 abstract 访问修饰符 方法名(形参列表);
>抽象方法只有方法的声明,没有方法体
>包含抽象方法的类一定是抽象类,反之,抽象类中不一定有抽象方法。
>子类只有重写了父类中(抽象类)所有的抽象方法,才可以实例化
> 若是子类没有重写父类中的所有抽象方法,则子类也是抽象类,需要用abstract修饰
注意点
>abstract不能修饰属性、构造器等结构
>abstract不能修饰私有(private)方法、静态(static)方法、final修饰的方法、final修饰的类
interface(接口)
java中,接口和类是并列的两个结构
如何定义接口:定义接口中的成员
JDK7以前: 只能定义全局常量和抽象方法
| >全局常量:public static final定义的属性 但是书写时,可以省略不写
| >抽象方法:public abstract定义的方法 但是书写时,可以省略不写
JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
| 静态方法:public static void method1(){ System.out.println("method1");}
| 默认方法:public default void method2(){ System.out.println("method2");}
接口中不能定义构造器,意味着接口不能实例化
Java开发中,接口通过让类去实现
>如果实现类覆盖了接口中所有的抽象方法,则次实现类就可以实例化
>如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为抽象类
Java类可以实现多个接口 --->弥补了Java单继承性的局限性
>格式:class AA extends BB implements CC,DD,EE{}
接口和接口之间可以继承,而且可以多继承
如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
| 格式:调用父类:super.方法 调用接口:接口.super.方法
| 例如:super.method3(); //父类中的方法
| NewFeature.super.method3();//接口中的 默认方法
| NewFeature1.super.method3();//接口中的默认方法
接口中的静态方法只能通过接口调用
通过实现类的对象,可以调用接口中的默认方法
>如果子类(实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法--->类优先原则
>如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么实现类在没有重写此方法的情况下,系统会报错。--->接口冲突
这就需要我们必须在实现类中重写此方法
package
>为了更好的实现项目中类的管理,提供包的概念
>使用package声明类或接口所属的包,声明在源文件的首行
>包,属于标识符,遵循标识符命名规则、规范(xxxyyyzzz小写)、“见名知意”
>每 " . "一次,就代表一层文件目录
>同一个包下 ,不能命名同名的接口、类··········
import(导入)
>在源文件中显示的使用import结构导入指定包下的类、接口
>声明在包的声明和类的声明之间
>如果需要导入多个结构,则并列写出即可
可以使用"xxx.*"的方式,表示导入xxx包下的所有结构
| 例:可以使用"java.util..*"的方式,一次性导入util包下的所有类或接口
>如果使用的类或接口是java.lang包下定义的,则可以省略import结构
>如果使用的类或接口是本包定义的,则可以省略import结构
>如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示调用
>使用"xxx.*"方式表明可以调用xxx包下的所有结构,但是如果使用的是xxx子包下的结构,则仍需显示使用import关键字导入包
>import static组合使用:调用指定类或接口下的静态的属性或方法
| import static java.lang.System.*;表示可以使用System类下的静态的结构
| 例:可以使用"out.println("Hello World!");"
instanceof
>a instanceof A : 判断对象a是否为类A的实例。如果是,返回true, 如果不是,返回false
>使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。
如果a instanceof A返回true,则a instanceof B 也返回true
| 其中类B是类A的父类
>一个父类可以被多个子类继承:Java中的多层继承性 >一个子类只能有一个父类:Java中的单继承性 >子父类是相对概念的 >子类直接继承的父类,称为直接父类。间接继承的父类,称为间接父类 >子类继承父类以后,就获取了直接父类及所有间接父类中声明的属性和方法
Object类
>如果我们没有显示的声明一个类的父类的话,则此类继承于java.lang.Object类
>所有的Java类(除了java.lang.Object类)都直接或间接的继承于java.lang.Object类
>意味着,所有的java类具有java.lang.Object 类声明的功能。
方法:equals()/toString()/getClass()/hashCode()/clone()/
finalize()/wait()/notify()/notifyAll()
多态性( polymorphism)
理解:一个事物的多种形态
对象的多态性:父类的引用指向子类的对象
| Person p = new Man();
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----虚拟方法调用
| 在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
| 总结:多态是运行时行为 编译:看左边 ---父类 运行:看右边---子类
| 多态性只适用于方法,不适用于属性(编译和运行都看左边---父类)
使用前提
>类的继承关系
>方法的重写
常用关键字
this
>用来修饰属性、方法、构造器
>将this理解成当前对象
>使用"this.属性"和"this.方法"来调用当前对象的属性和方法
>在类的构造器中,可以使用"this(形参列表)",来调用本类中指定的其他构造器
>不能通过"this(形参列表)"来调用自己
>规定:"this(形参列表)"必须声明在当前构造器的首行
>在构造器内部,最多只能有一个"this(形参列表)"
>在类中,有n个构造器时,此时最多调用n-1个“this(形参列表)”
super:父类的
可以用来调用属性、方法、构造器
使用
>可以在子类的方法或构造器当中,使用“super.属性”或“super.方法”的方式,显示的调用父类中声明的属性和方法
| 例如在子类中声明了与父类同名的属性时,使用“super.属性”来显示调用父类中声明的属性
| 在子类中有重写的方法的情况时,想调用父类中被重写的方法,使用“super.方法”来显示调用父类中被重写的方法
在类的构造器当中,可以使用“super(形参列表)”来调用父类中对应的构造器
规定:
>"super(形参列表)"必须声明在当前构造器的首行
>我们在类的构造器中,“this(形参列表)”和“super(形参列表)”只能二选一
>在构造器中的首行没有显示调用“this(形参列表)”或“super(形参列表)”时,系统会默认有一个“super()”
>在类的多个构造器中,至少有一个构造器中使用了“super(形参列表)”,来调用父类中的构造器
static:静态的
static可以用来修饰:属性、方法、代码块、内部类
使用static修饰属性:静态变量(或类变量)
>属性,按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
>实例变量:我们创建了类 的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的被修改
>静态属性:我们创建了类的多个对象,多个对象 共享同一个静态属性。当通过某一个对象修改静态属性时,会导致其他对象调用此静态属性时,是修改过的。
static修饰属性的其他说明
>静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
>静态变量的加载要早于对象的创建。
>由于类只会加载一次,则静态变量在内存中也只会 存在一份:存在方法区的静态域中。
>静态变量(类变量)能够被 类和对象 调用; 实例变量能只能被 对象 调用
使用static修饰方法:
>随着类的加载而加载,可以通过“类.静态方法”来进行调用
>静态方法能被 类和对象 调用; 非静态方法只能被对象调用
> 静态方法中,只能 调用静态方法或属性; 非静态方法中,既可以调用非静态的方法和属性,也可以调用静态的方法和属性
注意点:
>静态方法中,不能使用this关键字、super关键字
>关于静态属性和静态方法的使用,从生命周期的角度去理解
在以下情况中使用static修饰属性或方法
>属性是可以被多个对象所共享的,不会随着对象的不同而不同
>操作静态属性的方法,通常设置为static的
>工具类中的方法,习惯上生命为static的。比如:Math、Arrays、Collections
final:最终的
final可以用来修饰的结构:类、方法、变量
修饰类:此类就不能被其他类继承 格式:权限修饰符 final 类名{} 例:public final String{}
修饰方法:此方法不能被重写 格式:权限修饰符 final 返回值类型 方法名(){} 例:public final void fun(){}
修饰变量:此时“变量”就称为是一个常量
>修饰属性:可以考虑赋值的位置有:显示初始化、非静态代码块中、构造器中
>修饰局部变量:尤其在final修饰形参时,表明形参是一个常量,当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内使用形参,但不能进行重新赋值。
static final 用来修饰:属性(全局属性)、方法;
abstract 抽象的
可以用来修饰类、方法
修饰类(抽象类)
>格式:缺省/public abstract class 类名{}
>抽象类不能实例化
>抽象类中一定有构造器,便于子类实例化时调用
>开发中,都会提供抽象类的子类,让子类对象实例化,完成相关操作
修饰方法(抽象方法)
>格式:public/protected/缺省 abstract 访问修饰符 方法名(形参列表);
>抽象方法只有方法的声明,没有方法体
>包含抽象方法的类一定是抽象类,反之,抽象类中不一定有抽象方法。
>子类只有重写了父类中(抽象类)所有的抽象方法,才可以实例化
> 若是子类没有重写父类中的所有抽象方法,则子类也是抽象类,需要用abstract修饰
注意点
>abstract不能修饰属性、构造器等结构
>abstract不能修饰私有(private)方法、静态(static)方法、final修饰的方法、final修饰的类
interface(接口)
java中,接口和类是并列的两个结构
如何定义接口:定义接口中的成员
JDK7以前: 只能定义全局常量和抽象方法
| >全局常量:public static final定义的属性 但是书写时,可以省略不写
| >抽象方法:public abstract定义的方法 但是书写时,可以省略不写
JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
| 静态方法:public static void method1(){ System.out.println("method1");}
| 默认方法:public default void method2(){ System.out.println("method2");}
接口中不能定义构造器,意味着接口不能实例化
Java开发中,接口通过让类去实现
>如果实现类覆盖了接口中所有的抽象方法,则次实现类就可以实例化
>如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为抽象类
Java类可以实现多个接口 --->弥补了Java单继承性的局限性
>格式:class AA extends BB implements CC,DD,EE{}
接口和接口之间可以继承,而且可以多继承
如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
| 格式:调用父类:super.方法 调用接口:接口.super.方法
| 例如:super.method3(); //父类中的方法
| NewFeature.super.method3();//接口中的 默认方法
| NewFeature1.super.method3();//接口中的默认方法
接口中的静态方法只能通过接口调用
通过实现类的对象,可以调用接口中的默认方法
>如果子类(实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法--->类优先原则
>如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么实现类在没有重写此方法的情况下,系统会报错。--->接口冲突
这就需要我们必须在实现类中重写此方法
package
>为了更好的实现项目中类的管理,提供包的概念
>使用package声明类或接口所属的包,声明在源文件的首行
>包,属于标识符,遵循标识符命名规则、规范(xxxyyyzzz小写)、“见名知意”
>每 " . "一次,就代表一层文件目录
>同一个包下 ,不能命名同名的接口、类··········
import(导入)
>在源文件中显示的使用import结构导入指定包下的类、接口
>声明在包的声明和类的声明之间
>如果需要导入多个结构,则并列写出即可
可以使用"xxx.*"的方式,表示导入xxx包下的所有结构
| 例:可以使用"java.util..*"的方式,一次性导入util包下的所有类或接口
>如果使用的类或接口是java.lang包下定义的,则可以省略import结构
>如果使用的类或接口是本包定义的,则可以省略import结构
>如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示调用
>使用"xxx.*"方式表明可以调用xxx包下的所有结构,但是如果使用的是xxx子包下的结构,则仍需显示使用import关键字导入包
>import static组合使用:调用指定类或接口下的静态的属性或方法
| import static java.lang.System.*;表示可以使用System类下的静态的结构
| 例:可以使用"out.println("Hello World!");"
instanceof
>a instanceof A : 判断对象a是否为类A的实例。如果是,返回true, 如果不是,返回false
>使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。
如果a instanceof A返回true,则a instanceof B 也返回true
| 其中类B是类A的父类
>如果我们没有显示的声明一个类的父类的话,则此类继承于java.lang.Object类 >所有的Java类(除了java.lang.Object类)都直接或间接的继承于java.lang.Object类 >意味着,所有的java类具有java.lang.Object 类声明的功能。 方法:equals()/toString()/getClass()/hashCode()/clone()/ finalize()/wait()/notify()/notifyAll()
多态性( polymorphism)
理解:一个事物的多种形态
对象的多态性:父类的引用指向子类的对象
| Person p = new Man();
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----虚拟方法调用
| 在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
| 总结:多态是运行时行为 编译:看左边 ---父类 运行:看右边---子类
| 多态性只适用于方法,不适用于属性(编译和运行都看左边---父类)
使用前提
>类的继承关系
>方法的重写
常用关键字
this
>用来修饰属性、方法、构造器
>将this理解成当前对象
>使用"this.属性"和"this.方法"来调用当前对象的属性和方法
>在类的构造器中,可以使用"this(形参列表)",来调用本类中指定的其他构造器
>不能通过"this(形参列表)"来调用自己
>规定:"this(形参列表)"必须声明在当前构造器的首行
>在构造器内部,最多只能有一个"this(形参列表)"
>在类中,有n个构造器时,此时最多调用n-1个“this(形参列表)”
super:父类的
可以用来调用属性、方法、构造器
使用
>可以在子类的方法或构造器当中,使用“super.属性”或“super.方法”的方式,显示的调用父类中声明的属性和方法
| 例如在子类中声明了与父类同名的属性时,使用“super.属性”来显示调用父类中声明的属性
| 在子类中有重写的方法的情况时,想调用父类中被重写的方法,使用“super.方法”来显示调用父类中被重写的方法
在类的构造器当中,可以使用“super(形参列表)”来调用父类中对应的构造器
规定:
>"super(形参列表)"必须声明在当前构造器的首行
>我们在类的构造器中,“this(形参列表)”和“super(形参列表)”只能二选一
>在构造器中的首行没有显示调用“this(形参列表)”或“super(形参列表)”时,系统会默认有一个“super()”
>在类的多个构造器中,至少有一个构造器中使用了“super(形参列表)”,来调用父类中的构造器
static:静态的
static可以用来修饰:属性、方法、代码块、内部类
使用static修饰属性:静态变量(或类变量)
>属性,按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
>实例变量:我们创建了类 的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的被修改
>静态属性:我们创建了类的多个对象,多个对象 共享同一个静态属性。当通过某一个对象修改静态属性时,会导致其他对象调用此静态属性时,是修改过的。
static修饰属性的其他说明
>静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
>静态变量的加载要早于对象的创建。
>由于类只会加载一次,则静态变量在内存中也只会 存在一份:存在方法区的静态域中。
>静态变量(类变量)能够被 类和对象 调用; 实例变量能只能被 对象 调用
使用static修饰方法:
>随着类的加载而加载,可以通过“类.静态方法”来进行调用
>静态方法能被 类和对象 调用; 非静态方法只能被对象调用
> 静态方法中,只能 调用静态方法或属性; 非静态方法中,既可以调用非静态的方法和属性,也可以调用静态的方法和属性
注意点:
>静态方法中,不能使用this关键字、super关键字
>关于静态属性和静态方法的使用,从生命周期的角度去理解
在以下情况中使用static修饰属性或方法
>属性是可以被多个对象所共享的,不会随着对象的不同而不同
>操作静态属性的方法,通常设置为static的
>工具类中的方法,习惯上生命为static的。比如:Math、Arrays、Collections
final:最终的
final可以用来修饰的结构:类、方法、变量
修饰类:此类就不能被其他类继承 格式:权限修饰符 final 类名{} 例:public final String{}
修饰方法:此方法不能被重写 格式:权限修饰符 final 返回值类型 方法名(){} 例:public final void fun(){}
修饰变量:此时“变量”就称为是一个常量
>修饰属性:可以考虑赋值的位置有:显示初始化、非静态代码块中、构造器中
>修饰局部变量:尤其在final修饰形参时,表明形参是一个常量,当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内使用形参,但不能进行重新赋值。
static final 用来修饰:属性(全局属性)、方法;
abstract 抽象的
可以用来修饰类、方法
修饰类(抽象类)
>格式:缺省/public abstract class 类名{}
>抽象类不能实例化
>抽象类中一定有构造器,便于子类实例化时调用
>开发中,都会提供抽象类的子类,让子类对象实例化,完成相关操作
修饰方法(抽象方法)
>格式:public/protected/缺省 abstract 访问修饰符 方法名(形参列表);
>抽象方法只有方法的声明,没有方法体
>包含抽象方法的类一定是抽象类,反之,抽象类中不一定有抽象方法。
>子类只有重写了父类中(抽象类)所有的抽象方法,才可以实例化
> 若是子类没有重写父类中的所有抽象方法,则子类也是抽象类,需要用abstract修饰
注意点
>abstract不能修饰属性、构造器等结构
>abstract不能修饰私有(private)方法、静态(static)方法、final修饰的方法、final修饰的类
interface(接口)
java中,接口和类是并列的两个结构
如何定义接口:定义接口中的成员
JDK7以前: 只能定义全局常量和抽象方法
| >全局常量:public static final定义的属性 但是书写时,可以省略不写
| >抽象方法:public abstract定义的方法 但是书写时,可以省略不写
JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
| 静态方法:public static void method1(){ System.out.println("method1");}
| 默认方法:public default void method2(){ System.out.println("method2");}
接口中不能定义构造器,意味着接口不能实例化
Java开发中,接口通过让类去实现
>如果实现类覆盖了接口中所有的抽象方法,则次实现类就可以实例化
>如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为抽象类
Java类可以实现多个接口 --->弥补了Java单继承性的局限性
>格式:class AA extends BB implements CC,DD,EE{}
接口和接口之间可以继承,而且可以多继承
如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
| 格式:调用父类:super.方法 调用接口:接口.super.方法
| 例如:super.method3(); //父类中的方法
| NewFeature.super.method3();//接口中的 默认方法
| NewFeature1.super.method3();//接口中的默认方法
接口中的静态方法只能通过接口调用
通过实现类的对象,可以调用接口中的默认方法
>如果子类(实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法--->类优先原则
>如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么实现类在没有重写此方法的情况下,系统会报错。--->接口冲突
这就需要我们必须在实现类中重写此方法
package
>为了更好的实现项目中类的管理,提供包的概念
>使用package声明类或接口所属的包,声明在源文件的首行
>包,属于标识符,遵循标识符命名规则、规范(xxxyyyzzz小写)、“见名知意”
>每 " . "一次,就代表一层文件目录
>同一个包下 ,不能命名同名的接口、类··········
import(导入)
>在源文件中显示的使用import结构导入指定包下的类、接口
>声明在包的声明和类的声明之间
>如果需要导入多个结构,则并列写出即可
可以使用"xxx.*"的方式,表示导入xxx包下的所有结构
| 例:可以使用"java.util..*"的方式,一次性导入util包下的所有类或接口
>如果使用的类或接口是java.lang包下定义的,则可以省略import结构
>如果使用的类或接口是本包定义的,则可以省略import结构
>如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示调用
>使用"xxx.*"方式表明可以调用xxx包下的所有结构,但是如果使用的是xxx子包下的结构,则仍需显示使用import关键字导入包
>import static组合使用:调用指定类或接口下的静态的属性或方法
| import static java.lang.System.*;表示可以使用System类下的静态的结构
| 例:可以使用"out.println("Hello World!");"
instanceof
>a instanceof A : 判断对象a是否为类A的实例。如果是,返回true, 如果不是,返回false
>使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。
如果a instanceof A返回true,则a instanceof B 也返回true
| 其中类B是类A的父类
课程笔记
课程:尚硅谷宋红康老师的java入门课
END



