abstract 引出-案例 public class Demo1 { public static void main(String[] args) { Shape shape = new Shape();//对象 在现实生活中存在吗? 高度抽象的类 //在现实中 存在的对象都是其 子类的对象 } } abstract class Shape{ //图形类 // 以下的这两个方法 的方法实现 不写不行 写了没有 --> 尴尬 //抽象方法 public abstract double area(); public abstract double girth(); //非抽象方法 public void m(){ System.out.println("我是一个非抽象方法"); } //构造方法 public Shape(){ System.out.println("我是抽象类中的构造方法"); } } 概述 抽象的意思 可以修饰的内容 1、类 2、方法 抽象类 概念: 被 abstract 修饰的类称为抽象类 语法: public abstract class 抽象类类名{} 抽象方法 抽象⽅法 : 被abstract 修饰的⽅法 语法: 访问修饰符 abstract 返回值类型 ⽅法名(参数列表); abstract 访问修饰符 返回值类型 ⽅法名(参数列表); 特点 1、当⼀个类中存在抽象⽅法 那么这个类也必须是抽象的 2、⼀个抽象类中可以有抽象⽅法也可以有⾮抽象⽅法(抽象类中可以定义任何的成员 属性 构造方法 成员方法 抽象方法) 3、如果⼀个类继承了抽象类,这个类如果不想成为抽象类,那么这个类必须实现抽象类中的所有抽象⽅法 4、抽象类不能创建对象,但是可以声明引⽤,抽象类的对象是存在的,是由⼦类创建⼦类对象时调⽤⽗类构造⽅法创建的,是⽆法⾃⼰⼿动去new 抽象类的对象的 5、private 和 abstract 不同同时修饰方法 因为矛盾 特点-案例 //案例1: 关于特点3; public class Demo1 { public static void main(String[] args) { } } //定义一个抽象类 abstract class TestAbstract{ //构造方法 public TestAbstract() { System.out.println("我是抽象类中的构造方法"); } //定义抽象方法 public abstract void m1(); public abstract void m2(); //定义非抽象方法 public void m3(){ System.out.println("我是抽象类中的非抽象方法 m3"); } } //定义一个类 继承 抽象类 abstract class TestClass extends TestAbstract{ //当子类成为抽象类的时候 就没有必要去实现 m1 和 m2 这两个抽象方法了 } //案例2: 关于特点3 public class Demo1 { public static void main(String[] args) { TestClass testClass = new TestClass(); testClass.m3();//m3 非抽象方法被继承了 } } //定义一个抽象类 abstract class TestAbstract{ //构造方法 public TestAbstract() { System.out.println("我是抽象类中的构造方法"); } //定义抽象方法 public abstract void m1(); public abstract void m2(); //定义非抽象方法 public void m3(){ System.out.println("我是抽象类中的非抽象方法 m3"); } } //定义一个类 继承 抽象类 class TestClass extends TestAbstract{ public TestClass(){ super(); } @Override public void m1() { System.out.println("我是子类重写抽象类后的m1"); } @Override public void m2() { System.out.println("我是子类重写抽象类后的m3"); } //重写 m3 方法 @Override public void m3() { System.out.println("我是子类重写抽象类的非抽象方法 m3"); } } //案例3: 关于特点4 public class Demo1 { public static void main(String[] args) { //TestAbstract testAbstract;//声明引用 // TestAbstract testAbstract = new TestAbstract();// 不能创建抽象类的对象 //抽象类的对象存在 TestClass testClass = new TestClass(); testClass.m3(); } } //定义一个抽象类 abstract class TestAbstract{ int a = 10; //构造方法 public TestAbstract() { System.out.println("我是抽象类中的构造方法"); } //定义抽象方法 public abstract void m1(); public abstract void m2(); //定义非抽象方法 public void m3(){ System.out.println("我是抽象类中的非抽象方法 m3"); } } //定义一个类 继承 抽象类 class TestClass extends TestAbstract{ int a = 20; public TestClass(){ super(); } @Override public void m1() { System.out.println("我是子类重写抽象类后的m1"); } @Override public void m2() { System.out.println("我是子类重写抽象类后的m3"); } //重写 m3 方法 @Override public void m3() { System.out.println(a); System.out.println(super.a);//super 当前类的直接父类对象的引用 System.out.println("我是子类重写抽象类的非抽象方法 m3"); } } //案例4: public class Demo1 { public static void main(String[] args) { //TestAbstract testAbstract;//声明引用 // TestAbstract testAbstract = new TestAbstract();// 不能创建抽象类的对象 //抽象类的对象存在 // TestClass testClass = new TestClass(); // testClass.m3(); TestAbstract testAbstract = new TestClass();// 父类引用指向子类对象 testAbstract.m1(); testAbstract.m2(); testAbstract.m3(); } } //定义一个抽象类 abstract class TestAbstract{ int a = 10; //构造方法 public TestAbstract() { System.out.println("我是抽象类中的构造方法"); } //定义抽象方法 public abstract void m1(); public abstract void m2(); //定义非抽象方法 public void m3(){ System.out.println("我是抽象类中的非抽象方法 m3"); } } //定义一个类 继承 抽象类 class TestClass extends TestAbstract{ int a = 20; public TestClass(){ super(); } @Override public void m1() { System.out.println("我是子类重写抽象类后的m1"); } @Override public void m2() { System.out.println("我是子类重写抽象类后的m2"); } //重写 m3 方法 @Override public void m3() { System.out.println(a); System.out.println(super.a);//super 当前类的直接父类 System.out.println("我是子类重写抽象类的非抽象方法 m3"); } public void m4(){ System.out.println("我是子类特有的方法m4"); } } 模版设计模式 设计模式 设计模式: 就是在实际开发中,总结的一套解决问题的固定套路,经过总结,最后就形成了设计模式 23种. 模版设计模式 把抽象类整体看成是一个模板,模板中不能决定的东西使用抽象方法表示,让使用模板的类【抽象类的子类】去重写抽象方法实现需求 设计模式案例 模拟一个用天然气做热菜的场景 开火 //确定不了 ----> 使用抽象方法表示 关火 public class Demo1 { public static void main(String[] args) { Case tomatoEgg = new TomatoEgg(); tomatoEgg.doFood(); } } abstract class Case{ //做菜的方法 public void doFood(){ onFire(); // 不能确定的步骤 perpareVegetable(); shaoYou(); makeType(); offFire(); } // 备菜 public abstract void perpareVegetable(); // 烧油 public abstract void shaoYou(); // 做法 public abstract void makeType(); //做热菜 确定的方法 public void onFire(){ System.out.println("开火"); } public void offFire(){ System.out.println("关火"); } } //做不同的菜 class TomatoEgg extends Case{ @Override public void perpareVegetable() { System.out.println("准备西红柿 切成块"); System.out.println("准备鸡蛋 打成蛋液"); System.out.println("准备葱姜蒜"); } @Override public void shaoYou() { System.out.println("使用的是橄榄油加 500g"); } @Override public void makeType() { System.out.println("使用的是爆炒的方法"); } }
Java中abstract是什么?作用是什么?如何使用? ——关键字abstract
内容版权声明:除非注明,否则皆为本站原创文章。