内存分析贯穿始终
面向对象:不应考虑第一步如何做 ①在这个问题里有什么类和什么对象 ②每一种类和对象具有怎样的属性或者方法 ③类和类之间具备怎样的关系
面向对象
对象:对象用计算机语言对问题域中事物的描述,对象通过“属性” (attribute)和方法(method)来分别对应事物所具有的静态属性 和动态属性
类:用于描述同一类型的对象的一个抽象的概念,类中定义了这一类 对象所应具有的静态和动态属性
先定义类才有对象
对象是Java程序的核心,在Java程序中“万事万物皆对象”
对象可以看出是静态属性(成员变量)和动态属性(方法)的封装体
类是用来创建同一类型对象的“模板”,在一个类中定义了该类对象所 应具有的成员变量以及方法
定义完类之后再定义对象
关系
关联关系
继承关系: xx是一种xx(游泳运动员是一种运动员)
聚合关系:(整体与部分) 球队:队员+队长、人:头+手+...
实现关系:(父类和子类)
类
声明方法的格式:[] (<[argu _list>])(默认值) {}
public int getAge() {return age;}
声明成员变量的格式: [] type <attr_name>(属性名称)[=defaultValue];
private int age = 20;
成员变量:
可以不初始化,java默认初始化为0 局部变量一定要初始化,否则无法打印
引用
引用类型不初始化则为Null 占取两块内存(栈一块、堆一块) 类是静态的概念,代码区 对象是new出来的,位于堆内存 使用对象(引用).成员变量或引用对象的成员变量 使用对象(引用)。方法(参数列表)来调用对象的方法 使用对象.成员变量 使用对象.方法(参数列表) 同一类的每个对象有不同的成员变量空间 同一类的每个对象共享该类的方法
当一个方法调用完成之后,栈为他分配的所有空间消失
构造方法 new+构造方法 创建一个新的对象 构造函数是定义在java类中的一个用来初始化对象的函数 构造函数与类同名且没有返回值(void也不用加)
当没有制定构造函数时,编译器为类自动添加形如 类名(){ }的构造函数 例如 class Point{ //如果定义了构造方法,那么系统 //不会再自动定义构造方法 public int x; //自动定义的构造函数给成员变量自动赋值0 public int y; } Point p = new Point( );
如果在构造方法前加了void则变为一个普通的方法
类命名,每个单词首字母大写 方法和变量命名,运用驼峰标识(第一个字母小写,后面每个字母大写)
内存的运行过程
形参在调用后就在栈里释放 对于无static的方法,是面向对象的,必须new一个对象,调动方法时,方法体中的变量就是引用变量的中所指向的变量p.set(i) {x = i;} → 若p指向x,则给x重新赋值i public class 类名与文件名一样 整个程序从main方法开始 若成员变量出现在方法体之内,切记不要定义数据类型,因为已经定义过 return值在栈里有一个临时存储空间,运用完后释放空间 如若 堆里的对象的成员变量无人引用,那么会因为垃圾回收机制而释放空间 方法针对对象调用
重载(名字一样)
参数不一样(类型或者参数个数不一样) 构造方法也可以重载 根据参数来判断用哪个方法
字符串常量在date区
this关键字
在类的方法定义中使用的this关键字代表使用该方法的对象的引用 当必须指出当前使用方法的对象是谁时要使用this 有时使用this可以处理方法中成员变量和参数重名的情况 this可以看作是一个变量,它的值是当前对象的引用
static
静态变量存放于data seg(数据区)中,所有对象共用这个静态的 成员变量 如果没有对象引用,则通过类名.静态变量名(若没有定义,则无法编译) 字符串常量分配在date segment 在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量 ,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量 只有一份. 用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给 它,所以在static方法中不可以访问非static的成员 静态方法不再是针对于某个对象调用,所以不能访问非静态成员
小结: 对于静态成员变量与静态方法,都不是针对某个对象的,可通过类名或对象 的引用调用,但是通过对象的引用调用静态方法,则不会将引用中的非static 成员变量传给方法
package和import语句
如果要把一个类放到包里面,第一句话写package,package后面想跟多少重包 就跟多少重包,但是注意编译出来的class文件必须位于正确目录下面(和包的层次 要完全一致)
package xxx.xxx.xxx
如果想在另一个类里用这个包里的类,必须把名字写全
import com.bjsxt.java140.类名/*(代表该包里所有的类 或者直接引用
.\com\bjxst\java140 目录下
Ⅰ.package语句作为java源文件的第一条语句,指明该文件中定义的类所在的 包。(若缺省该语句,则指定为无名包)。 格式:package pkg1.pkg2.... Ⅱ.java编译器把包对应于文件系统的目录管理,package语句中 用'.'来指明包(目录)的层次
**必须保证该类的class文件位于正确目录下 该类的源码可能会产生影响 →删除或转移到另外的目录 *另外的类访问 写全名 引入: Ⅰ. Ⅱ.具体类名 访问位于听一个包中的类不需要引入
必须在class文件的最上层包的父目录位于classpath下
执行一个类需要写全包名
系统的jar包位于jdk\jre\lib\rt中 jar包中的java.lang包里的类不需要引入
jar -cvf xx.jar * 寻找包有三种方法: 第一种,将需要调用包的java文件放在位于包中子目录所位于的 那个目录 第二种,若java文件不咋子包中子目录所位于的那个目录,则通过 classpath将存放子目录那个目录设置到环境变量中 第三种,通过jar包,xxx.jar所位于的那个目录设置在环境变量中
总结,无论哪种寻找package的设置,都应该从包的子目录的最上一层所位于 的那个目录开始
访问控制
Java权限修饰符public protected private 置于类的成员定义前,用来限定其他 对象对该类对象成员的访问权限,
类内部:private、default、protected、public 同一个包:default、protected、public 子类:protected、public 任何地方:public
对于class的权限修饰只可以用public和default public类的可以在任意地方被访问 default类只可以被同一个包内部的类访问
方法的重写
子类继承基类 重写的名字、参数列表、返回值类型 访问权限子类的方法不能比基类的方法严格 直接copy基类的方法
Super
通过super来引用基类里的成分
继承的构造方法
1.子类的构造方法中必须调用基类的构造方法 2.使用super(参数)或者this(参数)来调用,调用时必须写 在构造方法的第一行。若用this(),则可以调用本类的其他 构造方法 3.如果子类构造方法中没有调用基类的构造方法,则默认为调用 基类无参的构造方法 4.如果子类构造方法中既没有调用基类的构造方法,基类中又没有 无参的构造方法,则编译出错
java.lang
该包里所有类的查看 https://docs.oracle.com/javase/8/docs/api/
object类是所有类的根基类,若某个类我继承基类,那么就默认为 继承object类 toString方法:在进行String与其他类型的数据连接时,自动将其他 类型的数据转换为字符,可以根据用户自定义类型重写toString()方法
public String toString(){ returns //自己所定义的字符串 }
public boolean equals(Object obj){ } 可以根据需要在用户自定义类型中重写equals方法
hashcode的解释
通过记录每一个对象的位置,可以快速独立找到每一个独立的对象
对象转型(casting)
一个基类的引用可以指向其子类的对象 但是基类的引用不可以访问子类里新增的成员(属性和方法) 可以通过 引用变量+instanceof+类名 来判断该引用型变量所指向的 对象是否属于该类或者该类的子类 子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之 成为向下转型(downcasting)***
可拓展性: 通过基类的引用型变量做形参,可以将子类的引用传递给基类的引用, 而后通过强转来实现对子类新增成员变量的引用
多态/动态绑定/迟绑定
动态绑定是指在执行期间(java xxxxx),判断所引用对象的实际类型,根据 实际类型来调用相对应的方法 1.要有继承 2.要有重写 3.父类引用指向子类对象
abstract抽象
用abstract来修饰一个类时,则为抽象类,用abstract来修饰一个方法 时,为抽象方法
若一个类里有抽象方法,则所在的类必须定义为抽象类,抽象类必须被继承 ,抽象方法必须被重写
抽象类不能被实例化 抽象方法只需声明,而不需实现
子类里的重写方法若不实现,则需要用abstract去修饰,但同时也必须被继承
final关键字
final的变量的值不能被改变
- final的成员变量
- final的局部变量(形参) final的方法不能够被重写 final的类不能够被继承
接口(interface)
从本质上讲,接口是一种特俗的抽象类(只包含常量和方法的定义),无方法和 变量的实现 变量默认为 public static final 方法默认为 抽象方法,public的方法
一个类可以实现多个无关的接口 多个无关的类可以实现同一个接口 与继承关系类似,接口与实现类之间存在多态性 class name implements(实现) interface,interface
接口与接口的继承,继承方法 类与接口只能是实现