抽象类
(01)抽象类:被 abstract 关键字修饰类。
public abstract class Person {}
理解:用来表示现实生活中抽象的【图纸】或【模板】。
(02)成员变量:概念和具体类中一样。
(03)成员方法:概念和具体类中一样。
(04) 构造方法 :概念和具体类中一样。
(05) 抽象方法:被abstract关键字修饰、没有方法体的方法。
public abstract void m1(int a, double b);
public abstract boolean m2(char c, int[] d);
(06) 抽象类 中有构造方法、但是不能创建对象 。
原因:抽象类是一个抽象的概念,比如一个“图形类”,就是一个抽象概念,不像长方形类、圆形类可以确定成员变量。
疑问:抽象类写完了、却不能创建对象、那抽象类有什么用?答:继承 。
(07)继承:子类通过 extends 关键字继承父类、父类中的所有成员子类都会自动继承下来。
// 父类
public abstract class A {
int x = 100;
public void m() {
System.out.println(200);
}
}
// 类B继承类A
// 子类
public class B extends A {
public static void main(String[] args) {
A a = new A();
System.out.println(a.x);
a.m();
B b = new B();
System.out.println(b.x);
b.m();//m方法没有返回值,所以直接对象.调用就好
}
}
具体类 可以继承 具体类
具体类 可以继承 抽象类 最常用
抽象类 可以继承 具体类
抽象类 可以继承 抽象类
(08)抽象类就是为了继承
原因:抽象类父类负责设计、具体类子类负责实现。
思想:先设计、再实现。
public abstract class Calculate {
public abstract int add1(int a,int b);
public abstract int add2(int a,int b);
public abstract int add3(int a,int b);
}
public class addExtend extends Calculate{
@Override
public int add1(int a, int b) {
return a+b;
}
@Override
public int add2(int a, int b) {
return a-b;
}
@Override
public int add3(int a, int b) {
return a*b;
}
}
(09)创建对象的语法句式
类名 变量 = new 类构造方法
父类 变量 = new 子类构造方法
public abstract class Car {
public abstract void driver();
}
public class BMW extends Car{
@Override
public void driver() {
System.out.println("驾驶 宝马汽车 ");
}
public static void main(String[] args) {
bmw bmw = new BMW();
bmw.driver();
Car bmw2 = new BMW();
bmw2.driver();
}
}
(10)继承体系中父类子类之间的类型转换
子类型赋值给父类型没问题(向上转型)
public class Audi extends Car{
public static void main(String[] args) {
Audi audi = new Audi();
Car audi2 = audi;//子类型赋值给父类型没问题
audi2.driver();
}
}
父类型赋值给子类型需要强制类型转换 (向下转型)
public class Audi extends Car{
public static void main(String[] args) {
Car audi = new Audi();
Audi audi1 = (Audi) audi;//父类型赋值给子类型需要强制类型转换
audi1.driver();
}
}
(11)static静态关键字
前提条件:能够区别类和对象。
被static修饰的属于类、通过”类名.成员”的方式来调用。
public class E {
static int a = 2;
static void m1(){
System.out.println(3);
}
public static void main(String[] args) {
System.out.println(E.a);
E.m1();
}
}
不被static修饰的属于对象、 通过”对象.成员”的方式来调用
public class E {
int b = 5;
void m2(){
System.out.println(8);
}
public static void main(String[] args) {
E e = new E();
System.out.println(e.b);
e.m2();
}
}
静态成员可以被所有对象共享使用。(不推荐)
(12)可见性修饰符:4个范围3个关键字
private 私有的 当前类
默认的 当前类+包
protected 保护的 当前类+包+外包子类
public 公共的 都可见
public abstract class Person {
String name;
int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public abstract void m1(int a, double b);
public abstract boolean m2(char c, int[] d);
}
抽象类习题
第一题考点:抽象类、继承
创建长5宽3长方形对象、求周长、求面积。
创建半径4圆对象、求周长、求面积。
解析:需要创建一个图形的抽象类,这个抽象类中的成员变量要适用于所有的图形,所以不能把单独的图形的成员变量放在抽象类中。
//抽象图形类:所有图形的父类
public abstract class TuXing {
//成员变量:所有子类都有的属性
//求图形周长方法
public abstract void m1();
//求图形面积方法
public abstract void m2();
}
public class ChangFangXing extends TuXing{
Integer length;
Integer width;
public ChangFangXing() {
}
public ChangFangXing(Integer length, Integer width) {
this.length = length;
this.width = width;
}
public Integer getLength() {
return length;
}
public void setLength( Integer length) {
this.length = length;
}
public Integer getWidth() {
return width;
}
public void setWidth(Integer width) {
this.width = width;
}
@Override
public String toString() {
return "ChangFangXing{" +
"length=" + length +
", width=" + width +
'}';
}
@Override
public void m1() {
System.out.println(2*(width+length));
}
@Override
public void m2() {
System.out.println(width*length);
}
}
public static void main(String[] args) {
ChangFangXing changFangXing = new ChangFangXing(9,2);
changFangXing.m1();
changFangXing.m2();
}
第二题考点:抽象类、继承、数组
解析:根据合同员工和计时员工可以知道,员工的名字是员工类的公共变量
创建员工抽象类:
public abstract class Employees {
String name;
public Employees() {
}
public Employees(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract int getTotalWage();//获得工资的方法
@Override
public String toString() {
return "Employees{" +
"name='" + name + '\'' +
'}';
}
}
(1)创建合同员工(名字、工资)
Emp e1 = new Emp(“张三”, 3000);
Emp e2 = new Emp(“李四”, 4000);
public class Emp extends Employees{
Integer wage;
public Emp() {
}
@Override
public int getTotalWage() {
return wage;
}
public Emp(Integer wage) {
this.wage = wage;
}
public Emp(String name, Integer wage) {
super(name);
this.wage = wage;
}
public Integer getWage() {
return wage;
}
public void setWage(Integer wage) {
this.wage = wage;
}
@Override
public String toString() {
return "Emp{" +
"wage=" + wage +
", name='" + name + '\'' +
'}';
}
}
(2)创建计时员工(名字、工时、工时费)
Mem m1 = new Mem(“小王”, 50, 100);
Mem m2 = new Mem(“小李”, 50, 70);
public class Mem extends Employees{
Integer hour;
Integer hourWage;
public Mem() {
}
@Override
public int getTotalWage() {
return hour*hourWage;
}
public Mem(Integer hour, Integer hourWage) {
this.hour = hour;
this.hourWage = hourWage;
}
public Mem(String name, Integer hour, Integer hourWage) {
super(name);
this.hour = hour;
this.hourWage = hourWage;
}
public Integer getHour() {
return hour;
}
public void setHour(Integer hour) {
this.hour = hour;
}
public Integer getHourWage() {
return hourWage;
}
public void setHourWage(Integer hourWage) {
this.hourWage = hourWage;
}
@Override
public String toString() {
return "Mem{" +
"name='" + name + '\'' +
", hour=" + hour +
", hourWage=" + hourWage +
'}';
}
}
(3)把4个员工对象添加到员工数组中?
public static void main(String[] args) {
Emp emp1 = new Emp("张三", 3000);
Emp emp2 = new Emp("李四", 4000);
Mem mem1 = new Mem("小王", 50, 100);
Mem mem2 = new Mem("小李", 50, 70);
Employees[] arr = {emp1,emp2,mem1,mem2};
}
(4)求员工数组中所有员工的工资是多少?
①在父类中定义一个计算工资的抽象方法,每个员工类必须实现这个方法
public abstract int getTotalWage();//获得工资的方法
②在每个员工的具体类中实现父类的方法
@Override
public int getTotalWage() {
return wage;
}
@Override
public int getTotalWage() {
return hour*hourWage;
}
③测试求员工数组中所有员工的工资
public static void main(String[] args) {
Emp emp1 = new Emp("张三", 3000);
Emp emp2 = new Emp("李四", 4000);
Mem mem1 = new Mem("小王", 50, 100);
Mem mem2 = new Mem("小李", 50, 70);
Employees[] arr = {emp1,emp2,mem1,mem2};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum+=arr[i].getTotalWage();//调用方法
}
System.out.println(sum);
}