封装
封装的步骤
- 所有属性私有化,使用private关键字修饰,表示私有的,修饰的所有数据只能在本类中访问,在外部程序中不能访问,属性很安全。
- 对外提供简单的操作入口,以后外部程序想要访问这个类的私有属性,必须通过这些简单的入口访问: 对外提供两个公开的方法:set(修改)方法和get(读取)方法。
- set方法命名规范:public void setAge(形参){}
- get方法命名规范:public int getAge(形参){}
set和get方法没有static修饰 有static修饰的方法调用:类名.方法名(实参); 没有static修饰的方法调用:引用.方法名(实参); 封装的作用是可以将修改的属性给与条件,透明性,让用户看不到复杂。
快捷键生成所有的set和get方法:右键–>source(alt+shift+s)–>generate getters and setter
构造方法(构造器)constructor
语法结构:修饰符列表+构造方法名(形参){构造方法体} 构造方法不能指定返回值,因为返回值就是它自己。 构造方法名必须和类名保持一致。 构造方法的作用
- 构造方法的意义是通过new的调用创造对象。
- 创建对象的同时,初始化实例变量的内存空间。在堆内存中初始化实例变量(查看访问的是哪个方法,按ctrl建鼠标移动到查看的元素上,出现下划线单击)
如果没有写构造方法,系统默认会给这个类一个无参数的构造方法。 但是只要写了一个构造方法,那么系统就不会再自动给与无参数的构造方法。必须手动的构造无参数的构造方法。 同一个类的构造方法可以重载。
右键–>source–>gengerate constructor using fields(可以选择生成有参数的构造方法,调用的时候可以初始化实例变量)
myeclipse支持多行编辑,右上角(toggle block…)
this关键字
this是一个引用,是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存对象内部。 当一个动作/行为执行的过程当中是需要对象参与的,那么这个方法一定要定义为实例方法。不要带static关键字,需要用引用.来调用。 this出现在实例方法中,指向当前执行此动作的对象。 有static的方法中,不能使用this。 带有static的方法中不能直接访问实例变量和实例方法,需要先创建对象。 一个实例方法中可以直接调用实例方法,不需要再创建对象。 用来区分局部变量和实例变量的时候,this.不能省略。 构造方法调用构造方法直接用this(),必须出现在构造方法第一行。
static关键字
如果一个变量在一个类中都一样,比如中国人的国籍都是中国,则使用static修饰这个变量,变为静态变量,内存空间在类加载的瞬间就开辟了。静态变量存储在方法区内存中。 静态代码块: static{Java语句},写在类最开始,在类加载的时候执行,只能执行一次,并且比main方法执行的早。可以编写多个静态代码块。 当有时候希望在类加载的时候执行某个动作,就需要用到静态代码块,比如日志等。
继承
继承的基本作用:代码复用,还延伸出了多态和方法的覆盖。 修饰符列表 +class+ 类名 +extends +父类名{} 一个类只能继承一个类。在c++中支持多继承。 父类又被称为基类,超类superclass 子类又被称为派生类subclass 私有的不支持继承,构造方法不支持继承,其他都继承。 虽然只能继承一个类,但是可以间接继承其他类。 Java中一个类默认继承Java.lang.object类。
方法的覆盖override
当父类中的方法已经无法满足当前子类业务需求,子类有必要将父类继承过来的方法需要将该方法覆盖。 子类覆盖方法:返回值相同,方法名相同,形参列表相同 访问权限可以更高,不能更低。 抛出异常只能更多,不能更少。 静态方法不存在覆盖。 覆盖只谈方法,不谈属性。
多态
向上转型(upcasting):子类型转换为父类型,自动转换 向下转型(downcasting):父类型转换为子类型,强制转换 Java中可以让父类引用指向子类型对象:Animal a=new Cat(); a可以访问父类和子类都有的方法,但是不可以访问子类独有的方法,因为它定义的是Animal类,只有将父类(Animal)转换成子类(Cat)才可以进行访问子类Cat类独有的方法。向下转型。Cat b=(Cat)a; a instanceof Animal 结果为true:a是Animal类型,false不是。
Debug As:调试
多态最重要的一个作用:降低类和类之间的耦合度,让类有更高的扩张力。
例题:
- 一个主人类,一个小狗类,一个猫类。
- 狗类和猫类都有一个动作行为吃方法。
- 主人类有一个喂养宠物的feed方法,形参分别是Cat c,和Dog d。
- 测试中调用喂养方法:zcx.feed(tom);
- 上述程序中没有使用Java的多态,导致程序的耦合度很高,每次添加一个新的宠物,都会在主人类中添加新的feed方法。
- 使用多态机制,创建一个宠物类,每个宠物狗,猫等都继承这个宠物类,并且用方法覆盖来改写该宠物是怎么吃饭的。
- 主人类的方法:public void feed(Pet pet){pet.eat();}
- 在调用主人喂养的方法:zcx.feed(new Cat());
- 此时面向抽象的宠物,而不是具体的狗或者猫。
final关键字
final修饰的类无法继承 final修饰的方法无法被覆盖 final修饰的变量一旦赋值不可以重新赋值 final修饰的实例变量必须手动赋值,不能使用系统默认值。 final修饰的引用,一旦指向某个地址后就不能指向另一个地址后。但是内部的内存数据是可以修改的。 常量(一般全部大写):public static final 类型 常量名 =值
package包
方便程序的管理。 不同功能的类分别放到不同的包内,比较方便。 package +包名 命名规范:公司域名倒序+项目名+模块名+功能名
import
用来导入其他类,同一个包下的类不需要导入。不在同一个类下的包需要手动去导入。 import+包名.*; import语句在package之下,class语句之上。 Java.lang.*不需要手动引入,系统自动引入,Java语言的核心类。
访问控制权限
用来控制元素的访问范围。 有:public,protected,private 可以修饰类,方法,变量。 protected:同包下可以访问,不同包但是继承可以访问。 没有写:同包下可以访问,其他包不可以。 private:只能在当前类中访问。
|