【Java】接口、内部类、面向对象简单项目的实现

接口

【1】接口声明格式:

[访问修饰符]  interface 接口名   [extends  父接口1,父接口2…]  {

         常量定义;       

         方法定义;

}

【2】代码:

  1. package com.star.test04;
  2. /**
  3.  * 1.类是类,接口是接口,它们是同一层次的概念。
  4.  * 2.接口中没有构造器
  5.  * 3.接口如何声明:interface
  6.  * 4.在JDK1.8之前,接口中只有两部分内容:
  7.  * (1)常量:固定修饰符:public static final
  8.  * (2)抽象方法:固定修饰符:public abstract
  9. * 注意:修饰符可以省略不写,IDE会帮你自动补全,但是初学者建议写上,防止遗忘。
  10. */
  11. public interface TestInterface01 {
  12.     //常量:
  13.     /*public static final*/ int NUM = 10;
  14.     //抽象方法:
  15.     /*public abstract*/ void a();
  16.     /*public abstract*/ void b(int num);
  17.     /*public abstract*/ int c(String name);
  18. }
  19. interface TestInterface02{
  20.     void e();
  21.     void f();
  22. }
  23. /*
  24. 5.类和接口的关系是什么? 实现关系  类实现接口:
  25. 6.一旦实现一个接口,那么实现类要重写接口中的全部的抽象方法:
  26. 7.如果没有全部重写抽象方法,那么这个类可以变成一个抽象类。
  27. 8.java只有单继承,java还有多实现
  28. 一个类继承其他类,只能直接继承一个父类
  29. 但是实现类实现接口的话,可以实现多个接口
  30. 9.写法:先继承 再实现:extends Person implements TestInterface01,TestInterface02
  31. */
  32. class Student extends Person implements TestInterface01,TestInterface02 {
  33.     @Override
  34.     public void a() {
  35.         System.out.println("---1");
  36.     }
  37.     @Override
  38.     public void b(int num) {
  39.         System.out.println("---2");
  40.     }
  41.     @Override
  42.     public int c(String name) {
  43.         return 100;
  44.     }
  45.     @Override
  46.     public void e() {
  47.         System.out.println("---3");
  48.     }
  49.     @Override
  50.     public void f() {
  51.         System.out.println("---4");
  52.     }
  53. }
  54. class Test{
  55.     //这是一个main方法,是程序的入口:
  56.     public static void main(String[] args) {
  57.         //10.接口不能创建对象:
  58.         //TestInterface02 t = new TestInterface02();
  59.         TestInterface02 t = new Student();//接口指向实现类 ---》多态
  60.         //11.接口中常量如何访问:
  61.         System.out.println(TestInterface01.NUM);
  62.         System.out.println(Student.NUM);
  63.         Student s = new Student();
  64.         System.out.println(s.NUM);
  65.         TestInterface01 t2 = new Student();
  66.         System.out.println(t2.NUM);
  67.     }
  68. }

【3】接口的作用是什么?

定义规则,只是跟抽象类不同地方在哪?它是接口不是类。

接口定义好规则之后,实现类负责实现即可。

【4】

继承:子类对父类的继承

实现:实现类对接口的实现

手机  是不是  照相机  

继承:手机   extends 照相机     “is-a”的关系,手机是一个照相机 

上面的写法 不好:

实现:  手机    implements   拍照功能   “has-a”的关系,手机具备照相的能力

案例:飞机,小鸟,风筝

  定义一个接口: Flyable

【5】多态的应用场合:

(1)父类当做方法的形参,传入具体的子类的对象

(2)父类当做方法的返回值,返回的是具体的子类的对象

(3)接口当做方法的形参,传入具体的实现类的对象

(4)接口当做方法的返回值,返回的是具体的实现类的对象

【6】接口和抽象类的区别:

     JDK1.8以后的接口新增内容

