导读

1.抽象类
2.接口
3.接口的默认方法与静态方法
4.内部类
5.匿名内部类补充详解
6.接口中的内部类

抽象类

规则6:一个类继承抽象类后,必须实现其所有的抽象方法,否则也得是抽象类,不同的子类对父类的抽象方法可以有不同的实现

规则7:

规则8:

Animal父类

package com.hala.animal;public abstract class Animal {protected String name;private int math;private String species;//父类构造方法不能被继承,不能被重写public Animal(){}public Animal(String name,int math){this.setName(name);this.setMath(math);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getMath() {return math;}public void setMath(int math) {this.math = math;}public String getSpecies() {return species;}public void setSpecies(String species) {this.species = species;}//抽象方法,不允许包含方法体,子类中需要重写父类的抽象方法public abstract void eat();}

Cat子类

package com.hala.animal;public class Cat extends Animal {private double weight;public Cat(){}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}//跑动方法public void run(){System.out.println("小猫正在跑。");}//子类必须实现父类的抽象方法@Overridepublic void eat() {System.out.println("小猫会吃鱼");}}

接口



TelPhone类

package com.hala.tel;public class TelPhone {private String brand;private int price;public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}//打电话public void call(){System.out.println("手机可以打电话");}}

SecondPhone类

package com.hala.tel;public class SecondPhone extends TelPhone {//发短信·public void message(){System.out.println("手机可以发短信");}}

ThirdPhone类

package com.hala.tel;public class ThirdPhone extends SecondPhone {public void video(){System.out.println("手机可以看视频");}public void music(){System.out.println("手机可以听音乐");}}

ForthPhone 类

package com.hala.tel;//此处为实现接口的语法
public class ForthPhone extends ThirdPhone implements IPhoto,INet{public void game(){System.out.println("手机可以玩游戏");}@Overridepublic void photo() {// TODO Auto-generated method stubSystem.out.println("手机可以拍照");}@Overridepublic void connection() {// TODO Auto-generated method stubSystem.out.println("手机可以连接");}@Overridepublic void network() {// TODO Auto-generated method stubSystem.out.println("手机可以上网");}
}

Computer类

package com.hala.tel;public class Computer implements INet{@Overridepublic void network() {System.out.println("电脑可以上网");}}

Creame类

package com.hala.tel;public class Creame implements IPhoto {@Overridepublic void photo() {// TODO Auto-generated method stubSystem.out.println("相机可以拍照");}@Overridepublic void connection() {// TODO Auto-generated method stubSystem.out.println("相机可以连接");}}

INet接口

package com.hala.tel;/*** * 具有上网能力的接口* @author hala**/
public interface INet {public void network();
}

IPhoto接口

package com.hala.tel;/*** 1.接口的命名通常以 i打头,这是一种习惯* 2. 接口的访问权限为public或默认不可以是private或protected* 具有照相能力的接口* @author hala**/
public interface IPhoto {//具有拍照的能力,注意此处没有方法体//接口中抽象方法可以不写abstract关键字//若此处省略public也是可以的,但系统还是会默认为publicpublic void photo();//当类实现一个接口时,需要去实现接口中所有抽象方法,否则要把类设置为抽象类public void connection();//接口中可以包含常量,默认为public static final//注意要赋初值int TEMP=20;}

PhoneTest测试类

package com.hala.test;import com.hala.tel.Computer;
import com.hala.tel.Creame;
import com.hala.tel.ForthPhone;
import com.hala.tel.INet;
import com.hala.tel.IPhoto;
import com.hala.tel.SmartWatch;public class PhoneTest {public static void main(String[] args) {IPhoto photo=new Creame();photo.photo();photo=new ForthPhone();photo.photo();//这里TEMP可以直接用IPhoto调用,因为它是默认为static的//也可以在类中定义TEMP但优先调用interfaceSystem.out.println(IPhoto.TEMP);INet net=new Computer();net.network();net=new SmartWatch();net.network();}}

输出结果

相机可以拍照
手机可以拍照
20
电脑可以上网
手表可以上网

接口的默认方法与静态方法

接口IPhoto

package com.hala.tel;/*** 1.接口的命名通常以 i打头,这是一种习惯* 2. 接口的访问权限为public或默认不可以是private或protected* 具有照相能力的接口* @author hala**/
public interface IPhoto {public void photo();//default:默认方法,可以带方法体(jdk1.8后)//类实现此接口时不必实现此方法//可以被重写default public void connection(){System.out.println("我是接口中的默认连接");}//static:静态方法,也可以带方法体(jdk1.8后)//类实现此接口时不必实现此方法//不可以被重写public static void stop(){System.out.println("我是接口中的静态方法");}int TEMP=20;}

Creame类

package com.hala.tel;public class Creame implements IPhoto {@Overridepublic void photo() {// TODO Auto-generated method stubSystem.out.println("相机可以拍照");}//此方法可以不写,是对接口中该方法的重写,注意此处没有了default@Overridepublic void connection() {//调用接口中默认的方法IPhoto.super.connection();}}

PhotoTest测试类

package com.hala.test;import com.hala.tel.Computer;
import com.hala.tel.Creame;
import com.hala.tel.ForthPhone;
import com.hala.tel.INet;
import com.hala.tel.IPhoto;
import com.hala.tel.SmartWatch;public class PhoneTest {public static void main(String[] args) {IPhoto photo=new Creame();//调用默认方法时的操作photo.connection();//调用静态方法时的操作,只能用接口调用IPhoto.stop();}}

输出结果

我是接口中的默认连接
我是接口中的静态方法

⚠️修改类名的方法 右击->refactor->rename

关于多接口中重名常量处理的解决方案

1.若一个类实现了两个接口,两个接口中含有重名的方法,那么要在类中重写这个方法

2.若这个类继承的父类里也含有这个重名方法,那么它会默认调用父类的方法,当然像上边一样重写也是可以的

3.对于方法的处理并不适用于属性,对于同名的接口属性在使用时要用interface.著名,对于父类中的同名属性要在子类中重新定义自己的

接口的继承

一个类只能有一个父类,但一个接口可以有多个父接口,如果父接口出现重名方法,则要在子接口中重写这个方法

接口与抽象类的比较

内部类

成员内部类(普通内部类)

Person类

package com.hala.people;//外部类
public class Person {int age;public Heart getHeart(){return new Heart();}public void eat(){System.out.println("人会吃东西");}//成员内部类/** 1.内部类在外部使用时,无法直接实例化,需要借助外部类信息完成实例化* 2.内部类的访问修饰符可以任意,但访问的范围与一般规则相同* 3.内部类可以直接访问外部类成员(属性,方法),如果出现同名属性优先访问内部类定义的* 4.同名属性情况,可以使用外部类.this.成员,访问外部类的同名信息* 5.外部类调用内部类信息,需要通过内部类实例,无法直接访问* 6.内部类编译后.class文件命名:外部类$内部类.class*/class Heart{public String beat(){eat();return age+"岁的心脏会跳动";}}}

PeopleTest类

package com.hala.people;public class PeppleTest {public static void main(String[] args) {Person lili=new Person();lili.age=12;//获取内部类对象实例,方式1:new 外部类.new 内部类//这里注意会出现0岁是因为此方法重新定义了一个Person不是liliPerson.Heart myHeart=new Person().new Heart();System.out.println(myHeart.beat());//获取内部类对象实例,方式2:外部类对象.new 内部类myHeart=lili.new Heart();System.out.println(myHeart.beat());//获取内部类对象实例,方式3:外部类对象.获取方法myHeart=lili.getHeart();System.out.println(myHeart.beat());}}

输出结果

人会吃东西
0岁的心脏会跳动
人会吃东西
12岁的心脏会跳动
人会吃东西
12岁的心脏会跳动

内部类与外部类同名属性情况

class Heart{int age=14;public String beat(){eat();return age+"岁的心脏会跳动";}}}

输出结果

人会吃东西
14岁的心脏会跳动
人会吃东西
14岁的心脏会跳动
人会吃东西
14岁的心脏会跳动

同名情况调用外部类信息

 class Heart{int age=14;public String beat(){eat();return Person.this.age+"岁的心脏会跳动";}}}

输出结果

人会吃东西
0岁的心脏会跳动
人会吃东西
12岁的心脏会跳动
人会吃东西
12岁的心脏会跳动

⚠️查看项目在系统中目录结构方法:右键项目->show in->System Explorer

外部类调用内部类信息

package com.hala.people;public class Person {int age;public Heart getHeart(){new Heart().age=13;return new Heart();}public void eat(){System.out.println("人会吃东西");}class Heart{int age=14;public String beat(){eat();return Person.this.age+"岁的心脏会跳动";}}}

内部类编译后.class文件命名

静态内部类

Person类

package com.hala.people;public class Person {int age;static int month=3;public Heart getHeart(){new Heart().age=13;return new Heart();}public void eat(){System.out.println("人会吃东西");}//静态内部类/** 1.静态内部类中,只能直接访问外部类的静态成员,如果需要调用非静态成员,可以通过对象实例* 2.静态内部类对象实例化时,可以不依赖于外部类对象* 3.可以通过外部类.内部类.静态成员的方式,访问内部类中的静态成员* 4.当内部类属性与外部类属性相同时,默认会直接调用内部类属性*   如果需要访问外部类中的静态属性,方法:外部类.属性*   如果需要访问外部类的非静态属性,方法:new 外部类().属性*/static class Heart{int age=14;public static void say(){System.out.println("hello");}public String beat(){new Person().eat();return new Person().age+"岁"+Person.month+"月的心脏会跳动";}}}

PeopleTest类

package com.hala.people;public class PeppleTest {public static void main(String[] args) {Person lili=new Person();lili.age=12;//获取静态内部类对象实例Person.Heart myHeart=new Person.Heart();System.out.println(myHeart.beat());Person.Heart.say();}}

输出结果

人会吃东西
0岁3月的心脏会跳动
hello

方法内部类(局部内部类)

Person类

package com.hala.people;public class Person {int age;public Object getHeart() {//方法内部类/** 1.定义在方法内部,作用范围也在方法内* 2.和方法内部成员使用规则一样,class前不允许添加public,private,protected,static* 3.类中不能包含静态成员* 4.类中可以包含final,abstract修饰的成员*/class Heart {int age = 14;public void say() {System.out.println("hello");}public String beat() {say();return new Person().age+"岁的心脏在跳动";}}return new Heart().beat();}}

PeopleTest类

package com.hala.people;public class PeppleTest {public static void main(String[] args) {Person lili=new Person();lili.age=12;System.out.println(lili.getHeart());}}

输出结果

hello
0岁的心脏在跳动

方法内部类文件命名的不同之处

匿名内部类

Person类

package com.hala.people;public abstract class Person {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void read();}

PeopleTest类

package com.hala.people;public class PeopleTest {public void getRead(Person person){person.read();}public static void main(String[] args) {PeopleTest test=new PeopleTest(); //匿名内部类/** 1.匿名内部类没有类型名称,没有实例对象名称* 2.无法使用private,abstract,static 等修饰* 3.无法编写构造方法,但可以添加构造代码块* 4.不能出现静态成员,abstaract方法* 5.匿名内部类可以实现接口也可以继承父类,但只能二选一*/test.getRead(new Person(){@Overridepublic void read() {// TODO Auto-generated method stubSystem.out.println("男人喜欢看科幻小说");}});test.getRead(new Person(){@Overridepublic void read() {// TODO Auto-generated method stubSystem.out.println("女生喜欢读言情小说");}});}}

输出结果

男人喜欢看科幻小说
女生喜欢读言情小说

匿名内部类文件命名

匿名内部类补充详解

接口中的内部类

Android 之路18---Java基础12相关推荐

  1. 【程序员养成之路】Java基础篇 8-流进流出的IO流(二)

    以下内容若有误,欢迎私信我或在下方留言,谢谢^_− 目录 IO流(二) 1.特殊操作流 1.1 标准流 1.2 打印流 1.3 对象序列化流 1.4 Properties 拓展1:比较字节流和字节缓冲 ...

  2. Android面试准备之Java基础

    一.Java基础知识 1 什么是面向对象,谈谈你对面向对象的理解 对比面向过程,是两种不同的处理问题的角度,面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者.及各自需要做什么. 三 ...

  3. JAVA 基础 12月06日 第一天

    今天重新复习了一下java基础 java语言的写作规范: 变量名称及项目名命名规范:: 变量名,属性名,方法名一律按照驼峰命名法: 类名 项目名首字母大写: 常量名全大写: 数据各式各样要根据需求(数 ...

  4. 【成神之路】Java基础相关面试题

    面向对象的特征: 继承.封装和多态 final, finally, finalize 的区别 final final关键字可以用于类,方法,变量前,用来表示该关键字修饰的类,方法,变量具有不可变的特性 ...

  5. 【全栈之路】JAVA基础课程四_生产者消费者问题(20190614v1.1)

    欢迎进入JAVA基础课程 博客地址:https://segmentfault.com/a/1190000019482921 本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总结,不管是 ...

  6. Android 之路68---动画基础

    导读 1.逐帧动画 2.视图动画 3.速率插值器 4.属性动画 逐帧动画 逐帧动画是将静态图片连起来播放形成动画 创建loading.xml 文件 loading.xml <?xml versi ...

  7. 【java基础 12】HashMap中是如何形成环形链表的?

    导读:经过前面的博客总结,可以知道的是,HashMap是有一个一维数组和一个链表组成,从而得知,在解决冲突问题时,hashmap选择的是链地址法.为什么HashMap会用一个数组这链表组成,当时给出的 ...

  8. JavaSE 18 Java基础语法 → 标识符关键字

    4.2 标识符和关键字 4.2.1 标识符 标识符是 $.下划线和字母开头,然后又由下划线.字母.数字组成,不能有特殊符号,也不能是关键字!标识符 对大小写是 非常敏感的.(当然可以 使用 中文 命名 ...

  9. Java基础12 多态

    作者:Vamei 出处:http://www.cnblogs.com/vamei 我们之前使用类创造新的类型(type),并使用继承来便利我们创建类的过程.我将在这一讲中深入类型,并介绍多态(poly ...

  10. 小W的Java学习之路:java基础(四)-数组

    1.为什么要有数组? 数组可以存储相同类型的多个数据,把多个数据放在一个数组中方便使用如果只需要定义一个变量需要数组么?不需要 2.数组的定义 动态初始化:数据类型[] 数组名 = new 数据类型[ ...

最新文章

  1. 怎么使图表居中显示_文字怎么排版又精美又好看?
  2. Zabbix 监控Mysql 主从状态(Python脚本)
  3. java使用eclipse打jar包_Eclipse对Java项目打Jar包
  4. Truncate a string
  5. Spring MVC 基础注解之@RequestMapping、@Controller、(二)
  6. c语言链表把多少分以上打出来,大神帮我看一下怎么输入输出一个链表,我输入了但是没输出啊...
  7. ApplePay集成教程
  8. Leetcode#102Binary Tree Level Order Traversal
  9. 高斯投影坐标计算例题_利用MAPGIS软件进行投影变换
  10. setup the printer on ubuntu for uniofsurrey
  11. 程序员初学者参考 ---懂得基础语法后如何做一个自己的case?
  12. [高光谱] 在开源项目Hyperspectral-Classification Pytorch中加入自己的网络
  13. 小甲鱼C++笔记(上)1-24
  14. 计算机在现代设计技术中应用,计算机技术在现代建筑设计中的应用
  15. python网络爬虫课程设计报告摘要_网络爬虫课程设计报告
  16. [论文阅读] | Graph U-Nets
  17. 计算机基础知识整理大全
  18. 原来把300页Word转成PPT,只需要一个键!别再复制粘贴了
  19. Luogu P1540 机器翻译
  20. Python | 查看微信撤回的消息(完整代码)

热门文章

  1. 决策树(Decision Tree)算法原理总结(二)
  2. 系统级编程语言性能大PK的笑话-Go语言
  3. 【NOIP%你题】【线性筛】dun题解
  4. 一键生成各种姿势的火柴人gif:在线录制真人视频即可转换 | 代码开源
  5. 游泳各种姿势大全 -图文 【好东西收藏之】
  6. 怎么在vue中发起数据请求
  7. Win7下安装Ubuntu11.10(解决linux try(hd0,0):NTFS5:no ang0引导问题)
  8. elasticsearch插件一——-head插件安装详解
  9. arm编程语言基础c,ARM基础:ARM 伪指令详解
  10. hdoj 1864 最大报销额 【01背包】||【dfs】