Java学习笔记之面向对象2

时间:2023-02-25 23:33:10

Java学习笔记之面向对象2

一、面向对象中的类及其成员的修饰符和作用

权限修饰符:private 、默认(什么都不写)、protected 、public(权限从小到大)

状态修饰符:static final

抽象修饰符:abstract

类:

权限修饰符:默认和public两种,常用的是 public,作用对外提供访问权限。

状态修饰符:final,表示该类是最终类不能被其他类继承,但可以创建对象。

注意:在java的JDK中被final修饰的类不能被继承!!!

抽象修饰符:abstract,表示该类是抽象类,不能直接创建对象,只能被继承,通过子类或多态的方式来创建对象。抽象类可以不包含抽象方法,但包含抽象方

法的类一定是抽象类。

成员变量:

权限修饰符:private 、默认 、protected 、public,最常用的是 private,用于封装成员变量,保护数据的安全,且该变量只在本类中才能访问。

状态修饰符:static、final。被static修饰的成员变量也叫类变量可以由类名.变量名的方式直接访问,此时该变量被这个类的全体对象所共享;被final修饰的

变量,其值不可以被改变。二者可以同时使用。

构造方法:

权限修饰符:private、默认、protected 、public,最常用的是 public,当构造方法被private修饰时表示该构造方法不能用来new出对象。

成员方法:

权限修饰符:private、默认、protected、public,最常用的是 public,对外提供访问权限。被private修饰的成员方法只在本类中才能访问。

状态修饰符:static、final,被static修饰的成员变量也叫类变量可以由类名.方法

名的方式直接访问;被final修饰的方法不能被子类重写,二者可以同时使用。

抽象修饰符:abstract,被abstract修饰的成员方法称为抽象方法,该方法只有声 明没有方法体,只能被子类重写。

       注意:抽象修饰符abstract不能和private、final、static一起使用。

二、成员变量和局部变量的区别

在类中的位置不同

成员变量:在类中方法外

局部变量:在方法定义中或者方法声明上

在内存中的位置不同

成员变量:在堆内存分配存储空间

局部变量:在栈内存分配存储空间

生命周期不同

成员变量:随着对象的创建而存在,随着对象的消失而消失

局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

初始化值不同

成员变量:有默认初始化值。

局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

注意:定义变量的时候,尽可能将这个变量的使用范围最小化,能定义成局部变量,就 不定义成成员变量

三、静态变量和成员变量的区别

       所属不同:

              静态变量属于类,所以也称为为类变量

              成员变量属于对象,所以也称为实例变量(对象变量)

       内存中位置不同:

              静态变量存储于内存中的data数据区。

              成员变量存储于堆内存

       内存出现时间不同:

              静态变量随着类的加载而加载,随着类的消失而消失

              成员变量随着对象的创建而存在,随着对象的消失而消失

       调用不同:

              静态变量可以通过类名调用,也可以通过对象调用

              成员变量只能通过对象名调用

四、静态的作用,特点?为什么静态不能访问非静态?

static关键字可以修饰成员变量和成员方法,方便我们使用,无需创建对象,直接用类 名.静态方法名/变量名即可调用,节约堆区的开销。

       static关键字特点:

静态所修饰的成员,随着类的加载而加载,优先于对象存在,会被该类的所有对象共享。

static关键字注意事项:

在静态方法中是没有this关键字,静态方法只能访问静态的成员变量和静态的成员方法,简而言之静态只能访问静态。

五、静态代码块和构造代码块的区别,静态代码块、构造代码块、构造方法的执行顺序

静态代码块:只执行一次,以后创建再创建多少个对象,都不会执行;

构造代码块:每创建一个对象,就会执行一次;

执行顺序:先执行所有的静态代码块,再执行所有的构造代码块,最后执行构造方法。

六、this和super的区别

this代表本类对应的引用,用来解决成员变量与局部变量重名问题。

this关键字代表所在类的对象引用,方法被哪个对象调用,this就代表那个对象。

Super:代表父类引用。

Java里的子类用super调用父类构造函数时,调用的函数必须放在子类的第一条语句的位置。可以在子类中用super关键字调用父类中非私有的成员变量和成员方法。

七、重写和重载的区别?