在JDK1.8之前,接口中只有两部分内容:
(1)常量:固定修饰符:public static final
(2)抽象方法:固定修饰符:public abstract 

在JDK1.8之后,新增非抽象方法:

(1)被public default修饰的非抽象方法:

注意1:default修饰符必须要加上,否则出错

注意2:实现类中要是想重写接口中的非抽象方法,那么default修饰符必须不能加,否则出错。

  1. public interface TestInterface {
  2.     //常量:
  3.     public static final int NUM= 10;
  4.     //抽象方法:
  5.     public abstract void a();
  6.     //public default修饰的非抽象方法:
  7.     public default void b(){
  8.         System.out.println("-------TestInterface---b()-----");
  9.     }
  10. }
  11. class Test implements TestInterface{
  12.     public void c(){
  13.         //用一下接口中的b方法:
  14.         b();//可以
  15.         //super.b();不可以
  16.         TestInterface.super.b();//可以
  17.     }
  18.     @Override
  19.     public void a() {
  20.         System.out.println("重写了a方法");
  21.     }
  22.     @Override
  23.     public void b() {
  24.     }
  25. }

(2)静态方法:

注意1:static不可以省略不写

注意2:静态方法不能重写

  1. public interface TestInterface2 {
  2.     //常量:
  3.     public static final int NUM = 10;
  4.     //抽象方法:
  5.     public abstract  void a();
  6.     //public default非抽象方法;
  7.     public default void b(){
  8.         System.out.println("-----TestInterface2---b");
  9.     }
  10.     //静态方法:
  11.     public static void c(){
  12.         System.out.println("TestInterface2中的静态方法");
  13.     }
  14. }
  15. class Demo implements TestInterface2{
  16.     @Override
  17.     public void a() {
  18.         System.out.println("重写了a方法");
  19.     }
  20.     public static void c(){
  21.         System.out.println("Demo中的静态方法");
  22.     }
  23. }
  24. class A {
  25.     //这是一个main方法,是程序的入口:
  26.     public static void main(String[] args) {
  27.         Demo d = new Demo();
  28.         d.c();
  29.         Demo.c();
  30.         TestInterface2.c();
  31.     }
  32. }

疑问:为什么要在接口中加入非抽象方法???

如果接口中只能定义抽象方法的话,那么我要是修改接口中的内容,那么对实现类的影响太大了,所有实现类都会受到影响。

现在在接口中加入非抽象方法,对实现类没有影响,想调用就去调用即可。

内部类
成员内部类
  1. package com.star.test07;
  2. /**
  3.  * 1.类的组成:属性,方法,构造器,代码块(普通块,静态块,构造块,同步块),内部类
  4.  * 2.一个类TestOuter的内部的类SubTest叫内部类, 内部类 :SubTest  外部类:TestOuter
  5.  * 3.内部类:成员内部类 (静态的,非静态的) 和  局部内部类(位置:方法内,块内,构造器内)
  6.  * 4.成员内部类:
  7.  *      里面属性,方法,构造器等
  8.  *      修饰符:private,default,protect,public,final,abstract
  9. */
  10. public class TestOuter {
  11.     //非静态的成员内部类:
  12.     public class D{
  13.         int age = 20;
  14.         String name;
  15.         public void method(){
  16.             //5.内部类可以访问外部类的内容
  17.             /*System.out.println(age);
  18.             a();*/
  19.             int age = 30;
  20.             //8.内部类和外部类属性重名的时候,如何进行调用:
  21.             System.out.println(age);//30
  22.             System.out.println(this.age);//20
  23.             System.out.println(TestOuter.this.age);//10
  24.         }
  25.     }
  26.     //静态成员内部类:
  27.     static class E{
  28.         public void method(){
  29.             //6.静态内部类中只能访问外部类中被static修饰的内容
  30.             /*System.out.println(age);
  31.             a();*/
  32.         }
  33.     }
  34.     //属性:
  35.     int age = 10;
  36.     //方法:
  37.     public void a(){
  38.         System.out.println("这是a方法");
  39.         {
  40.             System.out.println("这是一个普通块");
  41.             class B{
  42.             }
  43.         }
  44.         class A{
  45.         }
  46.         //7.外部类想要访问内部类的东西,需要创建内部类的对象然后进行调用
  47.         D d = new D();
  48.         System.out.println(d.name);
  49.         d.method();
  50.     }
  51.     static{
  52.         System.out.println("这是静态块");
  53.     }
  54.     {
  55.         System.out.println("这是构造块");
  56.     }
  57.     //构造器:
  58.     public TestOuter(){
  59.         class C{
  60.         }
  61.     }
  62.     public TestOuter(int age) {
  63.         this.age = age;
  64.     }
  65. }
  66. class Demo{
  67.     //这是一个main方法,是程序的入口:
  68.     public static void main(String[] args) {
  69.         //创建外部类的对象:
  70.         TestOuter to = new TestOuter();
  71.         to.a();
  72.         //9.创建内部类的对象:
  73.         //静态的成员内部类创建对象:
  74.         TestOuter.E e = new TestOuter.E();
  75.         //非静态的成员内部类创建对象:
  76.         //错误:TestOuter.D d = new TestOuter.D();
  77.         TestOuter t = new TestOuter();
  78.         TestOuter.D d = t.new D();
  79.     }
  80. }

