3/3day02_final_static_接口
回顾(封装,继承)
能够写出类的继承格式
public class 子类 extends 父类{
}
能够说出Java继承的特点
a.单继承(一个子类只能有一个父类,一个父类可以有多个子类)
b.多层继承(一个子类可以有一个父类,该父类也可以有自己的父类)
能够说出子类调用父类的成员特点
如果子父类中有同名的成员变量/成员方法,根据Java就近原则,优先调用子类自己成员
如果子父类中不同名的成员变量/成员方法,根据变量或者方法名字调用,不存在歧义
构造方法,a.父类的构造子类无法继承 b.在子类的任何构造第一行,默认调用父类的无参构造,super()
能够说出方法重写的概念
方法重载(overload): 在同一个类中,方法名一样的,参数列表不一样
方法重写(override): 在继承关系中,子类中有一个和父类除了方法体(权限修饰符),其他一模一样的方法
能够说出this可以解决的问题
在本类中使用:
this.xxx 访问本类的成员变量
this.xxx() 调用本类的成员方法
this(...) 调用本类的其他构造
能够说出super可以解决的问题
在子类中使用:
super.xxx 访问父类继承的成员变量
super.xxx() 调用父类继承的成员方法
super(...) 调用父类构造方法
描述抽象方法的概念
抽象方法: 只有方法的声明,没有方法的实现(加上关键字abstract)
抽象类: 含有抽象方法的类一定是一个抽象类
如果是一个抽象类,其中不一定含有抽象方法
写出抽象类的格式
public abstract class 抽象类名{
抽象方法
正常方法
}
写出抽象方法的格式
public abstract void 抽象方法名();
能够说出父类抽象方法的存在意义
抽象类的意义: 给其他子类继承的,为子类提供模板(模板设计模式)
抽象方法的意义: 要求子类必须重写(如果不重写,子类还是一个抽象类)
今日内容
- final关键字
- static
- 接口
今日思维导图

final 关键字(被final修饰的变量名一般都是全大写并且用下划线相隔)
final和abstract关键字冲突,被final修饰的类天生做子类, 被abstract修饰的类,天生做父类
使用方式
- 修饰类 (不能修饰抽象类)
被final修饰的类, 不能做父类
- 修饰方法 (不能修饰抽象方法)
被fina修饰的方法, 不能被重写
- 修饰变量
1.修饰局部变量- 基本类型
被final修饰的基本类型变量, 该变量只能赋值一次
2.修饰局部变量- 引用类型
被final修饰的引用类型变量, 该变量中保存的地址值只要被赋值一次,就不能再更改
如下代码:
final Dog d = new Dog();//此 d 中保存有创建对象的地址值
d.age = 20;//不报错, 没有改变变量 d 的赋值
d.name = "旺财"; //不报错, 没有改变变量 d 的赋值
d = new Dog()//报错, 被final修饰的 d 在创建对象的时候就已经保存了地址值, 无法重新赋值新的地址值
3.修饰成员变量
被final的成员变量, 必须进行赋值且只能赋值一次
赋值有两种方式
a.定义赋值
b.构造方法中给该成员变量赋值
final 修饰的成员变量, 必须在创建对象之前有值
static
概述
类变量/静态变量
使用 static关键字修饰的成员变量。
static是静态修饰符,一般修饰成员变量/成员方法.被修饰的成员称之为静态成员/类成员
被 static 修饰的成员, 不属于任何一个对象, 属于整个类, 被所有对象共享
每次创建一个对象时候, 被static 修饰的成员变量不会出现在这个对象内部, 但是可以被该对象使用
只要类加载到方法区中, 被静态修饰的成员变量就已经出现在方法区里的静态区中

类方法/静态方法
静态方法也叫类方法, 由static修饰的方法
直接通过类名可以直接调用.无需通过对象调用
静态与非静态之间的相互访问
静态成员变量
静态成员方法
与类是同级, 只要类加载到内存, 静态的成员变量/成员方法就存在(对象不一定存在)
非静态成员变量
非静态成员方法
必须创建对象之后才能访问/调用
静态出现的比非静态的早
- 静态方法调用的注意事项:
1.静态方法可以直接访问类变量和静态方法。
2.静态方法不能直接访问普通成员变量或成员方法。成员方法可以直接访问类变量或静态方法。
3.静态方法中,不能使用this关键字。
静态方法只能访问静态成员。静态方法没有重写这种概念. 子类和父类有 相同方法的时候 称之为隐藏
建议调用格式
静态成员变量
对象名.静态成员变量 [可以访问,但是不建议]
类名.静态成员变量 [建议的方式]
静态的成员方法
对象名.静态成员方法 [可以访问,但是不建议]
类名.静态成员方法 [建议的方式]
接口(重要)
概述(所有基本都是public)
-
什么是接口:(和类是同级的)
是一种引用类型, 接口是方法的集合(接口中主要写方法,而类中除了方法还有成员变量等) -
定义格式
定义类: class
定义接口: interface
定义枚举: enum
定义注解: @interface
格式:
public interface 接口名{
//抽象方法[JDK7]
//默认方法和静态方法[JDK8]
//私有方法和私有静态方法[JDK9]
}
接口中的方法默认用public修饰, 所以可以省去
1.(抽象方法)只有接口中的抽象方法 可以省略关键字 public abstract
2.(默认方法)接口中不允许有正常方法,默认方法修饰为 default
3.(静态方法)使用关键字 static
接口的使用
1.和抽象类相似, 不能创建对象
2.接口也是作为 父接口 使用, 用于被其他类"实现"的(实现类似于继承)
3.继承 使用关键字 extends. 实现 使用关键字 implements
使用方式:
public class 实现类 implements 接口{
}
注意
1.实现类中必须重写所有接口中的抽象方法
2.可以选择性重写默认方法, 如果重写,把重写方法中就不能再加default关键字
3.静态方法通过类名/接口名直接调用, 没有重写这种说法
接口的多实现
- 格式
public class 实现类 implements 接口1,接口2,..{
}
-
接口中不同方法,在实现类中的操作
1.抽象方法
接口中,有多个抽象方法时,实现类必须重写所有抽象方法。如果抽象方法有重名的,只需要重写一次
2.默认方法
接口中,有多个默认方法时,实现类都可继承使用。如果默认方法有重名的,必须重写一次。
3.静态方法
接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。 -
实现和继承的优先级问题
一个类 可以在继承一个父类的同时,实现多个接口
格式
public class 子类/实现类 extends 父类 implements 接口1,接口2{
}
继承的优先级高于实现.
先 extends 再 implements
如果父类正常方法和接口类中默认方法重名了, 子类/实现类中不用重写该方法, 会根据优先级调用父类中正常方法. 如果在子类中重写了, 那么在测试类中通过子类对象会优先调用子类方法
接口的多继承(了解)
类和类之间:单继承
类和接口之间:多实现
接口和接口之间:多继承
接口和接口之间格式如下:
public interface MyInter extents Inter1,Inter2{
//MyInter 接口保护了Inter2接口的所有东西
}
接口中其他成员特点
- 接口中,无法定义成员变量,但是可以定义常量(字面值常量)或其值不可以改变,默认使用public static final修饰(可省略,但是具有)。
如
public static final 数据类型 常量名(大写下划线隔开) = 常量值;
- 接口中,没有构造方法,不能创建对象。
- 接口中,没有静态代码块。