不允许使用抽象类类型的对象怎么办_面向对象(深化)-Java基础知识入门(5)...

2f913db2c51bb012819b4dc07397508f.png

1.什么是抽象类?

用abstract 修饰的类就是抽象类。

dff9cd26a06c5937d0d5ac221412e0d2.png
图1. 抽象类的定义

1.1抽象类的特点:抽象类可以有构造方法,不可以创建对象。

1.2 抽象类中可以包含哪些成员呢?:

(1) 成员变量(实例变量/属性)

(2) 成员方法/实例方法。

(3) 静态方法。

(4) 构造方法。

(5) Final修饰的方法,(只能被子类调用,不允许被子类重写)。

(6) 抽象方法。

2. 什么是抽象方法?

  • 使用abstract修饰的方法称为抽象方法。

抽象方法的特征:

(1) 抽象方法不允许有方法体,只能以分号“;”结尾。

(2) 抽象方法只能声明在抽象类中(含有抽象方法的类只能是抽象类)

(3) 抽象类中可以包含0个或多个抽象方法。

(4) 抽象方法必须被子类实现。

(5) 如果子类不能实现父类中的抽象方法,name子类也必须是抽象类。

总结:abstract 可以修饰类和方法。

2.1 什么情况下使用抽象方法?

  • 通过抽象类,可以避免子类设计的随意性。透过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。(程序的可扩展和可维护性)

2.2 什么情况下使用抽象类: 父类的名称比较抽象,创建对象无意义。

3. 什么是接口?

接口:如果一个类中所有的方法均为abstract 方法,那么这个类就可以被声明为接口。

接口的定义: 使用 interface修饰,是一种数据类型,引用数据类型。

8700bdd36adcb565d0770cd75ad00e26.png
图2. 不使用接口的类

上面代码可以改写为:

用 interface 创建文件:用interface 声明以后,可以省略abstract关键字。

6da0b2d9599118a45267ead986708bf2.png
图3. interface修饰的MyInterface

3.1 接口中可以包含哪些内容?

