java 7 面向对象、static、Math、继承、方法重写
-
构造方法的重载
如果没有给出构造方法,系统将自动提供一个无参构造方法;如果给出了有参构造方法,系统将不再提供默认的无参构造方法。
练习:set/get方法创建一个学生类
static关键字
-
共享 static 静态的,可以修饰成员变量和成员方法。
修饰成员变量,此变量就为一个共享变量,会被这个类的所有对象共享
-
static 关键字的特点
1.随着类 .class的加载而加载
2.static所修饰的成员是优先于对象而存在的
3.被类的所有对象所共享
4.被静态所修饰的成员,是属于类的,建议使用类名直接调用,也可以用对象名调用,但不推荐。
5.静态变量也称之为类变量
-
定义静态的方法
1.在静态方法里,不能调用非静态方法。静态所修饰的成员,是随着类的加载而加载,是优先于对象而存在的。先有的访问不到后有的。
2.在静态方法中,调用不到非静态成员,只能调用静态成员。
3.简单记,在静态方法里,只能访问静态所修饰的成员。不能访问非静态成员。
非静态方法中,既可以非静态成员,也可以访问静态成员。
在静态方法中,不能存在this关键字:this本身代表的是一个该类对象,对象是后来才有的。
对于提供main方法作为成员入口的这个类,我们一般不去定义成员方法和成员变量。
-
静态变量和成员变量的区别
1.静态变量属于类,也称之为类变量。成员变量属于对象,也称之为对象变量或实例变量。
2.静态变量存在方法区的静态区,成员变量储存在堆内存。
3.静态变量是随着类的加载而加载,随着类的卸载而卸载,成员变量随着对象的创建而创建,随着对象的销毁而销毁。
4.静态变量可以通过类名调用,也可以使用对象调用,推荐使用类名调用。成员变量只能用对象调用。
Math
生成一个随机的0-1之间的小数:
double num=Math.random();
生成随机整数 1-100之间 包含1和100
int v =(int)(Math.random()*100+1);强制类型转换
java.lang.这个包下的类,可以不用导入包
练习:猜数字
继承
-
代码块
就是被一堆大括号{}括起来的代码。
-
分类
局部代码块、构造代码块、静态代码块、同步代码块。
1.局部代码块:定义在方法中的的代码块
2.构造代码块:定义在类中方法外的
构造代码块优先于构造方法执行
-
3.静态代码块
定义在类中方法外的代码块,并且被static所修 饰,随着类的加载而加载,最早执行,且只执行 一次
被静态所修饰的随着类的加载而加载,因为类只 加载一次,所以静态代码块只执行一次
我们经常会在静态代码块例做一些初始化的准备 工作
-
面向对象的三大特征:封装(class),继承,多态
-
java中的继承:就是被多个子类的共性部分,向上抽取到父类当中已实现代码的复用性和维护性。子类可以继承父类的成员(成员变量和成员方法)使用关键字extends
-
继承好处:提高代码的复用性和维护性。
-
继承的弊端:让类和类之间产生关系,那就增加了耦合性
-
程序设计原则:高内聚(一个类,独立完成某个功能和能力),低耦合。耦合(类和类之间有一种依赖关系)。
-
java中继承的特点:
1.java中只支持单继承,一个子类只能有一个父类。 但支持多层继承。
2.java中子类只能继承父类非私有的成员。
3.构造方法不参与继承。
-
就近访问原则:当成员变量和局部变量重名时,我们的变量访问原则遵循就近原则,先在局部范围找(方法内和形参),如果找到就使用,如果找不到就去该类的成员范围找,找到就使用。如果在该类的成员范围内没找到,就去该类的父类的成员范围找,找到就使用。
-
super:代表父类的空间的一个表示,可以认为是父类的一个对象,可以使用super去访问父类的数据
1.super()访问父类的空参构造
2.super.成员变量名 访问父类的成员变量
3.super.成员方法 访问父类的成员方法
-
this:代表本类的一个引用,可以认为是本类的
this()访问本类的空参构造
this.成员变量 访问本类的成员变量
this.成员方法 访问本类的成员方法
this和super不能同时存在在构造方法里(this() super()必须出现在构造中的第一行)
-
我们在创建子类对象时,为什么会先去调用父类的构造方法呢?
因为子类要继承父类的数据,甚至要使用父类的数据,所以,在初始化子类的时候,先要调用父类的构造方法,来完成父类数据的初始化,这样子类才能够继承父类的数据和使用父类的数据。
-
在每个类的构造方法中的第一行,有一行默认语句是super(),回去调用父类的空参构造,来完成父类的
-
java继承体系中的顶层父类时object类,左右类都是直接或间接继承自他。默认继承 object类。
方法重写
-
当子类出现了和父类一模一样的方法时(方法名,方法参数,返回值类型一样)这个会发生方法覆盖现象,这个现象称为方法重写(覆盖)。
-
为什么要有方法重写的机制?
有时子类对父类的方法实现不是很满意,他需要扩展或者覆盖父类的方法。
ctrl+o 重写父类的方法
@override 注解 作用:用来检测这个方法,是不是重写父类的。
-
super沿袭父类的功能
super.父类方法名
自己扩展的功能
-
-
重写时注意的事项
1.父类私有的方法不能重写,私有方法子类不能继承。
2.构造方法不参与重写。
3.子类在重写父类方法时,方法的权限修饰符不能比父类的低。
4.静态方法不参与重写
5.父类final修饰不能继承
-
方法重写和方法重载
-
方法重载:允许在一个类中定义多个同名方法,只要他们的参数列表不同(个数不同,或数据类型不同)
方法重写:要有继承关系,子类出现了和父类一模一样的方法(参数个数,参数类型,返回值类型)就会发生方法覆盖现象
-
final
-
关键字 最终的,可以修饰变量,方法,类
-
final修饰变量,此变量变为一个常量
public static final int B=2000; 公共的静态常量
-
final修饰方法,此方法不能被重写,但可以继承
-
final修饰类,此类不能继承
-
final修饰基本类型,指的是值不能被再次改变
-
final修饰引用类型,指的是地址值不能再次改变
-