| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Java的第一遍学习笔记 面向对象高级 -> 正文阅读 |
|
[Java知识库]Java的第一遍学习笔记 面向对象高级 |
finalfinal可以修饰类、属性、方法和局部变量。 使用1. 当不希望类被继承时,可以用final修饰。 2. 当不希望父类的某个方法被子类 重写 时,可以用final关键字修饰。 3. 当不希望类的某个属性的值被修改,可以用final修饰。 4. 当不希望某个局部变量被修饰,可以使用final修饰。
注意事项1. final修饰的属性又叫常量,一般用 XX_XX_XX命名(比如 TAX_RATE)。
2. final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在下列位置之一:(1)定义时? (2) 在构造器中? (3) 在代码块中(代码块相当于构造器的补充) 3. 如果final修饰的属性是静态的,则初始化位置只能是:(1) 定义时? (2) 在静态代码块,不能在构造器中赋值(因为可以用类名调用静态属性,并没有调用构造器)。 4. final类不能继承,但是可以创建对象(实例化)。 5. 如果类不是final类,但是含有final方法,虽然该方法不能重写,但是可以被继承。
6. 一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法(因为根本就无法继承,也就没办法重写方法了)。 7. final不能修饰构造器。 8. final和static往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理。
9. 包装类(Integer,Double,Float,Boolean等)都是final,String也是final类。 抽象类? ? 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,然后再用abstract来修饰该类,这个类就是抽象类。
? ? 所谓抽象方法就是没有实现的方法(没有方法体),当一个类中存在抽象方法时,需要将该类声明为abstract方法。一般来说,抽象类会被继承,由其子类来实现抽象方法。 简介1. 用 abstract 关键字来修饰一个类时,这个类就叫抽象类。
2. 用 abstract 关键字来修饰一个方法时,这个方法就是抽象方法。
3. 抽象类的价值更多作用是在于设计,设计者设计好后,让子类继承并实现抽象类,在框架和设计模式使用较多(常考)。 注意事项1. 抽象类不能被实例化。 2. 抽象类可以没有abstract方法。 3. 一旦类包含了abstract方法,则这个类必须声明为abstract。 4. abstract 只能修饰类和方法,不能修饰属性和其它的。 5. 抽象类可以有任意成员(因为抽象类还是类),比如:非抽象方法,构造器,静态属性等等。 6. 抽象方法不能有主体,即不能有大括号。
7. 如果一个类继承了抽象类,那么它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。 ?8. 抽象方法不能使用 private, final 和 static来修饰,因为这些关键字都是和重写相违背的。 private不能重写,static与重写无关。? 关于static可以看这个博客:关于abstract为什么不能和static连用_sinat_36695865的博客-CSDN博客 模板设计模式
? ? 这个设计模式的好处就是 —— 把需要重写的方法做成 抽象方法写在抽象父类中,子类只需要把不同的代码重写即可,相同部分的方法写在抽象类中,?子类不需要动,在测试类中实例化对象直接调用即可。 接口基本介绍? ? 接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。
注:1. 在Jdk7.0 之前,接口里的所有方法都没有方法体,即都是抽象方法(abstract可省略)。2. Jdk8.0 后,接口可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现。
注意事项1. 接口不能被实例化。
2. 接口中所有的方法都是public方法,接口中抽象方法可以不用abstract修饰。
如何验证:
3. 一个普通类实现接口,就必须将该接口的所有抽象方法实现,快捷键:点击要实现接口的名字,按 Alt + Enter ,点击 Implement methods,然后选中要实现的方法。 4. 抽象类实现接口,可以不用实现接口的抽象方法。 5. 一个类可以同时实现多个接口,中间用逗号隔开。
6. 接口中的属性,前面默认有 public static final 修饰符,必须初始化。 7. 接口中属性的访问形式:接口名.属性名
8. 一个接口不能继承其他的类,但是可以继承多个别的接口。
9. 接口的修饰符只能是 public 和 默认,这点和类的修饰符是一样的。
10. 用对象名可以调用接口中的属性(另外也可以用类名和接口名调用),但是IDEA没有提示。
11. 有继承还有接口的类,如果接口和父类某个属性重名,调用时要用接口名和super指定。?
与继承的比较? ? 当子类继承了父类,就自动的拥有父类的功能(类似父子关系),如果子类需要扩展功能,就可以通过实现接口的方式扩展(类似师徒关系)。比如说金丝猴继承猴子类,拥有了一些猴子的属性,如果金丝猴想要游泳和飞翔,那么就需要实现鱼和鸟的接口。可以理解为:实现接口是对Java单继承机制的一种补充。 ? ? 继承的价值主要在于:解决代码的复用性和可维护性。 ? ? 接口的价值主要在于:设计好各种方法,让其它类去实现这些方法。继承是满足 is - a 关系,而接口只需要满足 like - a 关系即可,接口比继承更加灵活。并且接口在一定程度上实现代码解耦。 接口的多态性1. 多态参数 ? ? ? ?Usb接口参数既可以接收手机对象,又可以接收电脑对象,接口引用可以指向实现了接口的类的对象。
?2. 多态数组
? 由于能调用什么方法是根据编译类型来的,因此想调用call方法需要用到向下转型(类似)。 3. 多态传递现象
? ? 很明显,Person类并没有实现IA接口,但是却可以用IA来实例化对象。原因是Person实现了IB接口,而IB接口继承自IA,Person类把IB和IA接口的方法全部实现,相当于实现了IA。 ? ? 简而言之,类需要把implements接口的方法,以及接口父类的方法全部实现,然后可以用接口以及接口的子类实例化对象。 内部类(难点、重点)基本介绍? ? ?一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类,嵌套内部类的类称为外部类,是我们类的第五大成员(五大成员:属性、方法、构造器、代码块、内部类)内部类的最大特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
内部类的分类1. 定义在外部类的局部位置上(比如方法内):A. 局部内部类(有类名) B. 匿名内部类(没有类名,重点) 2. 定义在外部类的成员位置上:A. 成员内部类(没用static修饰)B. 静态内部类(使用static修饰) 局部内部类1. 可以直接访问外部类的所有成员,包括私有的。 2. 不能添加访问修饰符,因为它相当于一个局部变量,局部变量是不能使用修饰符的,但是可以使用final修饰,因为局部变量也可以使用final。 3. 作用域:仅仅在定义它的方法或代码块中。 4. 外部类 访问 局部内部类的成员:创建对象再访问(必须在作用域内)。 5. 局部内部类 访问 外部类成员:直接访问。
6. 外部其它类不能访问 局部内部类(因为 局部内部类相当于一个局部变量)。 7. 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用 外部类名.this.成员 去访问,其中 外部类名.this 相当于外部类。
匿名内部类? ? 定义在外部类的局部位置,并且没有类名。(1)本质是类 (2)该类没有名字 (3)同时还是一个对象。 接口:
??实际上Jdk底层会给 匿名内部类 分配一个类名,分配的方法为 外部类类名+$(可用tiger的getClass方法查看),然后立即创建一个 Outer$1实例,并且把地址赋给 tiger。
类:
注意事项1. 匿名内部类既是一个类的定义,同时它本身也是一个对象(本身就是个返回对象)。因此从语法上看,它既有定义类的特征,也有创建对象的特征,因此可以直接调用匿名内部类方法。
3. 可以直接访问外部类的所有成员,包含私有的。 4. 不能添加访问修饰符,因为它的地位就是一个局部变量。 5. 作用域:仅仅在定义它的方法或代码块中。 6. 匿名内部类 访问 外部类成员:直接访问。 7. 外部其它类 不能访问 匿名内部类(因为匿名内部类建立之后就销毁了)。 8. 如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用 外部类名.this.成员 去访问。 实例当作实参直接传递,简洁高效。
对比一下传统方法
成员内部类成员内部类定义在外部类的成员位置,并且没有static修饰。 1. 可以直接访问外部类的所有成员包含私有的。 2. 可以添加任意访问修饰符,因为它的地位就是一个成员。 3. 作用域:和外部类的其他成员一样,为整个类。 4. 成员内部类 访问 外部类成员:直接访问。 5. 外部类 访问 成员内部类:创建对象再访问。
6. 外部其它类 访问 成员内部类 第一种方式:把 Inner01 看作 Outer01 的成员,Outer01.Inner01 为编译类型,用外部类实例new
第二种方式:在外部类中编写一个方法,可以返回 Inner01 对象
7. 如果外部类和内部类的成员重名时,内部类访问遵循就近原则,如果想访问外部类的成员,则可以使用 外部类名.this.成员 去访问。 静态内部类静态内部类定义在外部类的成员位置,并且有static修饰。 1. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员。 2. 可以添加任意访问修饰符,因为它的地位就是一个成员。 3. 作用域:同其他的成员,为整个类体。 4. 静态内部类 访问 外部类:直接访问所有静态成员。 5. 外部类 访问 静态内部类:先在外部类中创建对象再访问。 6. 外部其它类 访问 静态内部类: 第一种方法:因为是静态内部类,可以通过类名直接访问(满足访问权限)。
第二种方法:编写一个方法,可以返回静态内部类的对象实例。
7. 如果外部类和内部类的成员重名时,内部类访问遵循就近原则,如果想访问外部类的成员,则可以使用 外部类名.成员 去访问(因为 外部类名.this 是对象名,而静态变量可以用类名访问)。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 18:47:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |