//本人觉得重点的部分会用不同颜色标出
-
抽象类
1.抽象类的由来
父类中的方法,如果所有子类都要重写,那么此时父类的方法体就失去了意义
那么我们可以把方法体去掉,只留方法的声明,这种只有方法声明没有方法实现的方法称为抽象方法
含有抽象方法的类一定是抽象类
2.抽象方法的格式;
public abstract 返回值类型 方法名(参数列表);
3.抽象类的格式:
public abstract class 类名{....}
4.抽象类怎么用??*************
a.抽象类不是用来创建对象的!!不能创建对象!!!
b.天生就是做爹的,用来被子类继承的!!!
子类继承了抽象类,那么必须重写抽象类中所有的抽象方法,否则子类还是一个抽象类
5.注意事项:
a.抽象类是不能创建对象的!!!
b.抽象类是有构造方法,是给子类的构造方法调用的
(子类所有构造中都有默认使用super()调用父类的无参构造)
c.抽象类不一定包含抽象方法,但是包含抽象方法的类一定是抽象类
(抽象类可以有也可以没有抽象方法)
d.抽象类子类 必须 重写所有抽象方法,否则子类还是一个抽象类
- 抽象类中可以定义成员变量,成员方法,构造方法,抽象方法
- 定义抽象类和抽象方法的关键字是abstract
- 子类继承抽象类必须重写所有的抽象方法,否则子类还是一个抽象类,必须加上abstract
- "多态"时,左边可以写"抽象类"类型吗?
多态:
父类类型 变量名 = new 子类类型();
假设 Animal是抽象类 Dog 是子类,重写Animal中的所有抽象方法
多态:
Animal an = new Dog();
an.eat();//编译看父类 ,运行子类
多态的格式:
父类类型 变量名 = new 子类类型();
抽象类型类 变量名 = new 子类类型();
-
接口
1.什么是接口
专业:接口是方法的集合(接口中只有方法,没有普通的成员变量)
通俗:接口是一种极端的抽象类(在JDK1.7之前 所有的方法必须都是抽象方法)
(在JDK1.8时增加默认方法,静态方法)
(在JDK1.9时增加私有方法,了解即可)
2.定义接口的格式:
类: 使用关键字 class
枚举: 使用关键字enum
抽象类:使用abstract class
接口: 使用关键字interface
格式:
public interface 接口名{
//不能写普通的成员变量
//抽象方法(JDK1.7)
public abstract 返回值类型 方法名(参数列表);
//默认方法(JDK1.8)
public default 返回值类型 方法名(参数列表){
}
//静态方法(JDK1.8)
public static 返回值类型 方法名(参数列表){
}
//私有方法(忽略)
private 返回值类型 方法名(参数列表){
}
}
3.接口的使用**********
a.接口也是不能创建对象的
b.天生做爹的,给实现类 实现的!!!
实现类 实现(implements) 接口 (相当于子类 继承 抽象类)
public class 实现类 implements 接口{
a.实现类需要重写接口中所有的抽象方法,否则实现类变成一个抽象类
b.实现类可以选择性重写接口中默认方法
c.实现类对于接口的静态方法没有重写这种说法
d.实现类对于接口的私有方法没有重写这种说法
}
4.接口的多实现
一个实现类 可以 实现多个接口
格式:
public class 实现类 implements 接口1,接口2,接口3....{
//1.必须重写所有接口中的所有抽象方法
//2.可以选择性重写所有接口中的任何默认方法
//3.实现类对于接口的静态方法没有重写这种说法
//4.实现类对于接口的私有方法没有重写这种说法
}
有同名的方法的接口多实现
public class 实现类 implements 接口1,接口2,接口3....{
//1.如果多个接口有同名的抽象方法,实现类只需要重写一次
//2.如果多个接口中有同名的默认方法,实现类必须重写一次
//3.静态方法同名,没有问题,哪个接口调用静态方法,调用的就是那个接口中静态方法
//4.私有方法同名,更加没有问题,私有方法只能在当前接口中使用
}
5.继承和实现是两套机制
在实际开发中,一个类 继承 一个父类,同时实现多个接口
格式:
public class 类名 extends 父类 implements 接口1,接口2...{
//如果父类和接口都有相同的抽象方法,只需要写一次即可
//父类有一个方法和接口的默认方法重名,可以不重写,父类方法的优先级高
}
7.接口和接口之间多继承(了解即可)
格式:
public interface 子接口 extends 父接口1,父接口2...{
a.如果多个父接口中有相同抽象方法,子接口只有一个抽象方法
b.如果多个父接口中有相同的默认方法,子接口必须重写一次
c.私有和静态不需要关注
}
public class 类名 implements 子接口{
}
相当于
public class 类名 implements 父接口1,父接口2,...{
}
8.接口的其他成员
a.接口中无法定义变量,但是可以定义常量
必须使用三个修饰符修饰 public static final 数据类型 常量名 = 值;
三个修饰符可写可以不写,默认就有!!!!
b.接口中没有构造方法,也不能创建对象
c.接口中,没有静态代码块。
扩展面试题:
a.Java这么语言支持多继承吗??
如果是类与类 不支持多继承,只能单继承,但是可以多层继承
如果是接口与接口 支持多继承
如果是类和接口,称为实现,而且多实现
b.Java中的抽象类和接口的异同
相同点
a.都可以有抽象方法
b.都不能创建对象
c.都可以有静态方法和私有方法
d.子类继承或者实现后都必须重写所有的抽象方法(如果有)
不同点
a.关键字不一样 abstract class 和 interface
b.抽象类可以有普通的变量 接口只能有常量
c.抽象类可以有正常方法,接口只能是默认方法
d.抽象类支持单继承,接口支持多实现
e.抽象类有构造,接口无构造
f.抽象类有静态代码块,接口无静态代码块
g.从思想层面上
抽象类 定义共性内容
接口 定义额外扩展功能
//练习
计算某个图形的面积和周长; // 具体要求如下: // 1.所有图形都有面积和周长,计算的方式不同 // 2.正方形周长为: 边长*4; 正方形的面积为: 边长*边长 // 正方形的面积和周长只与边长相关 // 3.圆形的周长为: 2*π*半径; 圆形的面积为: π*半径*半径 // 圆形的面积和周长只与半径相关 // (PI的值可以使用Math类中的常量值Math.PI或者3.14);
接口
interface Graph {
//周长
public abstract void perimeter();
//面积
public abstract void area();
}
圆形
public class Cricle implements Graph{
//圆形
double banjing; //英语不太好,用拼音代替了,见谅
public Cricle(){}
public Cricle(double banjing){
this.banjing = banjing;
}
@Override
public void perimeter() {
System.out.println("半径为"+banjing +"的圆形的半径为" + banjing*2*Math.PI);
}
@Override
public void area() {
System.out.println("半径为"+banjing+"的圆形的面积为" + banjing * banjing * Math.PI);
}
}
正方形
public class Square implements Graph{
double bianchang; //英文不太好用拼音代替了,见谅
public Square(){}
public Square(double bianchang){
this.bianchang = bianchang;
}
@Override
public void perimeter() {
System.out.println("边长为"+bianchang+"的正方形的周长是"+4*bianchang);
}
@Override
public void area() {
System.out.println("边长为"+bianchang+"的正方形的面积是"+bianchang*bianchang);
}
//正方形
}
主方法
public class TestDemo {
public static void main(String[] args) {
Square s = new Square(2.5);
s.perimeter();
s.area();
Cricle c = new Cricle(2.5);
c.perimeter();
c.area();
}
}