一. java类及其类成员:
1.类的设计中,两个重要结构之一:属性 对比:属性 vs 局部变量
1.相同点: 1.1 定义变量的格式:数据类型 变量名 = 变量值 1.2 先声明,后使用 1.3 变量都其对应的作用域
2.不同点: 2.1 在类中声明的位置的不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
2.2 关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符:private、public、缺省、protected —>封装性
目前,大家声明属性时,都使用缺省就可以了。
局部变量:不可以使用权限修饰符。
2.3 默认初始化值的情况:
属性:类的属性,根据其类型,都默认初始化值。
整型(byte、short、int、long:0)
浮点型(float、double:0.0)
字符型(char:0 (或’\u0000’))
布尔型(boolean:false)
引用数据类型(类、数组、接口:null)
局部变量:没默认初始化值。
意味着,我们在调用局部变量之前,一定要显式赋值。
特别地:形参在调用时,我们赋值即可。
2.4 在内存中加载的位置:
属性:加载到堆空间中 (非static)
局部变量:加载到栈空间
2.类的设计中,两个重要结构之二:方法
方法:描述类应该具的功能。
1.举例:
public void eat(){}
public void sleep(int hour){}
public String getName(){}
public String getNation(String nation){}
2. 方法的声明:权限修饰符 返回值类型 方法名(形参列表){
方法体
}
3. 说明:
3.1 关于权限修饰符:默认方法的权限修饰符先都使用public
Java规定的4种权限修饰符:private、public、缺省、protected -->封装性再细说
3.2 返回值类型: 返回值 vs 没返回值 3.2.1 如果方法返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用 return关键字来返回指类型的变量或常量:“return 数据”。如果方法没返回值,则方法声明时,使用void来表示。
4.重写(Override)
方法的重写规则
父类的成员方法只能被它的子类重写。
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
参数列表必须完全与被重写方法的相同。返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类。
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
声明为 final 的方法不能被重写。声明为 static 的方法不能被重写,但是能够被再次声明。
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。构造方法不能被重写。如果不能继承一个方法,则不能重写这个方法。
5.重载(Overload)
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重载规则:
被重载的方法必须改变参数列表(参数个数或类型不一样);
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;方法能够在同一个类中或者在一个子类中被重载。无法以返回值类型作为重载函数的区分标准。
6.总结
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
3.构造器(或构造方法):
构造器的作用: 1.创建对象
2.初始化对象的信息
使用说明:
1.如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器
2.定义构造器的格式:权限修饰符 类名(形参列表){}
3.一个类中定义的多个构造器,彼此构成重载
4.一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器
5.一个类中,至少会有一个构造器。
4.代码块: 代码块分类:
在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为:
局部代码块、构造代码块、同步代码块、静态代码块。 代码块初始化时机: 构造代码块在实例对象创建时进行初始化;静态代码块在类加载时进行初始化。
代码块执行顺序: 静态代码块 ==> main()方法 ==> 构造代码块 ==> 构造方法 ==> 局部代码块 。
继承中代码块执行顺序: 父类静态块 ==> 子类静态块 ==> 父类代码块 ==> 父类构造器 ==> 子类代码块 ==> 子类构造器 。
5.内部类
Java 一个类中可以嵌套另外一个类,语法格式如下:
class OuterClass { // 外部类
// ...
class NestedClass { // 嵌套类,或称为内部类
// ...
}
}
要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。
嵌套类有两种类型:
非静态内部类、静态内部类
非静态内部类:
非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。
由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。
私有的内部类。
内部类可以使用 private 或 protected 来修饰,如果你不希望内部类被外部类访问可以使用 private 修饰符:
静态内部类:
静态内部类可以使用 static 关键字定义,静态内部类我们不需要创建外部类来访问,可以直接访问它。
二.三大特性(封装、继承、多态)
面向对象的特征一:封装与隐藏
1.为什么要引入封装性?
我们程序设计追求“高内聚,低耦合”。
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅对外暴露少量的方法用于使用。隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
2.封装性思想具体的代码体现:
体现一:将类的属性xxx私化(private),同时,提供公共的(public)方法来获取和设置此属性的值
体现二:不对外暴露的私有的方法
体现三:单例模式(将构造器私有化)
体现四:如果不希望类在包外被调用,可以将类设置为缺省的。
面向对象特征二:继承性
1.继承性的格式:
class A extends B{}
A:子类、派生类、subclass
B:父类、超类、基类、superclass
3.Java中继承性的说明
3.1.一个类可以被多个子类继承。
3.2.Java中类的单继承性:一个类只能有一个父类
3.3.子父类是相对的概念。
3.4.子类直接继承的父类,称为:直接父类。间接继承的父类称为:间接父类
3.5.子类继承父类以后,就获取了直接父类以及所间接父类中声明的属性和方法
面向对象的特性三:多态性
1.多态性的理解:可以理解为一个事物的多种形态。
2.何为多态性:
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
举例:
Person p = new Man();
Object obj = new Date();
3.多态性的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译,看左边;运行,看右边。
4.多态性的使用前提:
① 类的继承关系 ② 方法的重写
三.关键字
关键字:this
1.可以调用的结构:属性、方法;构造器 2.this调用属性、方法:
this理解为:当前对象 或 当前正在创建的对象
关键字:abstract
abstract: 抽象的
1.可以用来修饰:类、方法
2.具体的:
abstract修饰类:抽象类
关键字super
在子类的构造方法中显式的调用父类构造方法
访问父类的成员方法和变量。