-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------
子父类中的函数
当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子函数的内容。 如同父类的函数被覆盖一样。
这种情况是函数的另一种特性:复写(覆盖)
覆盖:
子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。
静态只能覆盖静态。
子类中的构造函数
在子类对象进行初始化时,父类的构造函数也会运行
那是因为子类的构造函数默认第一行有一条隐式的语句 super();
Super会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
为什么子类一定要访问父类的构造函数。
因为父类中的数据子类可以直接获取,所以子类对象在建立时需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化时要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
子类的实例化过程。
结论:子类中的所有的构造函数,默认都会访问父类中空参数的构造函数。
因为子类每一个构造函数内都有一句隐式的super()语句
当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形成来指定要访问的构造函数。
Super 与this不能同时出现在构造函数中。
因为他们都要写在第一行。
抽象类
当多个类中出现相同功能,但是功能主体不同。
这是可以进行向上抽取。这时,抽取功能定义,而不抽取功能主体。
抽象类的特点:
1. 抽象方法一定在抽象类中。
2. 抽象方法和抽象类都必须被abstract关键子修饰。
3. 抽象类不可以用new创建对象,因为调用抽象方法没意义。
4. 抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。
5. 如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
6. 抽象类里面即可以有抽象方法,也可以有非抽象方法。
7. 抽象类中可以不定义抽象方法。
接口
接口:初期理解,可以认为是一个特殊的抽象类。
当抽象类中的方法都是抽象的,可以用接口来描述。
接口定义时,格式特点:
1. 接口中常见定义:常量,抽象方法。
2. 接口中的成员都有固定的修饰符。
常量:public static final
方法:public abstract
3. 接口中的成员都是public
接口:是不可以创建对象的,因为有抽象方法。
需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。
否则子类是一个抽象类。
接口可以被类多实现。一个类可以实现多个接口。
接口是对外暴露的规则。
接口是程序的功能扩展。
接口可以用来多实现。
类与接口之间是实现关系,而且类可以继承一个类的同时,实现多个接口。
接口和接口之间可以有继承关系。
内部类
内部类访问规则:
1. 内部类可以直接访问外部类的成员,包括私有。
2. 之所以可以直接访问外部类的成员,是因为内部类中持有了一个外部类的引用,格式:外部类.this
3. 外部类要访问内部类,必须建立内部类对象。
访问格式:
当内部类定义在外部类的成员位置上,而且非私有,可以在外部其它类中。
可以直接建立内部类对象。
格式:外部类.内部类 变量名 = 外部类对象.内部类对象;
Outer.Inner in = new Outer().new Inner();
内部类在成员位置上,就可以被成员位置符所修饰。
比如:private 将内部类在外部类中进行封装。
Static 内部类就具备static的特性。
当内部类被静态修饰后,只能访问外部类中的静态成员了。出现了访问局限。
在外部其他类中,如何直接访问静态内部类?
在外部其他类中,如何直接访问静态内部类的非静态成员呢?
new Outer.Inner().function();
在外部其他类中,如何直接访问静态内部类的静态成员呢?
Outer.Inner.function();
注意:当内部类中定义了静态成员,该内部类必须是静态的。
当外部类中的静态方法,访问内部类时,内部类也必须是静态的。
局部内部类:在外部类的方法中定义的内部类
与局部变量类似,在局部内部类前不可以加修饰符public和private,其作用域为定义它的代码块。
局部内部类不仅可以访问外部类的实例变量,还可以访问外部类的局部变量,但要求外部类的局部变量必须为final的。
配合接口使用,来做到强制弱耦合。
在外部类的外部不可创建局部内部类对象,只能在局部内部类所在的方法中创建:
Innerin = new Inner();
成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列
在内部类中可以直接访问外部类的私有属性。
内部类和外部类的实例变量允许命名冲突。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性
在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。
Outer out = new Outer();
Outer.Inner in = out.new Inner();
在本类内部生成内部类对象的方式:
在静态方法中:Inner in = new Outer().new Inner();
在非静态方法中:Inner in = this.new Inner();
成员内部类不可以有静态成员,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建。
匿名内部类:一种特殊的局部内部类
没有名字,也没有class、extends、implements关键字
用一种隐含的方式实现一个接口或继承一个类,并且只能创建一次实例。
实现方式:在某个语句中,new父类/父接口名字(){类体中实现方法 }
例如:
TreesSetts = new TreeSet(new Comparator(){
publicint compare(Object o1, Object o2){
return0;
}
});
匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。
匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须合类名相同,而匿名内部类没有类名。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
详情请查看: