接口
【1】接口声明格式:
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] { 常量定义; 方法定义; } |
【2】代码:
- package com.star.test04;
- /**
- * 1.类是类,接口是接口,它们是同一层次的概念。
- * 2.接口中没有构造器
- * 3.接口如何声明:interface
- * 4.在JDK1.8之前,接口中只有两部分内容:
- * (1)常量:固定修饰符:public static final
- * (2)抽象方法:固定修饰符:public abstract
- * 注意:修饰符可以省略不写,IDE会帮你自动补全,但是初学者建议写上,防止遗忘。
- */
- public interface TestInterface01 {
- //常量:
- /*public static final*/ int NUM = 10;
- //抽象方法:
- /*public abstract*/ void a();
- /*public abstract*/ void b(int num);
- /*public abstract*/ int c(String name);
- }
- interface TestInterface02{
- void e();
- void f();
- }
- /*
- 5.类和接口的关系是什么? 实现关系 类实现接口:
- 6.一旦实现一个接口,那么实现类要重写接口中的全部的抽象方法:
- 7.如果没有全部重写抽象方法,那么这个类可以变成一个抽象类。
- 8.java只有单继承,java还有多实现
- 一个类继承其他类,只能直接继承一个父类
- 但是实现类实现接口的话,可以实现多个接口
- 9.写法:先继承 再实现:extends Person implements TestInterface01,TestInterface02
- */
- class Student extends Person implements TestInterface01,TestInterface02 {
- @Override
- public void a() {
- System.out.println("---1");
- }
- @Override
- public void b(int num) {
- System.out.println("---2");
- }
- @Override
- public int c(String name) {
- return 100;
- }
- @Override
- public void e() {
- System.out.println("---3");
- }
- @Override
- public void f() {
- System.out.println("---4");
- }
- }
- class Test{
- //这是一个main方法,是程序的入口:
- public static void main(String[] args) {
- //10.接口不能创建对象:
- //TestInterface02 t = new TestInterface02();
- TestInterface02 t = new Student();//接口指向实现类 ---》多态
- //11.接口中常量如何访问:
- System.out.println(TestInterface01.NUM);
- System.out.println(Student.NUM);
- Student s = new Student();
- System.out.println(s.NUM);
- TestInterface01 t2 = new Student();
- System.out.println(t2.NUM);
- }
- }
【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修饰符必须不能加,否则出错。
- public interface TestInterface {
- //常量:
- public static final int NUM= 10;
- //抽象方法:
- public abstract void a();
- //public default修饰的非抽象方法:
- public default void b(){
- System.out.println("-------TestInterface---b()-----");
- }
- }
- class Test implements TestInterface{
- public void c(){
- //用一下接口中的b方法:
- b();//可以
- //super.b();不可以
- TestInterface.super.b();//可以
- }
- @Override
- public void a() {
- System.out.println("重写了a方法");
- }
- @Override
- public void b() {
- }
- }
(2)静态方法:
注意1:static不可以省略不写
注意2:静态方法不能重写
- public interface TestInterface2 {
- //常量:
- public static final int NUM = 10;
- //抽象方法:
- public abstract void a();
- //public default非抽象方法;
- public default void b(){
- System.out.println("-----TestInterface2---b");
- }
- //静态方法:
- public static void c(){
- System.out.println("TestInterface2中的静态方法");
- }
- }
- class Demo implements TestInterface2{
- @Override
- public void a() {
- System.out.println("重写了a方法");
- }
- public static void c(){
- System.out.println("Demo中的静态方法");
- }
- }
- class A {
- //这是一个main方法,是程序的入口:
- public static void main(String[] args) {
- Demo d = new Demo();
- d.c();
- Demo.c();
- TestInterface2.c();
- }
- }
疑问:为什么要在接口中加入非抽象方法???
如果接口中只能定义抽象方法的话,那么我要是修改接口中的内容,那么对实现类的影响太大了,所有实现类都会受到影响。
现在在接口中加入非抽象方法,对实现类没有影响,想调用就去调用即可。
内部类
成员内部类
- package com.star.test07;
- /**
- * 1.类的组成:属性,方法,构造器,代码块(普通块,静态块,构造块,同步块),内部类
- * 2.一个类TestOuter的内部的类SubTest叫内部类, 内部类 :SubTest 外部类:TestOuter
- * 3.内部类:成员内部类 (静态的,非静态的) 和 局部内部类(位置:方法内,块内,构造器内)
- * 4.成员内部类:
- * 里面属性,方法,构造器等
- * 修饰符:private,default,protect,public,final,abstract
- */
- public class TestOuter {
- //非静态的成员内部类:
- public class D{
- int age = 20;
- String name;
- public void method(){
- //5.内部类可以访问外部类的内容
- /*System.out.println(age);
- a();*/
- int age = 30;
- //8.内部类和外部类属性重名的时候,如何进行调用:
- System.out.println(age);//30
- System.out.println(this.age);//20
- System.out.println(TestOuter.this.age);//10
- }
- }
- //静态成员内部类:
- static class E{
- public void method(){
- //6.静态内部类中只能访问外部类中被static修饰的内容
- /*System.out.println(age);
- a();*/
- }
- }
- //属性:
- int age = 10;
- //方法:
- public void a(){
- System.out.println("这是a方法");
- {
- System.out.println("这是一个普通块");
- class B{
- }
- }
- class A{
- }
- //7.外部类想要访问内部类的东西,需要创建内部类的对象然后进行调用
- D d = new D();
- System.out.println(d.name);
- d.method();
- }
- static{
- System.out.println("这是静态块");
- }
- {
- System.out.println("这是构造块");
- }
- //构造器:
- public TestOuter(){
- class C{
- }
- }
- public TestOuter(int age) {
- this.age = age;
- }
- }
- class Demo{
- //这是一个main方法,是程序的入口:
- public static void main(String[] args) {
- //创建外部类的对象:
- TestOuter to = new TestOuter();
- to.a();
- //9.创建内部类的对象:
- //静态的成员内部类创建对象:
- TestOuter.E e = new TestOuter.E();
- //非静态的成员内部类创建对象:
- //错误:TestOuter.D d = new TestOuter.D();
- TestOuter t = new TestOuter();
- TestOuter.D d = t.new D();
- }
- }
局部内部类
- package com.star.test08;
- /**
- * @Auther: Starshine
- */
- public class TestOuter {
- //1.在局部内部类中访问到的变量必须是被final修饰的
- public void method(){
- final int num = 10;
- class A{
- public void a(){
- //num = 20;
- System.out.println(num);
- }
- }
- }
- //2.如果类B在整个项目中只使用一次,那么就没有必要单独创建一个B类,使用内部类就可以了
- public Comparable method2(){
- class B implements Comparable{
- @Override
- public int compareTo(Object o) {
- return 100;
- }
- }
- return new B();
- }
- public Comparable method3(){
- //3.匿名内部类
- return new Comparable(){
- @Override
- public int compareTo(Object o) {
- return 200;
- }
- };
- }
- public void teat(){
- Comparable com = new Comparable(){
- @Override
- public int compareTo(Object o) {
- return 200;
- }
- };
- System.out.println(com.compareTo("abc"));
- }
- }
面向对象项目
项目需求
项目结构分析
最终代码
匹萨父类:
- package com.star.test01;
- /**
- * @Auther: Starshine
- * 父类:匹萨类
- */
- public class Pizza {
- //属性
- private String name;//名称
- private int size;//大小
- private int price;//价格
- //方法
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getSize() {
- return size;
- }
- public void setSize(int size) {
- this.size = size;
- }
- public int getPrice() {
- return price;
- }
- public void setPrice(int price) {
- this.price = price;
- }
- //展示匹萨信息:
- public String showPizza(){
- return "匹萨的名字是:"+name+"\n匹萨的大小是:"+size+"寸\n匹萨的价格:"+price+"元";
- }
- //构造器
- public Pizza() {
- }
- public Pizza(String name, int size, int price) {
- this.name = name;
- this.size = size;
- this.price = price;
- }
- }
培根匹萨:
- package com.star.test01;
- /**
- * @Auther: Starshine
- */
- public class BaconPizza extends Pizza {
- //属性:
- private int weight;
- public int getWeight() {
- return weight;
- }
- public void setWeight(int weight) {
- this.weight = weight;
- }
- //构造器:
- public BaconPizza() {
- }
- public BaconPizza(String name, int size, int price, int weight) {
- super(name, size, price);
- this.weight = weight;
- }
- //重写父类showPizza方法:
- @Override
- public String showPizza() {
- return super.showPizza()+"\n培根的克数是:"+weight+"克";
- }
- }
水果匹萨:
- package com.star.test01;
- /**
- * @Auther: Starshine
- */
- public class FruitsPizza extends Pizza{
- //属性:
- private String burdening;
- public String getBurdening() {
- return burdening;
- }
- public void setBurdening(String burdening) {
- this.burdening = burdening;
- }
- //构造器:
- public FruitsPizza() {
- }
- public FruitsPizza(String name, int size, int price, String burdening) {
- super(name, size, price);
- this.burdening = burdening;
- }
- //重写父类showPizza方法:
- @Override
- public String showPizza() {
- return super.showPizza()+"\n你要加入的水果:"+burdening;
- }
- }
测试类:
- public class Test {
- //这是一个main方法,是程序的入口:
- public static void main(String[] args) {
- //选择购买匹萨:
- Scanner sc = new Scanner(System.in);
- System.out.println("请选择你想要购买的匹萨(1.培根匹萨 2.水果匹萨):");
- int choice = sc.nextInt();//选择
- //通过工厂获取匹萨:
- Pizza pizza = PizzaStore.getPizza(choice);
- System.out.println(pizza.showPizza());
- }
- }
工厂类:
- package com.star.test01;
- import java.util.Scanner;
- /**
- * @Auther: Starshine
- */
- public class PizzaStore {
- public static Pizza getPizza(int choice){
- Scanner sc = new Scanner(System.in);
- Pizza p = null;
- switch (choice){
- case 1:
- {
- System.out.println("请录入培根的克数:");
- int weight = sc.nextInt();
- System.out.println("请录入匹萨的大小:");
- int size = sc.nextInt();
- System.out.println("请录入匹萨的价格:");
- int price = sc.nextInt();
- //将录入的信息封装为培根匹萨的对象:
- BaconPizza bp = new BaconPizza("培根匹萨",size,price,weight);
- p = bp;
- }
- break;
- case 2:
- {
- System.out.println("请录入你想要加入的水果:");
- String burdening = sc.next();
- System.out.println("请录入匹萨的大小:");
- int size = sc.nextInt();
- System.out.println("请录入匹萨的价格:");
- int price = sc.nextInt();
- //将录入的信息封装为水果匹萨的对象:
- FruitsPizza fp = new FruitsPizza("水果匹萨",size,price,burdening);
- p = fp;
- }
- break;
- }
- return p;
- }
- }