局部内部类
  1. package com.star.test08;
  2. /**
  3.  * @Auther: Starshine
  4.  */
  5. public class TestOuter {
  6.     //1.在局部内部类中访问到的变量必须是被final修饰的
  7.     public void method(){
  8.         final int num = 10;
  9.         class A{
  10.             public void a(){
  11.                 //num = 20;
  12.                 System.out.println(num);
  13.             }
  14.         }
  15.     }
  16.     //2.如果类B在整个项目中只使用一次,那么就没有必要单独创建一个B类,使用内部类就可以了
  17.     public Comparable method2(){
  18.         class B implements Comparable{
  19.             @Override
  20.             public int compareTo(Object o) {
  21.                 return 100;
  22.             }
  23.         }
  24.         return new B();
  25.     }
  26.     public Comparable method3(){
  27.         //3.匿名内部类
  28.         return new Comparable(){
  29.             @Override
  30.             public int compareTo(Object o) {
  31.                 return 200;
  32.             }
  33.         };
  34.     }
  35.     public void teat(){
  36.         Comparable com = new Comparable(){
  37.             @Override
  38.             public int compareTo(Object o) {
  39.                 return 200;
  40.             }
  41.         };
  42.         System.out.println(com.compareTo("abc"));
  43.     }
  44. }

面向对象项目

项目需求

项目结构分析

最终代码

匹萨父类:

  1. package com.star.test01;
  2. /**
  3.  * @Auther: Starshine
  4.  * 父类:匹萨类
  5.  */
  6. public class Pizza {
  7.     //属性
  8.     private String name;//名称
  9.     private int size;//大小
  10.     private int price;//价格
  11.     //方法
  12.     public String getName() {
  13.         return name;
  14.     }
  15.     public void setName(String name) {
  16.         this.name = name;
  17.     }
  18.     public int getSize() {
  19.         return size;
  20.     }
  21.     public void setSize(int size) {
  22.         this.size = size;
  23.     }
  24.     public int getPrice() {
  25.         return price;
  26.     }
  27.     public void setPrice(int price) {
  28.         this.price = price;
  29.     }
  30.     //展示匹萨信息:
  31.     public String showPizza(){
  32.         return "匹萨的名字是:"+name+"\n匹萨的大小是:"+size+"寸\n匹萨的价格:"+price+"元";
  33.     }
  34.     //构造器
  35.     public Pizza() {
  36.     }
  37.     public Pizza(String name, int size, int price) {
  38.         this.name = name;
  39.         this.size = size;
  40.         this.price = price;
  41.     }
  42. }

