Java学习笔记(三)

来源:互联网 发布:软件服务器租用 编辑:程序博客网 时间:2024/06/11 03:11

1、继承
a、提高了代码的复用性
b、让类与类之间产生了关系。有了这个关系才有了多态的特性。
注意:千万不能为了简化代码而继承;必须是类与类之间有所属关系才可以继承。继承的所属关系是: is - a。
在Java语言中:Java只支持单继承,不支持多继承 因为多继承容易带来安全隐患,比如:当多个父类中定义了相同功能,功能内容不同时,子类对象不确定要运行哪一个。但是Java保留了这种机制,并用另一种形式来完成:多实现。
Java支持多层继承,也就是说一个继承体系。如何使用一个继承体系中的功能呢?
先查阅父类的描述,因为父类中定义的是该体系的共性功能。
在具体的调用时要创建最子类的对象,因为:
1、有可能父类不能创建对象
2、创建子类对象可以使用更多的功能,包括基本的功能和特有的功能。
总之:查阅父类功能,创建子类对象使用

2、子父类出现后,类成员(变量、函数、构造函数)的特点
1、变量
如果子父类中出现非私有的同名成员变量时,this访问本类中的变量,super访问父类的同名变量
this代表的是本类对象的引用
super代表的是父类对象的引用
2、子父类中的函数
当子父类出现和父类一模一样的函数时,子类对象调用该函数会运行子类函数的内容,这种情况叫覆盖(重写)
覆盖:保留父类的功能定义,并重写功能内容
注意:
a、子类覆盖父类,必须保证子类权限大于等于父类权限才可以覆盖
b、静态不能覆盖非静态
重载:只看同名函数的参数列表
重写:子父类方法要一样
3、构造函数
在对子类对象进行初始化时,父类的构造函数也会运行,是因为子类构造函数默认第一行有一条隐式语句:super()
super():访问父类中空参数的构造函数,而且子类中所有构造函数默认第一行都是super()
3、子类的实例化过程
结论:子类的所有构造函数,默认都会访问父类中空参数的构造函数。当父类中没有空参数的构造函数时,子类必须手动的通过super语句来指定访问的父类构造函数。当然,子类中的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。
4、final关键字
final:一个修饰符。可以修饰类、函数、变量
被final修饰的类不可以被继承。为了避免类被继承、被子类复写,用final修饰这个类;
被final修饰的方法不可以被复写;
被final修饰的变量是一个常量且只能赋值一次,既可以修饰成员变量,也可以修饰局部变量;
内部类定义在类中的局部位置时,只能访问该局部被final修饰的局部变量。
5、抽象类
特点:
1、抽象方法定义在抽象类中;
2、抽象类和抽象方法都被abstract关键字修饰;
3、抽象类不可以用new创建对象。因为调用抽象方法没有意义
4、抽象类中的方法使用:由子类复写所有的抽象方法后建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类仍然是一个抽象类。
注意:抽象类中可以不定义抽象方法,只是为了不让类创建对象。
6、接口interface
class 用于定义类
interface用于定义接口,主要是用于功能扩展
接口的定义的格式特点:
a、接口中常见的定义:常量、抽象方法
b、接口的成员都有固定的修饰符
常量:public static final
方法:public abstract
注意:接口中的成员都是public的
如:

interface inter{    public static final int num = 3;//public 、static 、public 在开发时可以省略    public abstract void show();//public、abstract也可以省略}

类与类的关系是:继承(extends)
类与接口的关系是:实现(implements)
接口与接口的关系是:继承,且接口之间支持多继承
接口支持多实现
接口不可以创建对象,因为有抽象方法。需要被子类实现,子类要对接口中的抽象方法全都覆盖后,子类才可以实例化。否则接口也是一个抽象类。
7、多态
多态的体现:父类引用指向子类对象
多态的前提:必须是类与类之间有关系,并且存在覆盖
多态的好处:提高程序扩展性
多态的弊端:只能使用父类的引用访问父类中的成员
例:

Animal a = new Cat();//类型提升(猫->动物)。向上转型//如要调用Cat的特有方法需要强转,将父类引用转成子类类型。向下转换Cat c = (Cat)a;//千万不要将父类对象转成子类类型。如://Animal a = new Animal();//Cat c = (Cat)a;//这种操作错误!

多态非静态成员函数的特点:
在编译时期,参阅引用型变量所属的类中是否有调用的方法;
在运行时期,参阅对象所属的类中是否有调用的方法。(先找子类,子类没有找父类)
简单来说,在多态调用时成员函数的编译看左边,运行看右边
多态成员变量和静态成员函数的特点:
无论编译或是运行,都参考左边(引用型变量所属的类)
8、内部类
内部类的访问规则:
内部类可以直接访问外部类中的成员,包括私有;(因为持有外部类的引用,即外部类名.this);
外部类要访问内部类,必须建立内部类对象;
例如:

class Outer{    private int n=1;    class Inner{//内部类        int n=2;        void function(){            int n=3;            System.out.println(n);//直接访问外部类成员;//访问内部类局部变量            System.out.println(this.n);//访问内部类成员变量            System.out.println(Outer.this.n);//访问外部类成员变量        }    }    void method(){        Inner in = new Inner();//建立内部类对象        in.function();    }}

a、当内部类定义在成员位置上时:
内部类可以被private、static 修饰。
外部类直接访问static内部类中的非静态成员:new Outer.Inner().function();
外部类直接访问static内部类的静态成员:Outer.Inner.function();
注意:当内部类中定义了静态成员,或者当外部类中的静态方法访问内部类中的方法,该内部类必须是static
b、当内部类定义在局部时:
不可以被private、static修饰;
可以直接访问外部类中的成员,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
什么时候使用内部类?当描述事物时,事物的内部还有事物,该事物用内部类来描述。
9、匿名内部类
a、匿名内部类就是内部类的简写格式;
b、定义匿名内部类的前提:内部类必须是继承一个类或者实现接口;
c、格式:new 父类或接口( ).{定义子类内容}
d、匿名内部类就是匿名子类对象;
e、匿名内部类中定义的方法最好不要超过3个;

0 0
原创粉丝点击