一 构造方法
1 概念:
构造方法,其实实也是一个方法。 用于实例化对象, 在实例化对象的时候调用
2 与普通方法的区别:
构造方法的名字,必须和类名一致。 构造方法没有返回值,返回值类型部分不用写。
3 构造方法的意义
一般情况下,使用构造方法,是为了在实例化对象的同时,给一些属性进行初始化赋值。
4 构造方法的定义
public class Person { String name; // 描述所有人的姓名 int age; // 描述所有人的年龄 // 无参的构造方法:会将成员变量默认初始化成null/false/0 public Person() { this.name = ""; this.age = 0; } // 有参的构造方法:会将成员变量进行初始化并赋值,赋值成你传进来的参数 public Person(String name, int age) { this.name = name; this.age = age; } }
5 构造方法的注意事项
如果一个类中没有写构造方法, 系统会自动提供一个public权限的无参构造方法, 以便 实例化对象。 如果一个类中写构造方法了, 此时系统将不再提供任何的默认的构造方法。 多个构造方法之间是重载的关系
6 this在构造方法中的使用
1.不能自己调用自己---死循环 2.不能相互调用----死循环 3.this充当构造方法时,必须放在第一行 4.this在作为方法的时候,只能充当构造方法,不能作为其他方法 5.this的使用范围就是当前类的内部 6.只有在非静态方法中,才可以使用this.
二 封装
1 基础
定义:我们可以通过对具体属性的封装实现.把对成员变量的访问进行私有化,让他只能在类内部可见,通过公共的方法间接实现访问. 优点:提高了代码的安全性,复用性和可读性
2 示例代码
脏数据:我们把程序中出现的不符合逻辑的数据称为脏数据
脏数据分析 原因:让用户直接将数据传给了成员变量 解决:
1.不让他直接传值----将成员变量私有化,写 一个公共的方法
2.对数据进行过滤,将过滤后的数据交给成员变量
public class Demo7 { public static void main(String[] args) { //开枪射击 Gun gun = new Gun(); //脏数据 //gun.bulletNumber = -5; //将属性私有化,通过方法间接赋值 gun.addBulletNumber(-5); gun.shoot(); } } class Gun{ //成员私有化后,使用范围就是当前的类 private int bulletNumber; //通过公共方法实现赋值 public void addBulletNumber(int number){ //完成过滤 if (number < 0){ bulletNumber = 0; }else { bulletNumber = number; } } public void shoot(){ if (bulletNumber > 0){ --bulletNumber; } System.out.println(bulletNumber); } }
3 getter,setter方法
因为往往我们会有大量的属性需要进行赋值取值操作,所以就形成了一个规范
3.1 赋值的规范:setter方法
构成:修饰词 返回值 方法名 (参数列表){ 方法体中的代码 return 返回值 } 修饰词:一定是public 返回值:不需要,这里写void 方法名:set+属性的名字,名字的首字母大写 参数列表:一般只有一个,写法:与属性同名 代码:this.属性的名字 = 参数 return:不需要
3.2 取值的规范:getter
构成:修饰词 返回值 方法名 (参数列表){ 方法体中的代码 return 返回值 } 修饰词:public 返回值:类型与属性一致 方法名:get+属性的名字,首字母大写 参数列表:不需要 代码:没有 return 属性的名字/this.属性的名字
三 继承
3.1 继承基础
有两个类A和B,如果A与B之间产生了父子关系,B可以直接使用A里面的内容,他们的关系就是继承 优点: 提高了代码的复用性,健壮性,安全性,让类与类之间有了继承关系,让多态可以发生 注意点:一个父类可以有多个子类 一个子类只能有一个直接父类。
3.2 final关键字
是一个常用关键字,意思是最后的,最终的.在程序中只要被final修饰的内容是不能再被改变的. 比如: int a = 5;这是定义了一个int型的变量a赋值成5.如果我们给它加上修饰词final final int a = 5; 这里a就相当于变成了常量,值一直是5,不能再被改变.
3.3 Object类(基类/超类)
Object类:是java继承体系中所有类的父类,Object类没有父类. 作为所有类的父类,它里面有11个方法,相当于所有子类都默认有这些方法,所以都很重要.
3.3 继承的特点
产生继承关系后, 子类可以使用父类中的属性和方法, 也可以定义子类独有的属性和方 法 Java是单继承, 一个类有且只能有一个直接的父类,可以有若干个间接的父类,一个父类可以有0个或者多个子类,子类之间互不影响 使用继承,可以简化代码,提高代码的复用性,提高代码的拓展性,增加代码的健壮性,最重要的使类与类之间产生了继承的关系,是多态的前提
3.4 继承的语法
继承, 需要使用关键字 extends。 在定义类的时候, 使用 子类 extends 父类 的方式描述继承。 Object类:是java继承体系中所有类的父类,Object类没有父类. //Phone类没有显示的父类,默认父类是Object类 class Phone {} //Iphone类继承自Phone类 class Iphone extends Phone { }
3.5 不可以被继承
构造方法 构造方法是为了创建当前类的对象的, 不可以继承给子类。 私有成员 私有成员只能在当前的类中使用, 不可以继承给子类。 注意:父类的私有成员,在子类中可见不可用 跨包子类 默认权限的属性、方法, 不可以继承给跨包的子类。
3.6 访问权限修饰符
访问权限修饰符, 就是修饰类、属性的访问级别。 对于类来说:只能有default和public两个修饰符
3.7方法重写(重点)
3.7.1 重写原理:
当子类希望实现父类方法功能之外的一些功能时,如何处理? 解决: 子类可以继承到父类中的属性和方法, 但是有些方法, 子类的实现与父类的方法可能实现的 不同。 当父类提供的方法已经不能满足子类的需求时, 子类中可以定义与父类相同的方法。 当出现同名方法后,方法如何调用? 当出现同名方法后,方法如何调用? 这时子类方法完成对父类方法的覆盖, 又叫重写(Override)。
3.7.2@Override
一个注解, 进行重写前的校验。 校验这个方法是否是一个重写的方法。 如果不是重写的方 法, 会直接报错。
3.7.3 重写的注意事项
方法名字必须和父类方法名字相同 参数列表必须和父类一致 子类方法的访问权限需要大于等于父类方法的访问权限,父类不能是private 子类方法的返回值类型需要小于等于父类方法的返回值类型--引用类型
3.7.4 super关键字
有时候,子类重写父类方法的时候,并不是要对父类的实现全盘推翻,而是对父类方法进行拓展。 父类方法中的实现仍然需要, 但是还需要在父类方法的基础上进行拓展的实现, 此时就需要使用super关键字调用父类的方法。 this和super的对比 this:是一种引用类型,代表当前对象,保存的是当前对象的地址 super:代表的是当前对象的父类,可以调用父类的成员.但是他不是引用数据类型. 为什么要将super放在构造方法的第一行? 在子类的构造方法中有可能用到父类的属性,而属性在使用之前必须先进行初始化,否则无法使用.super的作用是初始化父类的属性,如果在super之前调用了其他的代码,有可能造成在未对 父类属性初始化时使用了属性的错误情况发生,所以系统默认super前面不能放任何代码,this()用于构造方法调用时也要放在第一行是一个道理.