引文:

本文将涉及Java中abstract关键字,接口和内部类的语法与细节~

一、abstract

1.1案例引入

需求:现在我们要设计一个Person类一个工作方法,然后让Student类和Teacher类继承Person类,在Student类和Teacher类中重写Person类的工作方法.

public class test {public static void main(String[] args) {}
}
class Person{public void work(){System.out.println();}
}class Student extends Person{@Overridepublic void work() {System.out.println("学生正在上课~");}
}class Teacher extends Person{@Overridepublic void work() {System.out.println("老师正在教书~");}
}

此时我们发现Person类中的work()方法该写啥呢?貌似写啥都不对,很尴尬。

此时,我们可以将这个方法声明为抽象方法!

于是我们在方法前面加上abstract关键字。

翻译:在非抽象中抽象方法

所以说当一个类中存在抽象方法是,也需要将这个类声明为抽象类!

由于这个抽象方法你不知道咋写,所以语法规则也让你不要再写方法体了!

1.2 abstract使用语法

  1. 用abstract来修饰一份类时,这个类为抽象类

  1. 用abstract来修饰一份方法时,这个类为抽象方法 注意:抽象方法没有方法体!

  1. 抽象类的价值在于让子类继承并实现抽象方法

1.3 abstract使用细节

  1. 抽象类不能实例化,即你不能创建抽象类对象

  1. 抽象类可以没有抽象方法,但抽象方法一定在抽象类中

  1. abstract只能修饰类和方法,不能修饰属性

  1. 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非自己声明为抽象类(打不过就加入)

  1. 抽象方法不能是用private、final、static来修饰,与重写相违背

private: 私有方法无法被子类访问,谈嘛重写呢

final:本来就是为了不让重写才加的

static: 本来写static是为了能用类来直接调用,而abstract是为了让子类重写,而且抽象方法没有方法体,所以从语法层根本不让你过。

二、接口

2.1接口VS抽象类

接口的使用也是为了重写方法。

这不是跟抽象类的使用差不多吗?有啥区别呢?有抽象类不就够了吗

  1. 抽象类也是继承,只是明确了某些方法必须重写,根本还是为了解决代发的复用性和可维护性

  1. 接口更强调设计方法,让其他类去实现这些方法

  1. 抽象类是继承,满数的关系:is - a, 而接口值只满足 like - a

举个例子:坤坤是个人,所以他可以继承Person类,他会唱跳rap篮球,这些是他后天学习得来的,用接口来实现更合理

2.2基本介绍与语法

介绍:接口就是给出一些没有实现的方法(抽象方法),封装到一起,某个类要使用的时候,再实现出来。

语法:

interface MyInterface{ //接口//属性//方法//1.抽象方法 2.默认实现方法 3.静态方法
}class A implements MyInterface{//必须实现接口的抽象方法
}

注意:Jdk8.0后接口可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现

2.3接口使用细节

  1. 接口不能被实例化(与抽象类类似)

  1. 接口中所有的方法都是public的和abstract的,如果你没写,会自动认为。

  1. 如果一个普通类implements了接口,就必须将接口中所有的抽象方法实现。

  1. 抽象类implements了接口,可以不用实现接口的方法

  1. 一个类可以implements多个接口

  1. 接口中的属性会被默认为public static final

  1. 接口不能继承其他类,但能继承接口

三、内部类

3.1基本介绍

简单来说就类套类,是类的五大成员(属性、方法、构造器、代码块、内部类)

class Outer{ //外部类class Inner{//内部类}
}

3.2局部内部类

局部内部类就是放在外部类的方法中的类

显然局部内部类可以访问外部类中所有成员,包括私有的,因为属于本类

那外部内如何访问局部内部类呢?

public class InnerClass{public static void main(String[] args) {Outer outer = new Outer();outer.fun();}
}class Outer{ //外部类public void fun(){//方法class localInner{//局部内部类public void say(){System.out.println("你好,我是内部局部类~");}    }localInner localInner = new localInner();localInner.say();}
}

在含有局部内部类的方法中创建对象调用方法,在main方法中再创建外部类的对象调用方法。

注意:当外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,可以使用

外部类.this.成员

