权限修饰符:
java提供了三种访问权限,准确的说还有一种是默认的访问权限,加上它一共四种。
封装:是指隐藏对象的属性和实现细节,不允许外部直接访问,仅对外提供公共访问方式,这里就会用到一个关键字是private,在后面的使用成员变量时候,不能直接调动,只能通过方法调用;
特点:1.只能通过规定的方法访问数据。
2.隐藏类的实例细节,方便修改和实现。
如何进行封装:
(1)私有化成员变量,使用private关键字修饰;
(2)提供公有的get和set方法,在方法体中进行合理值的判断,使用public关键字修饰;
什么是继承:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
实现:在Java中,使用extends关键字实现继承,extends后跟的是父类名,也就是它从哪个类继承过来的,而用extends的这个类本身称为子类。
在java中,只允许单继承,也就是说 一个类最多只能显示地继承于一个父类。但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。
1.子类继承父类的成员变量
当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
2.子类继承父类的方法
同样地,子类也并不是完全继承父类的所有方法。
1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员方法,如果在子类中出现了同名的成员方法,称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。
3.构造器
子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。
4.super
super主要有两种用法:
1)super.成员变量/super.成员方法;
2)super(parameter1,parameter2....)
第一种用法主要用来在子类中调用父类的同名成员变量或者方法;第二种主要用在子类的构造器中显示地调用父类的构造器,要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。
多态的概述:
1、多态现实意义理解
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
2、多态体现为父类引用变量可以指向子类对象。
3、前提条件:必须有子父类关系。
注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
4、多态的定义与使用格式
定义格式:父类类型 变量名=new 子类类型();
5、理解:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态中成员的特点:
1、多态成员变量:编译运行看左边(因为方法可以重写,成员变量不可重写)。
Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
2、多态成员方法:编译看左边,运行看右边。
Fu f1=new Zi();
System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
多态的转型:
1、向上转型:多态本身就是向上转型过的过程。
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
2、向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型。
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
instanceof关键字:
作用:用来判断某个对象是否属于某种数据类型。返回的是布尔类型。
概述:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
为什么抽象类不能直接实例化呢?
当一个类实例化之后,就意味着这个对象可以调用类中的属性或者方法了,但在抽象类里存在抽象方法,而抽象方法没有方法体,没有方法体就无法进行调用。既然无法进行方法调用的话,又怎么去产生实例化对象呢。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
抽象类的特点:
注意:虽然一个类的子类可以去继承任意的一个普通类,可是从开发的实际要求来讲,普通类尽量不要去继承另外一个普通类,而是去继承抽象类。
抽象类的使用限制:
(1)抽象类中有构造方法么?
由于抽象类里会存在一些属性,那么抽象类中一定存在构造方法,其存在目的是为了属性的初始化。
并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。
(2)抽象类可以用final声明么?
不能,因为抽象类必须有子类,而final定义的类不能有子类;
(3)抽象类能否使用static声明?
不可以,static修饰的类,不可以被继承。
(4)可以直接调用抽象类中用static声明的方法么?
任何时候都可以,如果要执行类中的static方法的时候,都可以在没有对象的情况下直接调用,对于抽象类也一样。
(5)抽象类能够使用private修饰吗?
不可以,如果为private,则不能被子类继承,子类便无法实现该方法。
首先我们需要知道,Java语言只支持单重继承,不支持多继承。这句话的意思就是一个类只能有一个父类,但我们经常需要使用多继承来解决问题,所以Java语言提供了接口来实现类的多重继承功能。
接口描述:接口就是一种公共的规范标准,更多体现在对行为的抽象。
接口的特点:没有构造方法,只能通过实现该接口,以多态的形式进行创建对象。子类必须重写接口中的所有抽象方法,或者该子类就是抽象类。
抽象类与接口的区别:
成员区别:抽象类有常量、变量、构造方法、抽象方法,非抽象方法。接口只有常量,抽象方法。
继承区别:抽象类只能单继承,可以多层继承。接口可以多实现。
设计理念:抽象类主要是属性,接口主要是行为。
接口的定义:
Java中使用interface来定义一个接口,接口定义与类相似(类的定义用的是class)。
接口的实现:
实现接口需要在类中用implements关键字,可以多实现,接口中的方法必须都要重写。