java基础总结_06
来源:互联网 发布:sonar.java.binaries 编辑:程序博客网 时间:2024/05/21 22:53
面向对象(下)
1:final关键字(掌握)(1)是最终的意思,可以修饰类,方法,变量。(2)特点: A:它修饰的类,不能被继承。 B:它修饰的方法,不能被重写。 C:它修饰的变量,是一个常量。(3)面试相关: A:局部变量 a:基本类型 值不能发生改变 b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的 B:初始化时机 a:只能初始化一次。 b:常见的给值 定义的时候。(推荐) 构造方法中。2:多态 (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:向下转型 从父到子3:抽象类 (1)把多个共性的东西提取到一个类中,这是继承的做法。 但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体。 也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。 所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。 而一个没有具体的方法体的方法是抽象的方法。 在一个类中如果有抽象方法,该类必须定义为抽象类。 (2)抽象类的特点 A:抽象类和抽象方法必须用关键字abstract修饰 B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类 C:抽象类不能实例化 D:抽象类的子类 a:是一个抽象类。 b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。 (3)抽象类的成员特点: A:成员变量 有变量,有常量 B:构造方法 有构造方法 C:成员方法 有抽象,有非抽象 (4)抽象类的练习 A:猫狗案例练习 B:老师案例练习 C:学生案例练习 D:员工案例练习 (5)抽象类的几个小问题 A:抽象类有构造方法,不能实例化,那么构造方法有什么用? 用于子类访问父类数据的初始化 B:一个类如果没有抽象方法,却定义为了抽象类,有什么用? 为了不让创建对象 C:abstract不能和哪些关键字共存 a:final 冲突 b:private 冲突 c:static 无意义4:接口 (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:成员区别 抽象类: 接口: B:关系区别: 类与类: 类与接口: 接口与接口: C:设计理念不同 抽象类:is a,抽象类中定义的是共性功能。 接口:like a,接口中定义的是扩展功能。 (6)练习: A:猫狗案例,加入跳高功能 B:老师和学生案例,加入抽烟功能05:形式参数和返回值的问题 (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的是该类的子类对象 接口名:返回的是该接口的实现类的对象 (3)链式编程 对象.方法1().方法2().......方法n(); 这种用法:其实在方法1()调用完毕后,应该一个对象; 方法2()调用完毕后,应该返回一个对象。 方法n()调用完毕后,可能是对象,也可以不是对象。6:包 (1)其实就是文件夹 (2)作用: A:区分同名的类 B:对类进行分类管理 a:按照功能分 b:按照模块分 (3)包的定义(掌握) package 包名; 多级包用.分开。 (4)注意事项:(掌握) A:package语句必须在文件中的第一条有效语句 B:在一个java文件中,只能有一个package C:如果没有package,默认就是无包名 (5)带包的编译和运行 A:手动式 B:自动式(掌握) javac -d . HelloWorld.java7:导包(掌握) (1)我们多次使用一个带包的类,非常的麻烦,这个时候,Java就提供了一个关键字import。 (2)格式: import 包名...类名; 另一种: import 包名...*;(不建议) (3)package,import,class的顺序 package > import > class8:权限修饰符(掌握) (1)权限修饰符 本类 同一个包下 不同包下的子类 不同包下的无关类 private Y 默认 Y Y protected Y Y Y public Y Y Y Y (2)这四种权限修饰符在任意时刻只能出现一种。 public class Demo {} 9:常见的修饰符 (1)分类: 权限修饰符:private,默认,protected,public 状态修饰符:static,final 抽象修饰符:abstract (2)常见的类及其组成的修饰 类: 默认,public,final,abstract 常用的:public 成员变量: private,默认,protected,public,static,final 常用的:private 构造方法: private,默认,protected,public 常用的:public 成员方法: private,默认,protected,public,static,final,abstract 常用的:public (3)另外比较常见的: public static final int X = 10; public static void show() {} public final void show() {} public abstract void show();10:内部类 (1)把类定义在另一个类的内部,该类就被称为内部类。 举例:把类B定义在类A中,类B就被称为内部类。 (2)内部类的访问规则 A:可以直接访问外部类的成员,包括私有 B:外部类要想访问内部类成员,必须创建对象 (3)内部类的分类 A:成员内部类 B:局部内部类 (4)成员内部类 A:private 为了数据的安全性 B:static 为了访问的方便性 成员内部类不是静态的: 外部类名.内部类名 对象名 = new 外部类名.new 内部类名(); 成员内部类是静态的: 外部类名.内部类名 对象名 = new 外部类名.内部类名(); (5)成员内部类的面试题(填空) 30,20,10 class Outer { public int num = 10; class Inner { public int num = 20; public viod show() { int num = 30; System.out.println(num); System.out.println(this.num); System.out.println(Outer.this.num); } } } (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" } }
1 0
- java基础总结_06
- Java学习之旅_基础篇_06
- Java学习笔记_06
- JavaScript基础_06数组及数组方法
- 前端学习_06.Script语法基础
- C#之入门总结_继承_06
- JAVA语言学习_06(关于占位符)
- java并发编程实践_06任务执行
- 黑马程序员_Java基础_面向对象(二)_06
- JAVA高级01_06 Hashtable类 2011-4-20
- Java千百问_06数据结构(009)_void是什么
- Java千百问_06数据结构(010)_Class类型是什么
- Java千百问_06数据结构(020)_String是什么
- 【总结】Java基础总结⑵
- 【总结】Java基础总结⑶
- 【总结】Java基础总结⑷
- 【总结】Java基础总结⑸
- 【总结】Java基础总结⑹
- 工厂模式
- I.MX6启动流程
- 0722
- sip协议理解记录
- Hbase入门
- java基础总结_06
- 有序数组创建高度最小的二叉查找树
- POJ 1753 Flip Game (状态压缩+BFS) -- 解题报告
- Android子线程居然可以更新UI?
- 以前遗留下的一个问题(关于手机解锁)
- python 下载百度贴吧图片
- Log4j使用详解
- jsp静态包含和动态包含的区别?
- 统计单词数