3.3匿名内部类

匿名内部类就是没有名字的局部内部类

语法:

new 类或接口(参数列表){};
public class Test {public static void main(String[] args) {new Person(){@Overridepublic void say() {System.out.println("我是匿名内部类~");}}.say();}
}class Person{public void say(){System.out.println("Hello~");}
}

甚至我们还能这样调用!

public class Test {public static void main(String[] args) {Speak speak = new Speak(){public void say(){System.out.println("嘻嘻~");}};speak.say();}
}interface Speak{public void say();
}

乍一看,咦,这不是接口实例化了吗?其实并没有,但是匿名内部类在作用

我们先看speak这个引用,他的编译类型为Speak,那运行类型呢?就是匿名内部类!

我们可以通过getclass这个方法看到他的“名字”

所以本质上是这样的:Speak speak = new Test$1 implements Speak;

类似于继承中的向上转型。

应用:

需求:假设我们现在想要养一只小狗,我们可以立马命令小狗做事。

class Dog{private String name;public Dog(String name) {this.name = name;}public String getName() {return name;}public void Doing(Order order){order.action();}
}interface Order{public void action();
}

如果我们不适用匿名内部类的话,我们每要让小狗做一个事情,就需要实现一个类来实现接口,很麻烦。

但是我们可以使用匿名内部类来简化代码。

public class Test {public static void main(String[] args) {Dog dog = new Dog("小黄");dog.Doing(new Order() {@Overridepublic void action() {System.out.println("小狗汪汪叫~");}});dog.Doing(new Order() {@Overridepublic void action() {System.out.println("小狗去睡觉~");}});}
}

对于第四行本质上:Order order = new Test$1 implements Order

由于重写,会执行{}内中action的方法。

十分方便,对于只是用一次的方法可以写成匿名内部类的形式。

3.4成员内部类

成员内部类是定义在外部类的成员位置上

特点:

  1. 可以直接访问外部类中的所有成员(私有也可以)

  1. 可以添加访问修饰符(private....),因为他的地位就是一个成员

  1. 外部其他类访问成员内部类

方法1:

public class Test {public static void main(String[] args) {AAA aaa = new AAA();AAA.BBB bbb = aaa.new BBB();bbb.say();}
}class AAA{class BBB{public int n1 = 10;public void say(){System.out.println("你好~");}}
}

aaa.new BBB()相当于 把 new BBB()当做是aaa的成员

方法2:

public class A {public static void main(String[] args) {AAA aaa = new AAA();AAA.BBB b = aaa.getBBB();}
}class AAA{class BBB{public int n1 = 10;public void say(){System.out.println("你好~");}}public BBB getBBB(){return new BBB();}
}

让这个类返回就行

3.5静态成员内部类

在成员内部类前加上static

特点:

  1. 只能访问外部类的所有静态成员,非静态成员不可访问

  1. 可以添加访问修饰符(private....),因为他的地位就是一个成员

  1. 外部其他类访问成员内部类

public class A {public static void main(String[] args) {AAA.BBB b = new AAA.BBB(); //不同于非静态的创建b.say();}
}class AAA{static class BBB{public int n1 = 10;public void say(){System.out.println("你好~");}}public BBB getBBB(){return new BBB();}
}

因为是静态的,可以直接通过类名直接访问.

本人是java小白,如有问题请指出。

为什么你找不到对象,因为都是抽象的~相关推荐

  1. 为什么程序员都找不到对象?

    为什么程序员都找不到对象 我是程序员 我也没有对象- -.我能怎么办 我也很绝望啊.. 抛开那些名花名草有主的人,剩下的都是单身汪了,眼瞅着马上就是老大不小了,看着你们这般捉急达妹表示也是可以理解的! ...

  2. feignclient对象找不到_为什么我找不到对象呢,一个33岁大龄剩女的疑惑

