目录
1、思维导图
2、static关键字
2.1作用
static关键字表示静态,可以作用于成员变量和成员方法
在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效,同时静态变量被类的所有对象共享
它的作用用一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。
2.2访问规则
静态方法不能调用非静态成员,编译会报错
被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。还可以通过对象来访问,但是比较麻烦,所以建议采用类名.静态方法的方式来调用该静态方法
public class Demo03 {
int a;
static int b;
public void aaa(){
}
public void bbb(){
System.out.println(a);
System.out.println(b);
aaa();
ccc();
}
public static void ccc(){
}
public static void ddd(){
//System.out.println(a);
System.out.println(b);
//aaa();
ccc();
}
}
在上述代码里,非静态方法bbb访问了非静态成员变量a,静态成员变量b,非静态成员方法aaa和静态方法ccc,没有任何问题。
但是用静态成员方法ddd调用相同的成员时,变量a和方法aaa会报异常,因为静态方法只能访问静态成员
3、接口
3.1格式
生活中有很多接口的例子,像鼠标键盘的usb接口,安卓手机的type—c接口,苹果手机的扁平接口,接口的存在,让我们的工具可以放在一起使用,因为接口为它们制定了一个标准。
java中的接口也是如此,制定了类和方法的标准,避免开发过程中因为各自想法不一样,而造成大家的代码无法联合的窘境
接口的格式和类相似:
public interface 接口名{
}
接口需要被实现,实现的时候需要用到implements关键字
public class 类名 implements 接口{
}
3.2规范
3.2.1常量
接口中只能存在常量,即使写的变量形式,系统默认的三个修饰符:public static final,也会将其改成常量
3.2.2方法
接口中只能存在抽象方法,接口中也存在默认的两个方法修饰符:public abstract
3.2.3哪些内容不能在接口中存在?
接口中不能创建对象,也不能有构造方法
3.2.4子类
接口的子类必须重写接口的抽象方法,或者子类是一个抽象类
3.3关系
3.3.1类与类
继承关系,单继承,支持多层继承,即一个类只能有一个父类,父类也可以有自己的父类,一个人只能有一个亲爹,亲爹也有自己的亲爹,也就是那个人的爷爷
3.3.2类与接口
实现关系,多实现,多层实现没有必要,即一个类可以实现多个接口,一个人可以有多个干爹,但是干爹之间没必要分清谁是谁干爹
3.3.3接口与接口
继承关系,多继承
public interface EEE extends AAA,BBB{}
4、多态
4.1条件
必须要有继承extends或者implements实现关系,如果没有这二者其中之一,那么多态也就不存在了
并且还要用父类引用指向子类对象
//动物类
public class Animal {
String name = "小头爸爸";
public void eat(){
System.out.println("爸爸吃馒头");
}
}
//猫
public class Cat extends Animal {
String name = "大头儿子";
public void eat(){
System.out.println("儿子吃牛肉");
}
}
public class Demo02 {
public static void main(String[] args) {
//成员变量:
//编译看左边(父类),运行看左边(父类)
//成员方法:
//编译看左边(父类),运行看右边(子类)
Animal a = new Cat();
System.out.println(a.name); //小头爸爸
a.eat(); //儿子吃牛肉
//继承
Cat c = new Cat();
System.out.println(c.name); //大头儿子
c.eat(); //儿子吃牛肉
}
}
4.2访问规则
成员变量:
编译看左边(父类),运行看左边(父类)
成员方法:
编译看左边(父类),运行看右边(子类)
4.3优缺点
缺点:不能访问子类的特有成员
优点:提高了代码的扩展性
4.4类型转换
自动转换
Cat c = new Cat();
Animal a = c;
强制转换
Cat c = (Cat)a;
在强制转换的时候,经常会出现ClassCastException的错误,这说明类型转换异常
解决办法:
对象 instanceof 类名
判断这个要转的对象是否属于后面的类型,如果是则会转,不是则不执行,也不影响其他对象被调用
if(a instanceof Cat){
Cat c = (Cat)a;
}
5、内部类
5.1成员内部类
(了解)
//外部类
public class AAA {
//成员变量
int a = 10;
//成员方法
public void eat(){
}
//成员内部类
class BBB{
}
}
5.2局部内部类
(了解)
格式:
package com.itheima04;
public class AAA2 {
public void show(){
//局部变量
int a = 10;
//局部内部类
class BBB{
}
}
}
5.3匿名内部类
Person p = new Person() {
@Override
public void eat() {
System.out.println("重写吃饭方法");
}
};