1.static关键字(特殊的访问方式)
特点:1)随着类的加载而加载;
2)优先于对象存在(不能和this共存);
3)被静态修饰的可以被多个对象共享;
4)被静态修饰的变量,方法(静态变量,静态方法)
注意事项:静态只能访问静态
静态成员的访问方式: 类名.变量 类名.方法名()
2.代码块(使用{}包裹起来的内容)
分类:局部代码块 :在方法定义中使用 ;作用:限定局部变量的生命周期
构造代码块:在类的成员位置(类中,方法外),使用{}包裹起来;作用:给类中的一些成员进行数据初始化
静态代码块(静态代码块只加载一次): 在类的成员位置,直接使用 static{},特点:随着类的加载而加载,优先于对象存在;
优先级: 静态代码块> 构造代码块 > 构造方法
3.继承(将多个类的将多个类的共性内容抽取到一个独立的类中,然后这多个类和独立的这个类产生一种继承的关系)(关键字extends)
特点:
1)类与类之间的关系,继承关系,只支持单继承
格式 class 子类名 extends 父类名{}
2)不支持多继承,但支持多层继承
好处:
1)提高代码的维护性!
2)提高代码的复用性!
继承中,每一个成员变量的关系问题
成员变量(遵循一个原则:就近原则)
a)子类继承父类,如果子类中的成员变量名称和父类的成员变量名称不一致,分别访问;
b)子类继承父类,如果子类的成员变量名称和父类的成员变量名称一致:
1)首先在子类的局部位置找,是否存在局部变量名称,如果有,就使用
2)如果没有,就在子类的成员位置找,是否存在这个变量,如果有,就使用
3)如果在子类的成员位置中没有找到,直接在父类的成员位置中找,如果有,就使用
4)如果父类的成员位置都没有,那就没有这个变量,就会报错
继承中构造方法的访问(子类的所有构造方法都会间接访问父类的无参构造方法):
子类继承父类,子类的所有的构造方法的第一句话:super() 都会默认的访问父类的无参方法
如果父类中的无参构造方法没有,子类就会报错
解决方式:
方式1:手动给出父类的无参构造方法
方式2:在子类的构造方法中的第一句话:通过super(xxx),间接的访问父类的有参构造方法
方式3: 在子类的有参构造方法中通过 this() 来访问本类的无参构造方法,然后在子类的无参构造方法中间通过super(xxx)来访问父类的有参构造方法
4.this和super的区别
this:代表的当前类对象的地址值引用
super:代表的父类对象的地址值引用(代表父类的空间标识)
访问成员变量
this.变量名; 访问的本类中的成员变量
super.变量名; 访问的是父类的成员变量
访问构造方法:
this() ; 访问本类的无参构造方法
super() ;访问的父类的无参构造方法
this(xxx);访问的本类的有参构造方法
super(xxx);访问的父类的有参构造方法
成员方法:
this.方法名();访问的是本类的成员方法
super.方法名() ;访问的是父类的成员方法
5.方法重写(子类出现了和父类一模一样的方法声明)
区别方法重载: 在一个类中,提供n多个功能,这些功能,方法名相同,参数列表不同,与返回值无关(目的:提高某个功能的扩展性)
参数列表不同: 1)类型不同 2)个数不同3)先后顺序
注意:当前子类继承父类的时候,如果存在方法重写,子类重写父类该方法访问权限不能更低(要么一致,要么带上public)
方法重写的目的:子类有自己的功能,需要将父类的该功能覆盖掉
6.final 状态修饰符(不想让子类重写父类的功能)
特点:
1)可以修饰类,该类不能被继承
2)可以修饰符3)可以修饰的变量,这个变量此时是一个常量成员方法,成员方法不能重写 (自定义常量)
7.多态(一个事物在不同时刻的不同形态)
前提条件:1)存在继承关系2)存在方法重写3)父类引用指向子类对象 (格式: Fu fu = new Zi() )
多态的成员访问特点:
1)针对成员变量的访问 编译看左,运行看左
2)针对多态中的成员方法(非静态)的访问 编译看左,运行看右
3)成员方法是静态方法的访问 编译看左,运行看左
4)构造方法
存在继承关系: 需要让父类先初始化,再让子类进行数据初始化(分层初始化)
好处:1)提高代码的复用性:由继承保证
2)提高了代码的扩展性:由多态保证 (重点)
多态的方式:使用向下转型(父类访问子类)
要使用向下转型,前提必须有父类引用指向子类对象 Fu f = new Zi() ;
遵循向下转型的格式:Zi z = (Zi)f;
向下转型使用不当会出现 java.lang.ClassCastException:类转换异常
8.抽象类(将某个事物中的一些功能仅仅给出声明,没有方法体)(关键字abstract)
抽象类的格式:abstract class 类名{}
抽象方法的格式: 权限修饰符(一般为public) abstract 返回值类型 方法名(形式参数列表)
特点:
1)有抽象方法的类一定是抽象类
2)抽象类中不一定只有抽象方法 ,还可以非抽象方法(有方法体)
3)抽象类不能实例化(创建对象) (需要通过具体的子类进行实例化)
抽象多态的形式 Fu fu = new Zi()
注意:abstract和final,static,private关键字冲突
抽象类成员特点:
成员变量
既可定义变量,也可定义常量:被final修饰
成员方法
既可定义为抽象方法,也可定义为非抽象方法
如果定义为抽象方法:关键字abstract(显示给出)
构造方法
存在无参构造/有参构造方法 目的:分层初始化
9.接口(就是体现一个现实世界事物所具有的的额外的扩展功能)
格式: interface 接口名{}
接口中的方法:隐藏public abstract关键字,只能是抽象方法,没有方法体
特点:
1)不能实例化(不能创建对象)
2)通过接口的子实现类(前提是具体类)进行实例化
接口的成员特点:
1)接口中的成员方法:只能是抽象方法,默认的修饰符:public abstract(可以省略)
2)接口没有构造方法
3)接口的成员变量只能是常量;存在默认修饰符:public static final (可以省略)
10.类和接口的关系: implements 实现关系
一个类继承另一个类的同时,可以实现多个接口,中间需用逗号隔开
接口与接口之间: extends:继承关系
不仅支持单继承,也支持多继承
11.选择排序(使用0角标对应的元素依次和后面角标对应的元素进行比较,小的往前放,第一次比较完毕,最小值出现在最小索引处,依次这样比较)
for(int x = 0 ; x < arr.length-1 ; x ++){
for(int y = x + 1 ; y < arr.length ; y ++){
if(arr[y] < arr[x]){
int temp = arr[x] ;
arr[x] = arr[y] ;
arr[y] = temp ;
}
}
}
12.形式参数问题以及返回值问题:(引用类型)
1)方法的形式参数是类
具体类,调用该方法,实际参数需要传递当前具体类的对象
抽象类,调用该方法实际参数需要传递的抽象类的子类对象 (抽象类多态)
接口,调用该方式,实际参数需要传递的是当前接口的子实现类对象(接口多态)
2)方法的返回值是引用类型
具体类 :方法返回的就是当前具体类对象
抽象类 :需要返回的是抽象类的子类对象
接口:需要返回的是该接口的子实现类对象
13.权限修饰符
修饰的权限从小到大:私有修饰符private<默认修饰符<受保护的protected<public
14.内部类(在类A 中定义了类B,将类B就称为类A的内部类,而类A就是外部类)
注意:内部类可以访问外部类的成员,包括私有;如果当前成员内部类是静态的, 里面的方法无论是静态的还是非静态的,都只能访问外部类的静态成员,包括私有
1)外部类访问内部类的成员格式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
2)访问静态成员内部类的成员格式(将静态的成员内部类看成是外部类的静态成员访问):
外部类名.内部类名 对象名 = new 外部类名.内部类名()
访问静态成员内部类的静态方法格式:
外部类名.内部类名.方法名