首页 文章 精选 留言 我的

精选列表

搜索[对象模型],共10000篇文章
优秀的个人博客,低调大师

Java入门之面向对象使用接口编程

假设: 三位互联网风云人物除了本身的职位外,给他们增加医生、警察、司机三个职务。现在他们要去学习一项Java开发的技术,对于老师来讲,三位都是学生,老师只关注学生这一个身份,其他的身份与老师无关。 image.png 使用接口的好处 通用性 隔离性 通用性:无论是医生、警察、司机,通通全部当做学生对待。 隔离性:无论是医生、警察、司机,特有的功能与我无关,我只关心学生相关的功能。 接口的格式与组成部分 接口基本定义格式: public interface 要定义的接口名称 { //...... } 接口当中可以包含的组成部分有: 1.抽象方法 2.常量 3.默认方法(Java8) 4.静态方法(Java8) 5.私有方法(Java9) 接口的抽象方法定义 抽象方法定义:public abstract 返回值类型 方法名称 (参数类型 参数名称); 注意: 1.接口中的抽象方法,修饰符如果要写,必须是:public abstract; 2.接口中的抽象方法,修饰符可以省略不写,默认就是 :public abstract; 3.抽象方法只有方法头,不能有方法体大括号; public interface Animal { //定义一个抽象方法 :吃东西 public abstract void eat(); //写了修饰符; //定义一个抽象方法 :睡觉; void sleep(); //不写修饰符; } image.png 使用接口 如果要想使用定义好的接口,必须有一个接口的"实现类", 定义实现类格式为: public class 实现的类名称 implements 接口名称 { 一定要覆盖重写所有抽象方法 } 什么是覆盖重写(Override)抽象方法? 1.将接口当中的抽象方法抄过来; 2.去掉abstract关键字; 3.写上大括号方法体; Cat就是Animal接口的实现类;Cat类实现了Animal接口。如下图: public class Cat implements Animal { public void eat(){ } public void sleep() { } } 接口与实现类的基本使用 如何使用接口与实现类? 创建: 接口名 引用名 = new 实现类名(); 调用: 引用名.抽象方法名(参数); public class Demo01 { public static void maim(String[] args){ //创建 Animal cat = new Cat(); //调用接口当中定义好的抽象方法; cat.eat(); cat.sleep(); } } 上图代码注意: 1.左边是接口类型,那么只能调用接口当中定义好的内容,不能调用右侧实现类当中特有的内容。(接口隔离)。 2.当调用接口当中的抽象方法时,真正进行运行的是右侧new的时候类的具体方法的内容。 3.调用的时候看左边,运行的时候看右边。 面向接口编程 准备三个.java文件,分别是Animal.java 、 Cat.java 、 Dog.java 我这里把三个文件写在一起 大家测试的时候还是常规分开三个文件。 Animal.java public interface Animal { public abstract void eat(); void sleep(); } Cat.java public class Cat implements Animal { public void eat(){ } public void sleep(){ } //这是一个Cat特有方法,接口中没有定义 public void catchMouse(){ } } Dog.java public class Dog implements Animal { public void eat(){ } public void sleep(){ } //这是一个Dog特有方法,接口中没有定义 public void watchHouse(){ } } 上边Cat和Dog各有一个自己独有的方法,Cat(catchMouse) Dog(watchHouse) 接口中只定义了两个方法 eat sleep. 如果不使用面向接口编程要这样写: public class Demo1 { public static void main(String[] args){ Cat cat = new Cat(); method(cat); Dog dog = new Dog(); method(dog); } public static void method(Cat cat){ cat.eat(); cat.sleep(); } public static void method(Dog dog){ dog.eat(); dog.sleep(); } } 如果使用面向接口编程: public class Demo2 { public static void main(String[] args){ Cat cat = new Cat(); method(cat); Dog dog = new Dog(); method(dog); } //使用接口作为参数类型 这样就不区分到底是猫还是狗 只能访问接口中定义的方法 隔离开了猫和狗特有的方法 public static void method(Animal animal){ animal.eat(); animal.sleep(); } } 很显然,后者使用接口作为参数类型 ,这样就不区分到底是猫还是狗 ,只能访问接口中定义的方法, 隔离开了猫和狗特有的方法。 使用接口作为左侧类型的好处,屏蔽掉了右侧的特性内容(catchMouse、watchHouse),达到隔离同一的目的。 面向接口编程: 如果使用的功能,接口已经可以满足,那么就不在乎具体的类是谁,只在乎接口即可。

优秀的个人博客,低调大师

Java 学习(07)--面向对象常见问题

1.有5家衣服专卖店,每家最多购买3件。用户可以选择离开,可以买衣服。最后打印总共买了几件衣服。 代码: //有5家衣服专卖店,每家最多购买3件。用户可以选择离开,可以买衣服。最后打印总共买了几件衣服。 import java.util.Scanner; public class BuyClothes{ private static int number = 0;//存储总购买量 public void setNumber(int a){ number = number+a; } public int GetNumber(){ return number; } public static void main(String[] args){ int name;//输出商店序号 shop s=new shop(); for(name = 1 ; name<6 ; name++){ System.out.println("欢迎光临第" + name + "家专卖店"); s.ask(); } System.out.println("总共买了" + number + "件衣服");//输出总购买量 } }//建立专卖店类 class shop{ BuyClothes b = new BuyClothes(); private int n;//存储当前商店购买量 public void ask(){ n = 0; for(String a = "n" ; a.equals("n") ;){ System.out.print("要离开吗(y/n)? "); Scanner sc = new Scanner(System.in); a = sc.nextLine();//判断是否离开 if(a.equals("n") && n<3){ System.out.println("买了一件衣服"); n = n+1; b.setNumber(1); }else if(a.equals("y")){ System.out.println("离店结账"); System.out.println(); }else{ String t;//判断输入是否有误 for(t=a ; (n<3 && !a.equals("n") && !a.equals("y")) || (!a.equals("y") && n>=3) ;){ System.out.print("输入有误或已达到本店购买上限,请重新输入(y/n):"); a = sc.nextLine(); } } } } } 运行: 2.完成购买商品结算功能: 1、循环输入商品编号和购物数量,计算消费金额并累加到总金额 2、输入“n”开始结账(假设享8折) 3、输入实付金额,计算找零 //完成购买商品结算功能: import java.util.Scanner; public class Shop{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); String[] a=new String[]{"T恤","网球鞋","网球拍"}; float[] b=new float[]{245,570,100}; System.out.println("购物管理系统 > 购物结算"); System.out.println(); System.out.println(); //输出45个星 for(int i=0;i<45;i++){ System.out.print("*"); } System.out.println(); System.out.println("请选择购买的商品编号:"); System.out.println(); //遍历数组列出商品 for(int i=0;i<3;i++){ System.out.print((i+1) + "." + a[i] + " "); } System.out.println(); //输出45个星 for(int i=0;i<45;i++){ System.out.print("*"); } System.out.println(); System.out.println(); //开始购物 float cost=(float)0; float realCost=(float)0; for (String d="y" ; d.equals("y") ; ){ Scanner sc2=new Scanner(System.in); System.out.print("请输入商品编号: "); int x=sc2.nextInt()-1; System.out.println(); System.out.print("请输入购买数量: "); int y=sc2.nextInt(); System.out.println(); System.out.println(a[x] + " " + "¥" + b[x] + " " + "¥" + (b[x]*(float)y)); System.out.println(); cost=cost + (b[x]*(float)y); System.out.print("是否继续(y/n):"); d=sc.nextLine(); System.out.println(); } System.out.println("折扣:0.8"); System.out.println("金额总计 ¥" + cost*(float)0.8); System.out.print("实际交费 ¥"); //判断交钱数目是否正确 for (realCost=(float)sc.nextInt() ; realCost < cost*(float)0.8;){ System.out.println("钱数不对"); realCost=(float)sc.nextInt(); } System.out.println(""); System.out.println("找钱 ¥" + (realCost-(cost*(float)0.8))); } } 运行: 3.万年历(实现从键盘输入1900年之后的任意的某年、某月,输出该月的日历) 代码: //万年历(实现从键盘输入1900年之后的任意的某年、某月,输出该月的日历) import java.util.Scanner; public class Week{ public static void main(String [] args){ int year;//保存输入的年 int month;//保存输入的月 int days=0;//保存月份的天数 int totalDays=0;//存放总的天数差 boolean isRn;//判断输入的年是否是闰年,是的话true,不是false Scanner input=new Scanner(System.in); System.out.println("***************万年历**************"); System.out.println("请输入年:"); year=input.nextInt(); System.out.println("请输入月:"); month=input.nextInt(); if(year%400==0||(year%4==0&&year%100!=0)){ isRn=true;//代表闰年 }else{ isRn=false;//代表平年 } if(isRn){ System.out.println(year+"是闰年"); }else{ System.out.println(year+"是平年"); } //计算年的总天数 for(int i=1900;i<year;i++){ if(i%400==0||(i%4==0&&i%100!=0)){ totalDays+=366; }else{ totalDays+=365; } } //计算你输入月份的天数 for(int i=1;i<=month;i++){ switch(i){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: days=31; break; case 2: if(isRn){ days=29; }else{ days=28; } break; case 4: case 6: case 9: case 11: days=30; break; default: System.out.println("输入的月份有误"); break; } //累加求和,输入月份的天数保存到days变量中,但不累加进来 if(i!=month){ totalDays+=days; } } //求这个月的第一天是星期几.也就是输出的\t的个数 int beforeDays=0; beforeDays=1+totalDays%7; if(beforeDays==7){ beforeDays=0; } //打印输出 System.out.println("日\t一\t二\t三\t四\t五\t六"); //先打印输出\t的个数 for(int i=0;i<beforeDays;i++){ System.out.print("\t"); } for(int i=1;i<=days;i++){ System.out.print(i+"\t"); if((beforeDays+i)%7==0){ System.out.println(); } } } } 运行: 4.编写一个类Student,代表学员,要求: 1) 具有属性:姓名、年龄、性别、专业 2) 具有方法:自我介绍,负责输出该学员的姓名、年龄、性别以及专业 代码: //编写一个类Student,代表学员,要求: public class School{ public static void main(String[] args){ Student wjh=new Student(); wjh.introduce(); } } class Student{ private String name="小明"; private int age=18; private String sex="男"; private String collegeMajor="电子信息工程"; public void introduce(){ System.out.println("我叫" + name + "\t"); System.out.println(sex + " " + "今年" + age + "岁\t"); System.out.println("我的专业是" + collegeMajor + "\t"); } } 运行:

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册