重写Override:指子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写,与返回值类型无关。

注意:父类中私有方法不能被重写,子类重写父类方法时,访问权限不能更低。

如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

重载Overload:表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各 不相同(即参数个数或类型不同)。

八、抽象类和接口的区别

抽象类:abstract修饰的类即为抽象类,抽象类不能创建实例对象。含有abstract方法的类必须定义为抽象类,抽象类中可以没有抽象方法。抽象类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口:可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为publicstatic final。

两者的语法区别

1. 抽象类可以有构造方法,接口中不能有构造方法。

2. 抽象类中可以有普通成员变量,接口中没有普通成员变量

3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以使public、protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认修饰即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public staticfinal类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

九、内部类和匿名内部类

         内部类:

把一个类定义在其他类的内部,这个类就被称为内部类。例如:

class Outer{
classInner{}//内部类
}

特点:

内部类可以直接访问外部类的成员,包括私有。

外部类要访问内部类的成员,必须创建对象。

内部类的分类:

成员内部类:类中方法外

局部内部类:方法内

静态内部类:

成员内部类的使用格式:

外部类名.内部类名 对象名 = new 外部类名().new 内部类名();

成员内部类的修饰符:

private: 提高安全性

static : 方便内部类的访问

局部内部类可以访问方法中的局部变量,但该变量必须被final修饰,因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰该变量,这样在堆内存里面存储的其实是一个常量值。

匿名内部类:

就是没有名字的内部类,它是内部类的简化写法,匿名内部类本质就是一个继承了类或者实现了接口的子类匿名对象。

匿名内部类理解为继承了一个类或者是实现了一个接口的子类,并且完成了子类对象的创建,同时子类对象没有名字,是对象的一种简化表示形式。

前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类。

         格式:

new 类名或者接口名() {
重写方法;
};

匿名对象的两种使用情况:

对象调用方法仅仅一次的时候

newStudent().study();

 好处:当方法调用完毕后,这个对象就成为了垃圾,会被JVM的垃圾回收器清理

作为实际参数传递

t.method( newStudent() );

十、什么是包package,什么是import;package,import和class之间有何关系?

包就是一个文件夹,用来存储多个.class类的,对类进行分类管理。

包的格式:package 包名,多级包之间,使用.分隔。

注意:package语句必须是程序的第一条可执行的代码。

package语句在一个java文件中只能有一个,如果没有package,默认表示无包名。

可以有多个import,可以有多个class,通常一个java文件中对应一个类。

Import表示同包下类之间的访问

导包格式:import 包名.类名(类名可以用通配符*代替,不建议这样使用)

三者之间的的关系是:package--> import --> class

十一、类与类、类和接口、接口和接口的关系

类与类:java中的类是单继承关系,可以多层继承。

类与接口:实现关系,可以实现一个接口,也可以同时实现多个接口。

接口与接口:继承,单继承,多继承

十二、java中的多态

概述:某一个事物,在不同时刻表现出来的不同状态

多态前提和体现

1: 要有继承关系

2:  要进行方法重写(可以不从写,但那样就失去继承的意义)

3: 父类的引用 指向 子类对象

Fu fu = new Zi();

成员访问特点

成员变量:编译看左边,运行看左边。

构造方法:给对象中的成员进行初始化操作使用。

成员方法:(方法重写,方法覆盖)       编译看左边,运行看右边。

静态方法:静态方法没有方法重写,静态方法是类方法,编译看左边,运行看左边。

注意:成员方法的运行看右边, 其他情况都是看左边

       多态的好处:提高了程序的维护性(由继承保证),提高了程序的扩展性(由多态保证)。

       多态的弊端:不能访问子类特有功能

       多态中的转型问题

       向上转型:

Animal an = newCat();
父类引用 指向 子类对象
左边 (父类型) = 右边 (子类型)

向下转型:

Cat cat = (Cat)an;
父类引用转为子类对象,需要通过强制转换来完成
左边(子类类型) = 右边(父类类型)

方法的重写区别:

子类没有重写父类方法:编译看左边的父类方法,运行是父类方法(方法从父类继承过来的)。

子类重写了父类方法:编译看左边的父类方法,运行看右边的子类方法。