    小木是我朋友,属兔今年33了.不仅我觉的她很优秀,周围的人也觉得她很优秀,但就是现在还单身.下面是她的疑惑. 我各方面条件都还行,为什么找不到对象呢? 性格:温和,善良,阳光,有主见.(对待事物有自己 ...

  3. feignclient对象找不到_成都附近有什么相亲活动?为什么有些人就是找不到对象?梨子游玩...

    成都附近有什么相亲活动吗? 现在这个时代,到了25岁如果还没有脱单,家里就会特别着急,开始给你安排各种相亲,介绍各种对象,还会让你在各种相亲网站发征婚贴.在我们大成都,出了发征婚帖和家里介绍还有什么脱 ...

  4. 程序员找不到对象是因为还没遇到一个有远见的丈母娘

    当别人在放肆秀恩爱的时候,程序员单身狗们在角落里瑟瑟发抖.别人去网站相亲找到对象,程序员去相亲找到BUG.其实,你找不到对象是因为你还没遇到一个有远见的丈母娘. 都说程序员很难找到对象,就知道整天对着 ...

  5. Exchange2007客户端收发邮件时找不到对象

    故障: outlook客户端收发邮件的时候报错找不到对象, 但是收发邮件功能正常<?xml:namespace prefix = v ns = "urn:schemas-microso ...

  6. springboot找不到对象(自动注入失败)

    springboot找不到对象(自动注入失败) 今天在idea重新建立个springboot项目时,遇到这个奇怪的问题,说是找不到对应的bean,我猜想是@Mapper的问题 Error starti ...

  7. r语言lm函数找不到对象_怎么才能查看R语言某个包某函数源码?

    方法一:直接写函数名称,如在R中查看回归分析代码: lm 直接可以查看到 function (formula, data, subset, weights, na.action, method = & ...

  8. 为毛程序猿总是找不到对象?

    C#和JAVA都有对象,但是经常找不到对象.ASM和C直接没有对象.javascript都是伪对象,最多算暧昧-- 1.程序员为毛找不到女朋友? 程序员问禅师:"大师,我身体健康,思想端正, ...

  9. 为什么程序员“找不到对象”!几张图告诉你

    人生第四大错觉:程序员找不到对象! 1.群嘲面向对象编程 来自外界的满满恶意 2.别太苛刻程序员 程序员御用催婚图 3.都回家了还盯着电脑,看看我会死啊? 都回家了!还敲什么代码?都这样了还死盯着电脑 ...

  10. python找不到对象怎么办_你为什么总找不到对象

    不知道某个时间点,你是否会对着美颜相机中的自己顾影自怜,这么帅,这么有才华,为何还找不着对象呢?这个不是我能解决的问题.今天我们要给大家解决的技术问题是"Object not found&q ...

最新文章

  1. 你只写了两行代码,为什么要花两天时间?
  2. 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
  3. 运动检测 背景减除(Background Segment)
  4. asp.net core 使用 TestServer 来做集成测试
  5. 设计模式学习笔记-代理模式
  6. 靶场练习第十二天~vulnhub靶场之dc-4
  7. airtest web 录制滑块_Airtest之web自动化(一)
  8. LeetCode 1066. 校园自行车分配 II(状态压缩DP)
  9. 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。
  10. 几个容易混淆的对齐概念
  11. Lc695-岛屿的最大面积
  12. android隐藏桌面图标
  13. CVPR 2022 Self-augmented Unpaired Image Dehazing via Density and Depth Decomposition个人学习笔记
  14. Python,海龟作图,闪避球小游戏
  15. 基于机智云平台的智能花盆
  16. android开发中磁场传感器,Android传感器(加速度传感器,磁场传感器,光线传感器,方向传感器)...
  17. 腾讯云个人账号如何多开注册8个新用户账号
  18. Linux Update
  19. 城市交通(动态规划)
  20. 软考信息安全工程师笔记(第一章--信息安全基础)

热门文章

  1. 零食怎么做免费引流?零食微商免费引流技巧
  2. 【经典算法学习-排序篇】直接选择排序
  3. Vijos P1404 遭遇战
  4. Python Pytest自动化测试 断言失败后续代码继续执行
  5. Swiftlint代码规范属性说明
  6. c语言readline库6,6.35. Readline-6.3
  7. apple耳机与nokia耳机内部电路
  8. springboot加入swagger
  9. HTML基础知识学习
  10. openwrt 下调试实现wifi 开启/关闭及设置指示灯