一.final
final(最终态) 修饰我们的成员方法、成员变量、类
1.final 特点:
修饰变量:该变量的值,不能被修改,必须初始化(手动赋值)
修饰方法:该方法,不能被重写
修饰类:该类,不能被继承
2.final修饰的局部变量
基本数据类型:final修饰的基本数据类型的值不能够被修改的;
引用数据类型:final修饰的引用数据类型引用类型地址不能够发生变化的,但是引用类型的
地址里面的成员属性值是可以发生变化的。
二.static
static 翻译中文“静态”的意思,可以修饰成员方法、成员变量。
static 修饰的特点:被类的所有对象共享访问。
1.static访问特点
非静态成员方法
1.能够访问静态的成员变量;
2.能够访问非静态的成员变量;
3.能够访问静态的成员方法;
4.能够访问非静态的成员方法;
2.静态的成员方法
1.能够访问静态成员变量,但是不能够直接访问非静态成员变量
2.能够访问静态的成员方法,但是不能够直接访问非静态成员方法
3.static关键字的用途
一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。
显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
static可以用来修饰类的成员方法、类的成员变量,另外也可以编写static代码块来优化程序性能
4.static关键字的应用场景
static关键字的应用场景,java中的常量(Constant)。
java中的常量(Constant) 单独类 定义 |接口形式()
三.main
1.main方法的深入理解
深入理解main方法 public static void main(String[] args)
1、 main方法是Java虚拟机在调用
2、Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public (因为调用的时候java虚拟机和main方法不在同一个类)
3、java虚拟机执行main方法的时候不必创建对象,所以该方法必须是static
4、main方法接受String类型的数组参数,该数组中保存执行java命令时传递给所执行的类的参数
2.main方法的注意事项
1.可以直接访问本类的静态成员
2.访问本类的非静态成员,需要先创建对象,再调用即可
四.多态
多态是面向对象三大特征之一
1.多态的概述
同一个对象,在不同的时刻表现出来的不同形态
举例子: 狗
狗就是狗 狗 dog =new 狗();
我们也可以说 动物 animal =new 狗();
这里狗在不同的时刻表现出不同的形态,这就是多态。
多态的前提和体现
1.有继承/实现关系;
2.方法重写
3.有父类引用指向子类对象
2.多态的访问特点
成员变量:编译看左边,执行看左边;
成员方法:编译看左边,执行看右边;
为什么成员变量和成员方法的访问不一样呢?
这是因为 成员方法有重写、而成员变量是没有的。
3.多态的优点和缺点
多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
多态的弊端:不能使用子类的特有功能
4.多态中的的转型
1.向上转型(多态机制)
从子到父
父类引用指向子类对象
2.向下转型(强转)
从父到子
父类引用转为子类对象
五.抽象类
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类和抽象方法用abstract关键字来修饰
抽象类: abstract class 类名{}
抽象方法: pubic abstract void eat();//抽象方法中没有方法体
1.抽象类特点
1.抽象类中不一定有抽象方法,但是有抽象方法的类必须为抽象类;
2.抽象类不能实例化;
3.抽象类由具体的子类进行实例化;
4.子类必须对父类(抽象类)中的所有抽象方法进行重写
5.在抽象类中可以定义非抽象方法
6.子类如果不重写抽象类中的抽象方法,则该类还是为抽象类
7.抽象类中可以有构造方法,用于子类访问父类时的数据初始化;
2.abstract
abstract关键字不能和哪些关键字共存
private 冲突 abstract的方法必须被子类重写,而private不能被继承
final 冲突 final修饰的方法,变量都不能修改,而abstract修饰的方法必须被重写
static 不能共存 无意义 static 是静态的,abstract方法中无方法体,无法调用。
3.接口特点
什么是接口:
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中的接口更多的体现在对行为的抽象!
1.接口 用关键字interface 修饰
public interface 接口名{}
2.类实现接口用 implements 表示
public class 类 implements 接口 {}
3.接口不能够实例化
接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
多态的形式:具体类多态,抽象类多态,接口多态。
4.多态的前提:有继承或者实现关系;有方法重写;有父(类/接口引用)指向(子/实现)类对象
5.接口的实现类,要么重写接口中所有的抽象方法、要么是抽象类
4.接口成员特点
1、成员变量只能是常量;(直接通过接口名称访问即可)
默认修饰符 public static final
2、成员方法只能是抽象方法;(JDK8开始 是可以在接口中定义非抽象方法 是需要加上default关键字修饰)
默认修饰符 public abstract
3、接口没有构造方法;
因为接口主要对行为进行抽象,没有具体存在,一个类如果没有父类,默认继承自Object类
5.猫和狗(接口版本)
需求:对猫和狗进行训练,他们就可以跳高了,这里加入了跳高功能,请采用抽象类和接口来实现猫和狗的案例。
(1)定义跳高接口(JumpInterface)
成员方法:跳高();—jump();
(2)定义动物类抽象类(Animal)实现跳高接口
成员变量:姓名、年龄;
构造方法:无参、带参
成员方法:get/set方法,吃饭();—eat();
(3)定义猫类(Cat),继承动物类Animal
构造方法:无参、带参
成员方法:重写eat(),重写跳高jump();
(4)定义狗类(Dog),继承动物类Animal
构造方法:无参、带参
成员方法:重写eat(),重写跳高jump();
6.类和接口的区别
1.类和类的继承关系 (一个类只能够单继承一个父类 不能够多继承n多个不同的父类 )
继承关系,只能单继承,但是可以多层继承
2.类和接口的实现关系(一个类可以实现n多个不同的接口)
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
3.接口和接口继承的关系(一个接口是可以继承n多个不同的接口的)
继承关系,可以单继承,也可以多继承
7.抽象类和接口的区别
1.成员区别
1.1抽象类 变量.常量;有构造方法;有抽象方法,也有非抽象方法
1.2接口常量,抽象方法(JDK8 在接口中定义 非抽象方法)
2.关系区别
2.1类与类 继承单继承
2.2类与接口 实现,单实现和多实现
3.3接口与接口 继承,单继承和多继承
3.设计区别
抽象类 对类抽象,包括属性行为(对事物的抽象)
接口 对行为抽象,主要是行为(对行为的抽象)
举个例子:门和报警器,将门设为抽象类,
行为:关门 开门 报警
门 -----盼盼门 美心 …
不是所有的品牌门 都带 报警
比如 盼盼门 关门 开门 报警
美心门 关门 开门没有 报警
门–抽象类
8.instanceof 关键字:
instanceof 通过返回一个布尔值来指出,某个对象是否是某个特定类或者是该特定类的子类的一个实例。
1.如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。class可以是类,可以是接口。
2.instanceof在Java的编译状态和运行状态是有区别的:
2.1在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
2.2在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。 (大致就是判断表达式:class 变量=(class)object的引用 是否成立)。
六.内部类
就是在一个类中定义一个类,就是为内部类。
比如:在一个类A的内部定义一个类B,类B就被称为内部类,类A相应的称为外部类
1.内部类定义格式
2.内部类访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
3.内部类的分类
成员内部类
静态内部类
方法内部类
匿名内部类
4.成员内部类
按照内部类在类中定义的位置不同,可以分为如下两种格式:
1.成员位置(成员内部类 例如:静态内部类)
2.局部位置(局部内部类 例如:匿名内部类 )
成员内部类,外界如何创建对象使用呢?
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
范例:MayiktA.MayiktB mayiktB = new MayiktA().new MayiktB();
在实际开发中是不会这样使用的。因为一般内部类就是不让外界直接访问的。
成员内部的常见修饰符 private 为了保证数据的安全性
5.静态内部类
有static关键字修饰的内部类为静态内部类;
静态内部类访问外部类的静态成员变量或方法必须是静态的。
访问格式: new MayiktA.MayiktB()
6.局部内部类
局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
7.匿名内部类 new 接口(实现类)或者是抽象类(子类)
本质:是一个继承了该类(子类)或者实现了该接口的(实现类)匿名对象。
8.匿名内部类开发中使用场景
使用匿名类 可以不用创建我们的实现类 animal