培根匹萨:

  1. package com.star.test01;
  2. /**
  3.  * @Auther: Starshine
  4.  */
  5. public class BaconPizza extends Pizza {
  6.     //属性:
  7.     private int weight;
  8.     public int getWeight() {
  9.         return weight;
  10.     }
  11.     public void setWeight(int weight) {
  12.         this.weight = weight;
  13.     }
  14.     //构造器:
  15.     public BaconPizza() {
  16.     }
  17.     public BaconPizza(String name, int size, int price, int weight) {
  18.         super(name, size, price);
  19.         this.weight = weight;
  20.     }
  21.     //重写父类showPizza方法:
  22.     @Override
  23.     public String showPizza() {
  24.         return super.showPizza()+"\n培根的克数是:"+weight+"克";
  25.     }
  26. }

水果匹萨:

  1. package com.star.test01;
  2. /**
  3.  * @Auther: Starshine
  4.  */
  5. public class FruitsPizza extends Pizza{
  6.     //属性:
  7.     private String burdening;
  8.     public String getBurdening() {
  9.         return burdening;
  10.     }
  11.     public void setBurdening(String burdening) {
  12.         this.burdening = burdening;
  13.     }
  14.     //构造器:
  15.     public FruitsPizza() {
  16.     }
  17.     public FruitsPizza(String name, int size, int price, String burdening) {
  18.         super(name, size, price);
  19.         this.burdening = burdening;
  20.     }
  21.     //重写父类showPizza方法:
  22.     @Override
  23.     public String showPizza() {
  24.         return super.showPizza()+"\n你要加入的水果:"+burdening;
  25.     }
  26. }

测试类:

  1. public class Test {
  2.     //这是一个main方法,是程序的入口:
  3.     public static void main(String[] args) {
  4.         //选择购买匹萨:
  5.         Scanner sc = new Scanner(System.in);
  6.         System.out.println("请选择你想要购买的匹萨(1.培根匹萨 2.水果匹萨):");
  7.         int choice = sc.nextInt();//选择
  8.         //通过工厂获取匹萨:
  9.         Pizza pizza = PizzaStore.getPizza(choice);
  10.         System.out.println(pizza.showPizza());
  11.     }
  12. }

工厂类:

  1. package com.star.test01;
  2. import java.util.Scanner;
  3. /**
  4.  * @Auther: Starshine
  5.  */
  6. public class PizzaStore {
  7.     public static Pizza getPizza(int choice){
  8.         Scanner sc = new Scanner(System.in);
  9.         Pizza p = null;
  10.         switch (choice){
  11.             case 1:
  12.                 {
  13.                     System.out.println("请录入培根的克数:");
  14.                     int weight = sc.nextInt();
  15.                     System.out.println("请录入匹萨的大小:");
  16.                     int size = sc.nextInt();
  17.                     System.out.println("请录入匹萨的价格:");
  18.                     int price = sc.nextInt();
  19.                     //将录入的信息封装为培根匹萨的对象:
  20.                     BaconPizza bp = new BaconPizza("培根匹萨",size,price,weight);
  21.                     p = bp;
  22.                 }
  23.                 break;
  24.             case 2:
  25.                 {
  26.                     System.out.println("请录入你想要加入的水果:");
  27.                     String burdening = sc.next();
  28.                     System.out.println("请录入匹萨的大小:");
  29.                     int size = sc.nextInt();
  30.                     System.out.println("请录入匹萨的价格:");
  31.                     int price = sc.nextInt();
  32.                     //将录入的信息封装为水果匹萨的对象:
  33.                     FruitsPizza fp = new FruitsPizza("水果匹萨",size,price,burdening);
  34.                     p = fp;
  35.                 }
  36.                 break;
  37.         }
  38.         return p;
  39.     }
  40. }
  • 25
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值