一、抽象方法
概念:只有方法的声明,没有方法实现,并用关键字abstract来修饰的方法,就是抽象方法
语法: 访问修饰符 abstract 返回值类型 方法名称(参数列表);
例子:public abstract void showInfo (int age);
作用:简化方法的编写
注意点:抽象方法必须写在抽象类中
使用场景:抽象方法一般定义在父类中,用于给子类进行重写
二、抽象类
概念:使用abstract关键字修饰的类就是抽象类
语法:访问修饰符 abstract class 类名{}
例子:public abstract class Fu{}
成员:1.成员变量 2.构造方法 3. 静态方法 4. 成员方法 5. 抽象方法
说明:
抽象类是不能实例化对象的
抽象类中构造方法一般用于给子类进行调用
抽象方法一定是在抽象类中 但是抽象类中不一定都是抽象方法 可以有其他方法
如果父类为抽象类 子类就必须实现父类中所有的抽象方法
除非子类也是抽象类就可以不实现
抽象类与抽象方法的关系:
抽象方法必须在抽象类中
抽象方法可以有其他的成员方法 不止抽象方法
抽象类使用场景:抽象类一般用作于父类
三、案例
需求:
分析:
代码:
员工类
package com.qf.text.text01;
public abstract class Emp {
//定义私有属性
private String name;
private int noId;
private double pay;
//定义构造方法
public Emp() {
}
public Emp(String name, int noId, double pay) {
this.name = name;
this.noId = noId;
this.pay = pay;
}
//定义get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNoId() {
return noId;
}
public void setNoId(int noId) {
this.noId = noId;
}
public double getPay() {
return pay;
}
public void setPay(double pay) {
this.pay = pay;
}
//定义抽象方法work
public abstract void work();
}
程序员类
package com.qf.text.text01;
public class Coder extends Emp {
//定义私有属性
private double money;
//定义构造方法
public Coder() {
}
public Coder(String name, int noId, double pay, double money) {
super(name, noId, pay);
this.money = money;
}
//定义get和set方法
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
//重写work方法
@Override
public void work() {
System.out.println("正在撸代码");
}
}
测试员工类
package com.qf.text.text01;
public class Tester extends Emp {
//定义构造方法
public Tester() {
}
public Tester(String name, int noId, double pay) {
super(name, noId, pay);
}
//重写work方法
@Override
public void work() {
System.out.println("测试软件");
}
}
项目经理类
package com.qf.text.text01;
public class ProjectManager extends Emp {
//定义私有属性
private double money;
//定义构造方法
public ProjectManager() {
}
public ProjectManager(String name, int noId, double pay, double money) {
super(name, noId, pay);
this.money = money;
}
//定义get和set方法
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
//重写work方法
@Override
public void work() {
System.out.println("提交项目");
}
}
测试类
package com.qf.text.text01;
public class Test {
public static void main(String[] args) {
//使用多态方法实例化对象
Emp e1 = new Coder("程序员",0001,13000,3000);
e1.work();
Emp e2 = new Tester("测试员",0002,12000);
e2.work();
Emp e3 = new ProjectManager("项目经理",0003,13000,5000);
e3.work();
}
}
四、接口的定义
1.开发中的接口就类似生活中的接口 就是定义一个规范和约束条件
2.规范:就是定义一些抽象方法
3.关键字:interface
4.接口编译之后也是一个.class文件 Class对象
5.语法:
访问修饰符 interface 接口的名称{
抽象方法()
}
6.例子: public interface Inner {}
7.成员:
A. 接口中变量都是静态常量 默认使用 public static final 来进行修饰
B.接口中的方法:默认使用public abstract 来进行修饰
a.在jdk1.8之前 接口中只能有抽象方法
b.在jdk1.8之后 接口中可以有抽象方法 静态方法 默认的方法(使用default修饰的方法)
c.在jdk1.9之后可以有私有的方法
C.接口中没有构造方法
8.注意点:
接口中没有构造方法
接口不能实例化对象
接口一般用于来约束实现类 用于提供给实现类来实现接口的(实现规范)
五、实现类
1.概念:实现接口的类就是实现类
2.分类:
单实现:只实现一个接口
多实现:同时实现多个接口
3.单实现:
语法: 访问修饰符 class 类名 implments 接口名称{}
例子:public class Impl implents Inner{}
原则:实现类必须实现接口中所有的抽象方法(实现类是抽象方法就可以不实现)
4.多实现:
语法:访问修饰符 class 类名 implments 接口名称1,接口实现2{}
例子:public class Impl implments Inner1,Inner2{}
原则:实现类必须实现接口中所有的抽象方法
注意点:如果多个接口中定义同名的抽象方法 的时候 实现类只需要实现接口重名的一个方法就可以了
六、案例
需求
分析
代码
package com.qf.text.text02;
public interface USBInterface {
//定义抽象方法
void star();//开启
void close();//关闭
}
package com.qf.text.text02;
public class Mouse implements USBInterface {
@Override
public void star() {
System.out.println("鼠标开启");
}
@Override
public void close() {
System.out.println("鼠标关闭");
}
}
package com.qf.text.text02;
public class KeyBoard implements USBInterface {
@Override
public void star() {
System.out.println("键盘开启");
}
@Override
public void close() {
System.out.println("键盘关闭");
}
}
package com.qf.text.text02;
public class NoteBook {
//定义成员方法
public void star(){
System.out.println("笔记本开启");
}
//定义一个已USBInterface为参数的方法来控制鼠标和键盘的开启和关闭
public void use(USBInterface usb){
usb.star();
usb.close();
}
public void close(){
System.out.println("笔记本关闭");
}
}
package com.qf.text.text02;
import java.nio.file.attribute.UserDefinedFileAttributeView;
public class Test {
public static void main(String[] args) {
//实例化笔记本对象
NoteBook note = new NoteBook();
//开启笔记本
note.star();
//利用多态实例化一个鼠标对象
USBInterface usb1 = new Mouse();
//通过笔记本对象把鼠标对象当做参数传入方法中 开启鼠标 和关闭
note.use(usb1);
//利用多态实例化一个键盘对象
USBInterface usb2 = new KeyBoard();
//通过笔记本对象把键盘对象当做参数传入方法中 开启键盘 和关闭
note.use(usb2);
//关闭笔记本
note.close();
}
}
七、类与接口,类与类之间的关系
1.类与类:只能单继承,多层继承,不能多继承
2.类与接口:单实现,多实现
3.接口与接口:单继承,多继承,多层继承
八、案例
需求-分析:
代码:
package com.qf.test.test03;
public interface Pager {
//定义抽象方法
String getPager();
}
package com.qf.test.test03;
public class A4Pager implements Pager{
@Override
public String getPager() {
return "A4纸张";
}
}
package com.qf.test.test03;
public class A3Pager implements Pager{
@Override
public String getPager() {
return "A3纸张";
}
}
package com.qf.test.test03;
public interface Link {
String getLink();
}
package com.qf.test.test03;
public class WhiteLink implements Link {
@Override
public String getLink() {
return "白色墨盒";
}
}
package com.qf.test.test03;
public class ColorLink implements Link {
@Override
public String getLink() {
return "彩色墨盒";
}
}
package com.qf.test.test03;
public class Printer {
//定义私有的属性 数据类型为 引用数据类型中的接口
private Pager pager;
private Link link;
//定义构造方法给属性赋值 也可以使用get和set方法进行赋值
public Printer() {
}
public Printer(Pager pager, Link link) {
this.pager = pager;
this.link = link;
}
//定义成员方法调用实现类的方法
public void print(){
System.out.println(pager.getPager()+"\t"+link.getLink());
}
}
package com.qf.test.test03;
public class Test {
public static void main(String[] args) {
//使用多态的方法实例化对象
//纸张
Pager p1 = new A3Pager();
Pager p2 = new A4Pager();
//墨盒
Link l1 = new WhiteLink();
Link l2 = new ColorLink();
//实例化打印机对象
Printer p = new Printer(p1,l1);
p.print();
Printer pri = new Printer(p2,l2);
pri.print();
Printer printer = new Printer(p1,l2);
printer.print();
}
}
九、代码块
1.概念:编写在大括号中的代码,就是代码块{代码}
2.分类:
局部代码块:
位置:定义在方法中
语法:{代码}
作用:用于限制变量的生命周期
说明:
在局部代码块定义的变量
在局部代码块里重新赋值后
在局部代码块外获取到的是改变后的值
构造代码块:
位置:定义在类中,方法外
语法:{代码}
作用:用于给成员变量赋值
说明:
构造代码块是由jvm执行的
构造代码块优先与构造方法执行
每次实例化对象都会执行构造代码块
静态代码块:
位置:定义在类中 方法外
语法:static{代码}
作用:用来加载一次配置文件 因为配置文件都只有加载一次如 jdbc配置文件 lo4j配置文件
说明:
静态代码块优先与构造方法执行
静态代码块可以给静态变量赋值
静态代码块只在类加载的时候执行一次