面向对象进阶
1、概述:
本章的重点主要是面向对象的三大特征:继承、封装、多态。另外还包括抽象类、接口、内部类等概念。
2、继承
2.1、好处:
继承让我们更加容易实现类的扩展。 比如,我们定义了人类,再定义Boy类就只需要扩展人类即可。实现了代码的重用,不用再重新发明轮子。extends 扩展的意思
2.2、instanceof 运算符
instanceof是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。
if(对象 instanceof 类){ 执行的代码.... }
2.3、继承使用要点
3、子类继承父类后,可以得到父类的全部属性和方法(除了父类的构造方法),但不可以直接访问父类的私有成员(属性和方法)。
2.4、方法的重写
子类通过重写父类的方法,可以用自身的行为替换父类的行为。方法的重写是实现多态的必要条件。
2.5、继承的优点和缺点
1、打破了封装性。对于一些类,或者类中功能,是需要被继承,或者复写的。 这时如何解决问题呢?介绍一个关键字, final : 最终。
总结:继承可以更容易的实现类的扩展,java中类只有单继承。方法的重写实现多态的必要性条件,方法重写的前提是继承,记住方法重写的三要点
3、object 类基本特性
Object类是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。
3.1、tongString 方法
Object类中定义有public String toString()方法,其返回值是 String 类型
3.2、==和equals方法
方法 | 功能 |
== | 代表比较双方是否相同,如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象 |
equals | Object 的 equals 方法默认就是比较两个对象的hashcode |
4、super 关键字
super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
若是构造方法的第一行代码没有显式的调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。
4.1、继承树追溯
5、封装
5.1、概述
5.2、优点
5.3、修饰符
Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。 Java中4种“访问控制符”分别为private、default、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。
5.4、使用细节
总结:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
6、多态
6.1、含义:
6.2、要点:
printer p=new 彩色打印机();
printer p=new 黑白打印机();
6.3、优缺点
6.4、对象转型
父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。
向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型!
7、final 关键字
7.1、作用
8、抽象方法和抽象类
8.1、抽象方法
被abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。
8.2、抽象类
被abstract修饰的类就是抽象类,通过abstract方法定义规范,然后要求子类必须定义具体实现。可以把抽象类看成一个模板,需要子类去实现。
/*抽象类*/
abstract class abstr{
//抽象方法abstract void show();
}
总结:抽象方法没有方法体,只有声明;抽象类不能被实例化(不能代表没有构造函数)。抽象类只能用来被继承。
9、接口(interface)
9.1、概述:
java中的接口是类的蓝图。 它有静态常量和抽象方法。java中的接口是一种实现抽象的机制。 接口中只有抽象方法。接口用于在Java中实现抽象和多重继承。Java接口也表示IS-A关系。它不能像抽象类一样被实例化。从接口的实现者角度看,接口定义了可以向外部提供的服务。从接口的调用者角度看,接口定义了实现者能提供那些服务。接口和实现类不是父子关系,是实现规则的关系。
9.2、声明格式:
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {常量定义; 方法定义;}
9.3、要点
public class Test21 {
public static void main(String[] args) throws Exception {
Test impl=new TestImpl();
impl.show();//调用实现方法
Test.statics();//调用静态方法
}
}
interface Test{
abstract void show();//抽象方法
static void statics() {//静态方法
System.out.println("我是静态方法");
};
}
class TestImpl implements Test {
@Override
public void show() {
System.out.println("我是实现方法");
}
}
10、内部类
10.1、概念:
有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses)。
内部类可以使用public、default、protected 、private以及static修饰。而外部顶级类(我们以前接触的类)只能使用public和default修饰。
public class Testnb {
private int age=10;
String name;
public class Testnbl{
//内部类中可以声明与外部类同名的属性与方法
private int age = 20;
}
}
10.2、作用
10.3、内部类的分类
在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。
成员内部类(可以使用private、default、protected、public任意进行修饰。 类文件:外部类$内部类.class)
静态内部类是外部类的类相关的,而不是外部类的对象相关的。也就是说,静态内部类对象不是寄生在外部类的实例中,而是寄生在外部类的类本身中。
静态内部类看做外部类的一个静态成员。 因此,外部类的方法中可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过 new 静态内部类()访问静态内部类的实例
2. 匿名内部类没有构造方法。因为它连名字都没有那又何来构造方法呢。
public class Test2 {
public void show() {
//作用域仅限于该方法
class Inner {
public void fun() {
System.out.println("helloworld");
}
}
new Inner().fun();
}
public static void main(String[] args) {
new Test2().show();
}
}
总结:内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。
11、String 基础
11.1、常量池
常量池分为为三个:全局字符串常量池、class文件常量池、运行时常量池