(1) 抽象方法(接口中的抽象方法均为public abstract修饰的方法

(2) 非抽象方法。(JDK1.8改版以后才可以,JDK1.8以前不能有非抽象方法。非抽象方法必须使用public default 关键字修饰

38d536d1cd3d1110172dda531ff0f40b.png
图4. 非抽象方法

(3) 属性(必须是 public static final 修饰的常量。)

1e079d4e474ec43a7aec3ef5e90db65e.png
图5. 属性

接口中中不能定义构造方法,原因:接口不是类。

3.2 接口和类的关系?

  • 类去实现接口中的抽象方法,实现关系。 Implements。

87921d3d7c047bf7a2dd7dba5dd6e2fb.png
图6. implements实现
  • 若干重要问题:

(1)一个类存在继承关系,又存在实现关系,extends 前? Implements 前?

继承 –-> 父子关系 --> 亲爹。

实现 –-> 实现关系 -à 干爹。

Extends 在前, implements 在后。

a6976cad9c8db1bcea506d88c76401a3.png
图7. Extends 在前, implements 在后

(2) 如果父类与接口中有完全相同的方法(一模一样),子类/实现类所实现的方法是父类的? 还是接口的?

  • 父类优先于接口,子类实现的是父类的方法。

(3)如果父类中与接口中有同名方法,对子类/ 实现类有什么要求呢?

  • 父类与接口中的方法,在子类/实现类中构成方法的重载。

3.3 使用接口的意义

可以实现设计和实现的分离。抽象出N多不同类的共同点。

接口: has –a的关系。接口是有什么功能。

继承: is – a 的关系。继承是是一个什么功能。

(1) 接口有哪些特征?

  • 接口的传递性
  • 接口的继承性(多继承)。

(2) 使用接口实现多态的步骤?

(1)编写接口,

(2)实现类实现接口中的方法。

(3)接口(类型)new实现类对象。

4.内部类:将一个类定义在另一个类的内部,该类就称为内部类。

4. 1. 内部类有以下特点?

(1)内部类作为外部类的成员,可以直接访问外部类的成员,

包括(private成员),反之则不行。

(2)内部类作为外部类成员,可声明为private、默认,protected 或public。

(3)内部类成员只有在内部类的范围内是有效的。

(4)用内部类定义在外部类中不可访问的属性,这样就在外部中实现了比内部类的private还要小的访问权限。

99d70fb52b906612b899db0d93b37c87.png
图8. 内部类创建实例

内部类的优缺点:

  • 优点:内部类可以直接访问外部类的私有属性。
  • 缺点:破坏了类的结构。

当内部类与外部类有相同的属性时,在访问外部类的属性时,需要加上外部类的 类名.this.属性。

6b5e65e76d568bdc972f2dd9d5b67f43.png
图9. 内部类访问外部类的属性

4.2 内部类可以分以下几类:

(1)成员内部类(内部类相当于外部类的成员)。

(2) 静态内部类。

cf40522dc6c73cf1d2094fab4a998e97.png
图10. 静态内部类声明

静态内部类:

  • 不允许访问外部类的非Static属性。
  • 如果内部类中的方法为static方法,那么内部类也必须为静态的

155dfb0e37a5b5e588d0437ec28e7e9c.png
图11. 静态内部类方法为Static

(3) 方法内部类。

只能在方法中使用,相当于方法中的局部变量。

JDK1.8新特性

(a). JDK 1.8 之前方法中的内部类要访问外部类的局部变量,必须加上final关键字(常量)。

(b). 从JDK1.8开始,在访问外部类的局部变量时,则可以不加final关键字。

(4) 匿名内部类(前提:存在继承或者实现关系

(a).可以实现一个接口,或者继承一个父类。

(b).只能实现一个接口。

(c). 适合创建那种只需要一次使用的类,不能重复使用。比较常见的是在图形界面编程的GUI中用的比较多。

63ebb7751b38ba078e0550711dcfa8ec.png
图12. 匿名内部类

5. String类

String类的本质:String类相当于char类型的数组,数组的长度一旦创建不能更改,value的数组还使用了final进行修饰。

String comparable : Comparable的实现原理:

求两个字符串的长度的最小值,使用循环,比较对应位置上的字母,如果不相同,则对应位置上字母相减。如果相同,则是两个字符串的长度相减。

b562db40e7381e301ee665b1dc761568.png
图13. String类的比较原理1

e6aec07c71bad60908e1ae535692b829.png
图14.String类的比较原理2

5.1 String类的常用构造方法:

9cd2eeeaecdcdd5b4bf355f0e5d76f5d.png
图15.String类的常用构造方法

298d00adb25a96d30e7d0341327efc6f.png
图16. String类的常用构造方法

6.常量池:

常量池:

用于存储在编译期确定,并被保存在已编译的字节码文件中的一些数据,包括final修饰变量及字符串变量,和符号引用量。

95b8cd75628f00f2e4f096f2ae48b069.png
图17. 常量池

7. “==” 和 equals方法的区别?

==

  • 比较两个字符串内存地址是否相等

Equals(object obj) :

  • 用于比较两个字符串对象的内容是否相等。

4596936f043029bfcda9610ed1c8f56c.png
图18. equals和“==”方法比较

98439b3cabbc5b3893860af795b8abae.png
图19. equals底层源码分析

1.先判断两个数据类型是否相等,如果相等则继续比较,如果不相等,则直接返回false。

2.比较对应位置上的字符是否相等,如果所有对象位置上字符都相等,返回true,否则返回false。

3. 如果字符串对象的上的字符对应位置相等,一个比另一个字符串长度要短,比如:A= “abc”, B = "abcdefg"; 则比较两个字符串的长度,长度不同则返回A.length - B.length 。

4be9e071d4bbd738210a1d49c27b371d.png
图20. equals方法比较的实质

8. 二维数组的遍历:

  • 两个普通for循环。

030d03e3743f25caa3496957ece5af3e.png
图21.二维数组的遍历1
  • 两个加强for循环:

0b986b0d64701520d40a3e9f530c132b.png
图22.二维数组的遍历2
  • 外层普通for循环,内层加强for循环。
  • 外层加强for循环,内层普通for循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值