1.1.访问控制
1.1.1包(package)
包是一个命名空间,用于组织一组相关的类和接口。主要为了以下功能:
1.解决类命名冲突和类分组的问题,可以理解为通过目录避免类的名称冲突。
2模块划分,可以把同一个功能模块的类放在一个包中 3.更细的访问控制
package package1[.package2....];
用package来声明包,package语句必须是java源文件中的第一条语句。没有package,则放置在默认包下。
在package语句中,用"."来指明包(目录)的层次。包对应着文件系统的目录层次结构。不存在所谓子包。如: com.demo1与com.demo1.test是两个包,不存在父子关系
一般使用公司或组织的域名的倒置+项目名或模块名来表示包名。包名小写。
1.1.1.1导入语句
用import引入类
import package1[.package2...] 、 类名
注意:
1.要导入某个包中的所有类可以用:包名.例如: import java.util.;
2.在同一包中的类可以直接互相引用,无需import语句。
3.静态导入可以导入到方法级别,如: importstaticjava.lang.Math.random;导入后可以直接调用random方法,而不再需要写类名。(了解即可)
1.1.2访问控制符
访问控制符属于修饰符的一种,主要用于确定其他类是否可以使用某个类或者某个类的字段及调用某个类的特定方法。主要用于避免类或者方法的滥用。
访问控制符如下:
1.public:公有,哪里都可用
2.protected:当前包及子类中
3.包(默认):当前包可用
4.private:当类中可用
访问控制符可以出现的场合:
类、接口、抽象类: public、包访问权限
普通方法(类): public.protected、包访问权限、private
接口方法(接口): public、包访问权限
抽象方法(抽象类): public、包访问权限、protected
构造方法: public、protected、包访问权限、private
成员变量(类): public、protected、包访问权限、private
成员变量(接口): public static final
1.1.3封装性
面向对象语言的三大特征:
封装:通过合并特征和行为来创建新的数据类型。通过私有化隐藏实现细节。
继承:通过扩展已有类,生成一种新的类型。
多态:每个对象表现的多样性。
1.1.3.1封装的概念
访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。甘结里是—个同时带有特征和行为的数据类型
然而,人们经常只单独将具体实现的隐藏称做封装。
1.1.3.2成员变量的隐藏
使用private访问权限实现成员变量的私有化,private修饰的成员变量就是私有成员变量,只能在类内部直接访问,类外不能直接访问
get和set方法:get方法表示访问私有属性的方法:
1.1.3.3.3.方法的隐藏
使用private访问权限实现内部方法的私有化,从而避免内部实现被其他程序员乱用。
1.1.4继承
1.1.4.1继承的概念
在原有类的基础上扩展形成一个新类,原有类的成员在新类中都存在,这种机制称为继承。
继承:通过扩展已有类,生成一种新的类型
实现代码的重用和扩展
实现多态的基础
1.1.4.2继承的语法
类修饰符 新类名 extends 已有的类名{
}
extends:明确表示当前类继承某个类,只能继承一个类,Java不支持多重继承;如果没有extends,则默认继承自Object类
被继承的类:父类,超类,基类
继承的类:子类,派生类
继承补充
关键字:extends表示继承,关键字前面的为本类(子类、派生类),关键字之后为被继承的类(父类、超类、基类) *特性:父类的属性的方法将被子类所继承,父类有的子类都有(父类的内容子类都可以使用) *注意:1、在java中只能单继承,之恩那个继承一个父类
-
2、在Java中类可以多重继承;例:父类-->子类-->子类的子类(没有层数限制,但推荐最多三层)
-
3、在继承关系下,子类可以使用父类的可继承内容(方法、属性),父类不可以使用子类任何内容。| *注意:java中所有的类,默认继承object类,object是所有类的父类
-
4、在继承关系下,new子类对象后调用方法的原则为:子类有与父类相同方法则执行子类方法,如果没有则执行父类方法
-
关联属性的原则为:向上转型时,赋值给父类 *覆写(复写):在继承关系下,子类有与父类相同的方法,则称子类覆写(复写)父类方法 *注意:此举中的相同指:
-
修饰符:子类方法范围>=父类方法范围
-
返回值:子类方法返回值与父类相同或为父类返回类型的子类
-
方法名称:相同
-
参数列表:相同,如果不相同,则与父类方法形成重载 * *注解: @override表示覆写,可以省略
1.1.4.3子类对象的实例化过程
先父后子、先静态后非静态、同级别的按位置来
1.父类静态初始化(变量声明处的指定初始化和静态初始化块按写的先后顺序调用)>
⒉子类静态初始化
3.父类非静态初始化(变量声明处的指定初始化和初始化块按写的先后顺序调用)
4.父类的构造方法
5.子类非静态初始化(变量声明处的指定初始化和初始化块按写的先后顺序调用)
6.子类的构造方法
1.1.4.4子类到底继承了什么
父类中的所有内容都被继承了,只是由于访问控制的存在,导致了部分成员不能使用。
1.1.4.5super关键字
super:在子类中用于区分与父类重名的变量和方法(重写),以及在构造方法中明确调用父类特定的构造方法
子类构造方法中,如果没有明确调用父类构造方法,则自调用父类的默认构造方法
注意: super调用构造方法只能是构造方法的第一条语句,super调用在同一个构造方法中只能出现一次
super关键字: 表示当前类对象的父类对象
-
通过super关键字可以关联到父类对象的可访问属性和方法
-
访问父类对象属性:super.属性名称
-
访问父类对象的方法:super.方法名称
-
注意:
-
1、创建子类对象是,将优先加载父类的信息(创建子类对象时,先创建父类对象
-
2、创建对象时,如果没有指定要调用父类的构造函数,则默认调用父类的无参构造函数
-
如果有指定要调用的父类构造函数,则默认的谷类无参构造函数将不被执行
-
3、子类调用父类构造函数时,需要在子类构造函数的第一行调用。其余方式参考this关键字
1.1.4.6方法重写
方法重载:
1.同一个类中,方法名相同,参数列表不同(个数不同,类型不同,顺序不同)
2.和返回值,访问修饰符无关。
子类中重新实现继承过来的某个方法,静态方法不存在重写与否。
1.重写方法时,方法签名(方法名和参数列表)必须和父类一样,其它部分如下:
访问控制符 其他修饰符 返回值 方法名(参数列表) 异常声明
。访问控制符必须━样或者扩大
。其他修饰符必须和父类一样
。返回值必须和父类一样,如果是引用类型,则可以是父类方法返回的子类
。异常声明可以是父类异常声明的子类或者不写
注意:如果方法名和父类相同,参数不同,则子父类方法形成重载。
⒉其它类成员不存在所谓重写,包括成员变量、静态成员变量、初始化块、静态初始化块、构造方法、静态方法,
3.成员变量、静态成员变量、静态方法在子类中可以存在和父类一样的员,但是不存在重写,具体使用子父类中的哪个,和引用型变量有关
4.只要在子类中重写了父类的方法,不管通过什么类型的引用型变量调用类对象的重写方法,调用的一定是子类重写的方法。
1.1.4.7final关键字
final:最终的
在Java中声明类、属性、参数和方法时,可以使用关键字final来修饰。
1.1.4.7.1 final修饰变量
final修饰成员变量或局部变量,则成为(符号)常量,只能赋值一次,变量名用大写字母表示。
·修饰成员变量时,定义时同时给出初始值,或在构造方法中赋值
·修饰局部变量时,只能赋值一次
1.1.4.7.2 final修饰参数
final修饰方法参数,在方法中不能修改参数。基本类型参数不能修改值,引用型不能再指向其他对象。
class 类名{
修饰符 返回值类型 方法名(final 数据类型 参数名){
}
}
1.1.4.7.3final修饰方法
final修饰的方法不能在子类种被重写
class 类名{
final 返回值类型 方法名 (【参数列表】){
}
}
1.1.4.7.4final修饰类
final修饰的类不能被继承
final class 类名{
}
final关键字:表示最终的最后的
*修饰:
-
属性/变量:常量,值不可被改变
-
注意:创建时需要初始化(赋值)
-
方法:子类不能覆写该方法
-
类:该类不能被继承
1.1.5关键只是点默写
1.方法传参 返回值
。方法传参采用传值:基本类型传递的数据本身,引用类型传递的是地址。
返回值:基本类型返回数据本身,引用类型返回地址。
2.包,为类提供命名空间,分类组织相关类和接口,提供包级别的访问控制
package com.demo;
package com.demo;
3.访问控制符,避免混乱调用: public、protected、包访问权限、private
4.封装:隐藏类的实现细节。
5.继承:通过扩展已有类,生成一种新的类型
子类 extends 父类{
}
默认继承自Object
只能继承一个类,不存在多重继承
6.子类对象初始化:先父后子、先静态后非静态、同级别静态初始化看位置
7.super:在子类中指定使用父类属性、方法、构造方法
super .属性
super方法
super();
8.方法重写:重新实现父类中的普通方法,其他父类成员不存在重写。方法重写规则; 重写方法时,方法签名(方法名和参数列表)必须和父类一样,其它部分如下: 访问控制符 其他修饰符 返回值 方法名 (参数列表) 异常声明
。访问控制符必须一样或者扩大
。其他修饰符必须和父类一样
。返回值必须和父类一样,如果是引用类型,则可以是父类方法返回值的子类。
异常声明可以是父类异常声明的子类或者不写
注意:如果方法名和父类相同,参数不同,则子父类方法形成重载。
9.final关键字:表示最终的最后的 *修饰:
-
属性/变量:常量,值不可被改变
-
注意:创建时需要初始化(赋值)
-
方法:子类不能覆写该方法
-
类:该类不能被继承
10.super关键字: 表示当前类对象的父类对象
-
通过super关键字可以关联到父类对象的可访问属性和方法
-
访问父类对象属性:super.属性名称
-
访问父类对象的方法:super.方法名称
-
注意:
-
1、创建子类对象是,将优先加载父类的信息(创建子类对象时,先创建父类对象
-
2、创建对象时,如果没有指定要调用父类的构造函数,则默认调用父类的无参构造函数
-
如果有指定要调用的父类构造函数,则默认的谷类无参构造函数将不被执行
-
3、子类调用父类构造函数时,需要在子类构造函数的第一行调用。其余方式参考this关键字
1.1.6.常见面试题
1.方法重载与方法重写的区别?
方法重载和重写是不同的概念,主要有以下区别:
1、首先是含义不同
1)方法重载是在同一个类中,声明多个同名方法,通过参数列表来区分不同的方法,与参数列表的数量、类型和顺序有关,与修饰符和返回值类型以及抛出异常类型无关
2)方法重写的前提是发生在具有继承关系的两个类之间,方法重写有以下规则:
a.参数列表必须保持一致
b.返回值类型必须保持一致
c.方法名必须保持一致
d.重写方法的访问权限范围必须大于等于父类方法
e.重写方法的抛出异常类型范围不能大于父类方法
2、方法的重载和重写的作用不同
重载:在一个类中为一种行为提供多种实现方式并提高可读性
重写:父类方法无法满足子类的要求,子类通过方法重写满足需求
实例:
重载:构造方法的重载、println()方法重载
重写:Object类的toString()、equals()、hashCode()等都可以被子类重写
用图表表示如下: