黑马程序员 JavaSE-06 面向对象(下)
来源:互联网 发布:centos lamp环境搭建 编辑:程序博客网 时间:2024/05/01 07:45
Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
JavaSE-06 面向对象(下)
继承
(1)概念:
把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些内容。这个关系叫继承。
(2)格式
A:用关键字extends表示 B:格式: class 子类名 extends 父类名 {}
(3)继承的好处
A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类产生了一个关系,是多态的前提
(4)继承的弊端
A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。 原则:低耦合,高内聚。 耦合:类与类的关系 内聚:自己完成某件事情的能力 B:打破了封装性
(5)Java中继承的特点
A:Java中类只支持单继承 B:Java中可以多层(重)继承(继承体系)
(6)继承的注意事项:
A:子类不能继承父类的私有成员 B:子类不能继承父类的构造方法,但是可以通过super去访问 C:不要为了部分功能而去继承
(7)什么时候使用继承呢?
A:继承体现的是:is a的关系。 B:采用假设法
(8)Java继承中的成员关系
A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单 b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子类的方法访问变量的查找顺序: 在子类方法的局部范围找,有就使用。 在子类的成员范围找,有就使用。 在父类的成员范围找,有就使用。 找不到,就报错。 B:构造方法 a:子类的构造方法默认会去访问父类的无参构造方法 是为了子类访问父类数据的初始化 b:父类中如果没有无参构造方法,怎么办? 子类通过super去明确调用带参构造 子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造 让父类提供无参构造 C:成员方法 a:子类的成员方法和父类中的成员方法名称不一样,这个太简单 b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢? 通过子类对象访问一个方法的查找顺序: 在子类中找,有就使用 在父类中找,有就使用 找不到,就报错
多态
(1)同一个对象在不同时刻体现出来的不同状态。
(2)多态的前提
A:有继承或者实现关系。 B:有方法重写。 C:有父类或者父接口引用指向子类对象。 多态的分类: a:具体类多态 class Fu {} class Zi extends Fu {} Fu f = new Zi(); b:抽象类多态 abstract class Fu {} class Zi extends Fu {} Fu f = new Zi(); c:接口多态 interface Fu {} class Zi implements Fu {} Fu f = new Zi();
(3)多态中的成员访问特点
A:成员变量 编译看左边,运行看左边 B:构造方法 子类的构造都会默认访问父类构造 C:成员方法 编译看左边,运行看右边 D:静态方法 编译看左边,运行看左边 为什么? 因为成员方法有重写。
(4)多态的好处
A:提高代码的维护性(继承体现) B:提高代码的扩展性(多态体现)
(5)多态的弊端
父不能使用子的特有功能。 现象: 子可以当作父使用,父不能当作子使用。
(6)多态中的转型
A:向上转型 从子到父 B:向下转型 从父到子
抽象类
(1)基本概念
抽象方法:一个没有具体的方法体的方法是抽象的方法。抽象类:在一个类中如果有抽象方法,该类必须定义为抽象类。
(2)抽象类的特点
A:抽象类和抽象方法必须用关键字abstract修饰 B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类 C:抽象类不能实例化 D:抽象类的子类 a:是一个抽象类。 b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
(3)抽象类的成员特点
A:成员变量 有变量,有常量 B:构造方法 有构造方法 C:成员方法 有抽象,有非抽象
(4)抽象类的几个小问题
A:抽象类有构造方法,不能实例化,那么构造方法有什么用? 用于子类访问父类数据的初始化 B:一个类如果没有抽象方法,却定义为了抽象类,有什么用? 为了不让创建对象 C:abstract不能和哪些关键字共存 a:final 冲突 b:private 冲突 c:static 无意义
接口
(1)概念
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
(2)接口的特点
A:接口用关键字interface修饰 interface 接口名 {} B:类实现接口用implements修饰 class 类名 implements 接口名 {} C:接口不能实例化 D:接口的实现类 a:是一个抽象类。 b:是一个具体类,这个类必须重写接口中的所有抽象方法。
(3)接口的成员特点:
A:成员变量 只能是常量 默认修饰符:public static final B:构造方法 没有构造方法 C:成员方法 只能是抽象的 默认修饰符:public abstract
(4)类与类,类与接口,接口与接口
A:类与类 继承关系,只能单继承,可以多层继承 B:类与接口 实现关系,可以单实现,也可以多实现。 还可以在继承一个类的同时,实现多个接口 C:接口与接口 继承关系,可以单继承,也可以多继承
(5)抽象类和接口的区别
A:成员区别 抽象类:有变量,有常量 接口:只能是常量,默认修饰符:public abstract B:关系区别: 类与类:继承关系,只能单继承 类与接口:实现关系,可以单实现,也可以多实现 接口与接口:继承关系,可以单继承,也可以多继承 C:设计理念不同 抽象类:is a,抽象类中定义的是共性功能。 接口:like a,接口中定义的是扩展功能。
包和导包
(1)包的概念:其实就是文件夹
(2)包的作用:
A:区分同名的类 B:对类进行分类管理 a:按照功能分 b:按照模块分
(3)包的定义
package 包名; 多级包用.分开。
(4)注意事项
A:package语句必须在文件中的第一条有效语句 B:在一个java文件中,只能有一个package C:如果没有package,默认就是无包名
(5)带包的编译和运行
A:手动式 B:自动式(掌握) javac -d . HelloWorld.java
(6)导包格式
import 包名...类名; 另一种: import 包名...*;(不建议)
(7)package,import,class的顺序
package > import > class
权限修饰符
本类 同一个包下 不同包下的子类 不同包下的无关类 private Y default Y Y protected Y Y Y public Y Y Y Y
内部类
(1)概念:
把类定义在另一个类的内部,该类就被称为内部类。 举例:把类B定义在类A中,类B就被称为内部类。
(2)内部类的访问规则
A:可以直接访问外部类的成员,包括私有 B:外部类要想访问内部类成员,必须创建对象
(3)内部类的分类
A:成员内部类 B:局部内部类
(4)成员内部类
A:private 为了数据的安全性 B:static 为了访问的方便性 成员内部类不是静态的: 外部类名.内部类名 对象名 = new 外部类名.new 内部类名(); 成员内部类是静态的: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
(5)成员内部类的面试题(填空)
class Outer { public int num = 10; class Inner { public int num = 20; public viod show() { int num = 30; System.out.println(num);//30 System.out.println(this.num);//20 System.out.println(Outer.this.num);//10 } } }
(6)局部内部类
A:局部内部类访问局部变量必须加final修饰。 B:为什么呢? 因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。 所以,堆内存还是用该变量,而改变量已经没有了。 为了让该值还存在,就加final修饰。 通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
(7)匿名内部类(掌握)
A:是局部内部类的简化形式 B:前提 存在一个类或者接口 C:格式: new 类名或者接口名() { 重写方法; } D:本质: 其实是继承该类或者实现接口的子类匿名对象
(8)匿名内部类在开发中的使用
我们在开发的时候,会看到抽象类,或者接口作为参数。 而这个时候,我们知道实际需要的是一个子类对象。 如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。 interface Person { public abstract void study(); } class PersonDemo { public void method(Person p) { p.study(); } } class PersonTest { public static void main(String[] args) { PersonDemo pd = new PersonDemo(); pd.method(new Person() { public void study() { System.out.println("好好学习,天天向上"); } }); } }
(9)匿名内部类的面试题(补齐代码)
interface Inter { void show(); } class Outer { //补齐代码 public static Inter method() { return new Inter() { public void show() { System.out.println("HelloWorld"); } }; } } class OuterDemo { public static void main(String[] args) { Outer.method().show(); //"HelloWorld" } }
0 0
- 黑马程序员 JavaSE-06 面向对象(下)
- 黑马程序员-JAVASE入门(面向对象,单例模式)
- 黑马程序员 JavaSE-05 面向对象(上)
- 黑马程序员----【javaSE基础】复习--面向对象
- 黑马程序员-javaSE学习之面向对象
- 黑马程序员—javaSE—面向对象
- 黑马程序员_面向对象(下)
- 黑马程序员_面向对象(下)
- 黑马程序员 — 面向对象(下)
- 黑马程序员 面向对象(下)
- 黑马程序员_Java面向对象(下)
- 黑马程序员-2.面向对象(下)
- 黑马程序员-----面向对象(下)
- 黑马程序员—面向对象(下)
- 黑马程序员-------面向对象(下)
- 黑马程序员-面向对象下
- 黑马程序员>>>面向对象[>下<]
- 黑马程序员--面向对象(下)
- Android 实现滑动的几种方法(三)scrollTo 与 scrollBy
- 最短路径-弗洛伊德算法
- s3c2440 usb host
- 博客的开始,介绍一些自己,我是这样的一个程序员
- Mysql日志详解
- 黑马程序员 JavaSE-06 面向对象(下)
- 断点续传的原理剖析与实例讲解
- INVALID_USER_SCODE
- debug和release版本dll混用导致的问题
- struts动态方法调用
- java IO 流 读写文件 以及复制
- HDU 5570 balls
- FT Introduction
- COMPSAC峰会