===构造方法的作用:创建对象,给对象中的成员进行初始化
===构造方法的特点:
1》方法名与类名相同
2》没有返回值类型,没有void
3》没有具体的返回值
===构造方法的的注意事项:
1.如果没有给出构造方法,系统将自动提供一个无参构造
2.如果给出构造方法,系统不在提供默认无参构造
3.如果给出构造方法后还想使用无参构造现需要自己给出,所以我们最好永远自己给 出无参构造
===构造代码块
在类中方法外出现;多个构造方法方法中相同的代码存放到一起,
每次调用构造都执行,并且在构造方法前执行
===静态代码块
在类中方法外出现,并加上static修饰;
用于给类进行初始化,在加载的时候就执行,并且只执行一次
===构造方法的特点:
1》方法名与类名相同
2》没有返回值类型,没有void
3》没有具体的返回值
===构造方法的的注意事项:
1.如果没有给出构造方法,系统将自动提供一个无参构造
2.如果给出构造方法,系统不在提供默认无参构造
3.如果给出构造方法后还想使用无参构造现需要自己给出,所以我们最好永远自己给 出无参构造
===构造代码块
在类中方法外出现;多个构造方法方法中相同的代码存放到一起,
每次调用构造都执行,并且在构造方法前执行
===静态代码块
在类中方法外出现,并加上static修饰;
用于给类进行初始化,在加载的时候就执行,并且只执行一次
=== 静态变量和成员变量的区别
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
1.加载时机的不同,静态变量,随着类的加载而加载
成员变量随着对象的创建而存在
2.所属不同:静态变量属于这个类(类变量),成员变量属于对象
3.存储位置的不同:静态变量存在方法区的共享区,成员变量存在堆内存
4.消失的时机的不同:静态变量随着类的消失而消失,成员变量随着对象的消失而消失
5.使用方式的不同:成员变量,通过对象去调用,静态变量 通过类名去调用。
===以student 为例描述new的过程
Student s = new Student();
步骤:
(1):加载Student.class文件进内存
(2):在栈内存为s开辟空间
(3):在堆内存为学生对象开辟空间
(4):对学生对象的成员变量进行默认初始化
(5):对学生对象的成员变量进行显示初始化
(6):通过构造方法对学生对象的成员变量赋值
(7):学生对象初始化完毕,把对象地址赋值给s变量
===一个标准的类:构造方法 成员变量 成员方法
=== static 状态修饰符号 静态的意思
1.随着类的加载而加载
2.优先于对象存在
3.被类的所有对象所共享
4.可以修饰成员变量,也可以修饰成员方法
5.被static 修饰的东西我们可以通过类名.静态成员
6.被static修饰的成员变量,我们叫类变量 属于这个类
7.静态的只能访问静态的,非静态的既能访问非静态的,也能访问静态的
(静态是随着类的加载而加载,this是随着对象的创建而存在,静态比对象先存在。)
被静态修饰的成员,可以通过对象名去调用用,但是不推荐
===Math 一个数学工具类,此类中的成员变量和成员方法都是静态的,所以类名直接调用
查JDK文档来了解 Math数学工具类
===代码块:把一对{}大括号 括起来的内容,我们称之为代码块
===代码块根据定义位置的不同分为:1.局部代码块 2. 构造代码块 3.静态代码块
1.局部代码块:定义在方法中的代码块
2.构造代码块:定义在一个类的成员位置
3.静态代码块:定义一个类中的成员位置 但被static所修饰
===代码块执行顺序
静态代码块先执行:随着类的加载而加载,只执行一次
构造代码块,优先于构造方法先执行 构造代码块和构造方法是每new一次就会执行一次
===Java中的继承:当多个类中有一些共同属性,
那我们可以将这多个类中的共同属性,抽取到一个父类当中,那这个多个子类就无需再定义这些共同的属性
继承体现的思想:将共同属性向上抽取
继承正着想:就是父类非私有的成员,子类是可以继承下来的
继承的好处:1.提高了代码的复用性 2.提高了代码的维护性 3.让类给类之间产生了关系
继承的弊端:增加了耦合性
===软件开发的原则:低耦合(类跟类之间的关系),高内聚(独立完成某写功能)
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
1.加载时机的不同,静态变量,随着类的加载而加载
成员变量随着对象的创建而存在
2.所属不同:静态变量属于这个类(类变量),成员变量属于对象
3.存储位置的不同:静态变量存在方法区的共享区,成员变量存在堆内存
4.消失的时机的不同:静态变量随着类的消失而消失,成员变量随着对象的消失而消失
5.使用方式的不同:成员变量,通过对象去调用,静态变量 通过类名去调用。
===以student 为例描述new的过程
Student s = new Student();
步骤:
(1):加载Student.class文件进内存
(2):在栈内存为s开辟空间
(3):在堆内存为学生对象开辟空间
(4):对学生对象的成员变量进行默认初始化
(5):对学生对象的成员变量进行显示初始化
(6):通过构造方法对学生对象的成员变量赋值
(7):学生对象初始化完毕,把对象地址赋值给s变量
===一个标准的类:构造方法 成员变量 成员方法
=== static 状态修饰符号 静态的意思
1.随着类的加载而加载
2.优先于对象存在
3.被类的所有对象所共享
4.可以修饰成员变量,也可以修饰成员方法
5.被static 修饰的东西我们可以通过类名.静态成员
6.被static修饰的成员变量,我们叫类变量 属于这个类
7.静态的只能访问静态的,非静态的既能访问非静态的,也能访问静态的
(静态是随着类的加载而加载,this是随着对象的创建而存在,静态比对象先存在。)
被静态修饰的成员,可以通过对象名去调用用,但是不推荐
===Math 一个数学工具类,此类中的成员变量和成员方法都是静态的,所以类名直接调用
查JDK文档来了解 Math数学工具类
===代码块:把一对{}大括号 括起来的内容,我们称之为代码块
===代码块根据定义位置的不同分为:1.局部代码块 2. 构造代码块 3.静态代码块
1.局部代码块:定义在方法中的代码块
2.构造代码块:定义在一个类的成员位置
3.静态代码块:定义一个类中的成员位置 但被static所修饰
===代码块执行顺序
静态代码块先执行:随着类的加载而加载,只执行一次
构造代码块,优先于构造方法先执行 构造代码块和构造方法是每new一次就会执行一次
===Java中的继承:当多个类中有一些共同属性,
那我们可以将这多个类中的共同属性,抽取到一个父类当中,那这个多个子类就无需再定义这些共同的属性
继承体现的思想:将共同属性向上抽取
继承正着想:就是父类非私有的成员,子类是可以继承下来的
继承的好处:1.提高了代码的复用性 2.提高了代码的维护性 3.让类给类之间产生了关系
继承的弊端:增加了耦合性
===软件开发的原则:低耦合(类跟类之间的关系),高内聚(独立完成某写功能)
===继承的注意事项:1.Java中只支持单继承,一个子类只能有一个父类,但是支持多层继承
2.子类只能继承父类 非私有的成员
3.构造方法不能继承
4.Object类 是所有的类的顶层父类,所有类都是直接或间接继承自他
===子类中的成员变量和父类中的成员变量名称一样,在子类中访问一个变量的查找顺序("就近原则")
a: 在子类的方法的局部范围找,有就使用
b: 在子类的成员范围找,有就使用
c: 在父类的成员范围找,有就使用
d:如果还找不到,就报错
===super 父类空间的一个标识,你可以理解为父类的一个引用 同过super 来访问父类的成员
this 代表该类的一个引用,谁调用我,我就代表谁
super.成员变量名 this.成员变量名
super.成员方法名() this.成员方法名();
super();调用父类无参数构造 this();调用本类构造
有了继承关系以后,我们在创建对象时 ,会先执行父类构造方法,在执行子类的构造方法。
因为子类要继承父类的一些数据,那么肯定先要把父类初始化完成了,子类才能初始化
在一个类的每个构造方法里面的第一行默认都会有一个super()
===在子类所有的构造方法中默认都会有super()去调用父类无参数的构造
但是如果父类没有无参构造怎么办?
1.给父类写一个无参数构造
2. 调用本类有参数构造,例如this("aaa");
===protected一个受保护的方法
===当子类中出现了和父类一模一样的方法(方法名一样,参数列表一样,返回值类型一样) 就会发生方法覆盖,也叫方法重写
子类对父类某个功能不满意,想要去丰富这个功能,就可以选择重写
1.父类私有的方法子类不能重写,因为父类私有的方法子不能继承,也就谈不上重写
2.子类重写父类的方法时权限修饰符,不能比父类的低,最好一致
权限修饰符号的级别大小 public>protected>缺省>private
@Override // 注解 表示方法重写
===final
final 可以修饰 方法 可以修饰变量,可以修饰类
final 修饰方法,此方法不能被重写,但是可以被继承
final 修饰变量 此变量变为一个常量,不能重新被赋值
final 修饰类 此类不能被继承
final 修饰一个基本数据类型 修饰后指的是 值不能再被改变
final 修饰引用数据类型 指的是这个引用不能再被重新赋值
如果父类不想让子类重写某个方法,父类给可以给这个功能加个 final ,子类就不能重写
final int NUM = 100;// 自定意一个常量,常量一般大写
public static final int A = 600;// 公共的自定义的静态常量
公共的 静态 最终的
2.子类只能继承父类 非私有的成员
3.构造方法不能继承
4.Object类 是所有的类的顶层父类,所有类都是直接或间接继承自他
===子类中的成员变量和父类中的成员变量名称一样,在子类中访问一个变量的查找顺序("就近原则")
a: 在子类的方法的局部范围找,有就使用
b: 在子类的成员范围找,有就使用
c: 在父类的成员范围找,有就使用
d:如果还找不到,就报错
===super 父类空间的一个标识,你可以理解为父类的一个引用 同过super 来访问父类的成员
this 代表该类的一个引用,谁调用我,我就代表谁
super.成员变量名 this.成员变量名
super.成员方法名() this.成员方法名();
super();调用父类无参数构造 this();调用本类构造
有了继承关系以后,我们在创建对象时 ,会先执行父类构造方法,在执行子类的构造方法。
因为子类要继承父类的一些数据,那么肯定先要把父类初始化完成了,子类才能初始化
在一个类的每个构造方法里面的第一行默认都会有一个super()
===在子类所有的构造方法中默认都会有super()去调用父类无参数的构造
但是如果父类没有无参构造怎么办?
1.给父类写一个无参数构造
2. 调用本类有参数构造,例如this("aaa");
===protected一个受保护的方法
===当子类中出现了和父类一模一样的方法(方法名一样,参数列表一样,返回值类型一样) 就会发生方法覆盖,也叫方法重写
子类对父类某个功能不满意,想要去丰富这个功能,就可以选择重写
1.父类私有的方法子类不能重写,因为父类私有的方法子不能继承,也就谈不上重写
2.子类重写父类的方法时权限修饰符,不能比父类的低,最好一致
权限修饰符号的级别大小 public>protected>缺省>private
@Override // 注解 表示方法重写
===final
final 可以修饰 方法 可以修饰变量,可以修饰类
final 修饰方法,此方法不能被重写,但是可以被继承
final 修饰变量 此变量变为一个常量,不能重新被赋值
final 修饰类 此类不能被继承
final 修饰一个基本数据类型 修饰后指的是 值不能再被改变
final 修饰引用数据类型 指的是这个引用不能再被重新赋值
如果父类不想让子类重写某个方法,父类给可以给这个功能加个 final ,子类就不能重写
final int NUM = 100;// 自定意一个常量,常量一般大写
public static final int A = 600;// 公共的自定义的静态常量
公共的 静态 最终的
===有参构造的意义
为了给成员变量方便的赋值
为了给成员变量方便的赋值
===多态
某一个事物,在不同时刻表现出不同的状态
多态前提
1.要有继承关系
2.要有方法重写,没有也可以,但是没有的话多态就没有意义
3.多态的写法:父类的引用指向子类对象
1.采用多态的方式去调用方法
编译看左边 运行看右边
某一个事物,在不同时刻表现出不同的状态
多态前提
1.要有继承关系
2.要有方法重写,没有也可以,但是没有的话多态就没有意义
3.多态的写法:父类的引用指向子类对象
1.采用多态的方式去调用方法
编译看左边 运行看右边
2.采用多态的形式去调用成员变量
编译看左边,运行看左边
多态的弊端: 父类引用不能访问子类独有的东西,如果你想访问,那我就需要向下转型
===抽象类
我们在父类中,没有必要给出一个具体的子类功能,因为每个子类功能都是存在差异的
所以我们在父类中把子类共同的功能抽象出来,让子类各自去实现他们的功能
所以我们在父类中把子类共同的功能抽象出来,让子类各自去实现他们的功能
===抽象类的语法:abstract 抽象 可以修饰类,也可以修饰方法
1.一个抽象类里面可以没有抽象方法, 但是一个类里面有了抽象方法 那这个类必须定义为抽象类
2.一个抽象类里面,可以有抽象方法,也可以有非抽象方法
3.抽象里面的抽象方法,其所有子类必须全部重写,就带有强制性了
4.抽象类,不能直接创建对象,我们只能通过间接的方式 多态 通过子类去初始化父类
5.抽象类中有构造方法 为了我们在创建子类时 可以初始化父类
===抽象类不能直接实例化即new他自己的对象
==抽象类中的成员特点
成员变量:抽象类中 可以定义成员变量,可以定义成员常量
==抽象类中可以有构造方法
==抽象类中可以有抽象方法,也可以有非抽象方法
非抽象方法 可以让子类继承下去
==抽象方法 强制让子类做的事情
===抽象类的特点
a:抽象类和抽象方法必须用abstract关键字修饰
抽象类格式: abstract class 类名 {}
抽象方法格式: public abstract void eat();
b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
c:抽象类中可以有构造方法,抽象类不能进行实例化,用于子类访问父类数据时的初始化
d:抽象类不能直接实例化那么,按照多态的方式,由具体的子类实例化。
其实这也是多态的一种,抽象类多态。
e:抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
1.一个抽象类里面可以没有抽象方法, 但是一个类里面有了抽象方法 那这个类必须定义为抽象类
2.一个抽象类里面,可以有抽象方法,也可以有非抽象方法
3.抽象里面的抽象方法,其所有子类必须全部重写,就带有强制性了
4.抽象类,不能直接创建对象,我们只能通过间接的方式 多态 通过子类去初始化父类
5.抽象类中有构造方法 为了我们在创建子类时 可以初始化父类
===抽象类不能直接实例化即new他自己的对象
==抽象类中的成员特点
成员变量:抽象类中 可以定义成员变量,可以定义成员常量
==抽象类中可以有构造方法
==抽象类中可以有抽象方法,也可以有非抽象方法
非抽象方法 可以让子类继承下去
==抽象方法 强制让子类做的事情
===抽象类的特点
a:抽象类和抽象方法必须用abstract关键字修饰
抽象类格式: abstract class 类名 {}
抽象方法格式: public abstract void eat();
b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
c:抽象类中可以有构造方法,抽象类不能进行实例化,用于子类访问父类数据时的初始化
d:抽象类不能直接实例化那么,按照多态的方式,由具体的子类实例化。
其实这也是多态的一种,抽象类多态。
e:抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
===abstract不能和哪些关键字共存?
不能和private共存:冲突 private修饰的方法子类不能继承,那根本也就重写不了,abstract 又要强制去重写
不能和 final共存 冲突 final 修饰的方法可以继承但是不能重写,abstract 又要强制去重写
不能和static共存 因为静态方法没有重写这一说 abstract 又要强制去重写 没有意义