JavaSE day5:
一、数组(续)
1、多维数组(了解)
java中多维数组的元素是(数组)引用数据类型,故可以有阶梯状的数组,即同级数组的元素个数可以不同
二、类和对象
1、问题:
什么是类? (如:自行车的设计图)
什么是对象? (如:一辆辆的自行车)
为什么要设计类和对象的机制? (面向对象编程)
状态 + 行为
属性 方法
2、面向对象的三大特性 -- 封装性,继承性,多态性
1)封装性:所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。简而言之就是,内部操作对外部而言不可见(保护性)
2)继承性:继承是指这样⼀种能力:它可以使⽤现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
3)多态性:所谓多态就是指⼀个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。
面向对象名词扩展:OOA - 面向对象分析;OOD - 面向对象设计;OOP - 面向对象编程
3、语法
1)定义类的语法
修饰符(modifier) class 类名称 {
1、属性(可有可无)
2、方法(可有可无)
3、构造方法(如果没有定义构造方法,系统会自动生成一个无参构造)允许重载
}
Eg:public class HelloWorld { ...}
1>如何定义属性
修饰符 变量类型 变量名称;
默认值:
2>如何定义方法
修饰符 返回值类型 方法名称(形参列表) {
实现
}
Eg:public static rotate(int[] a,int k) { ...}
3>如何定义构造方法(如果没有明确写出,系统会自动补充一个无参构造方法;有则不补)
修饰符 类名称(形参列表) {
}
2)构造对象的语法 | 对象实例化的语法
create object | instance(动词)
类名称 变量名称 = new 类名称(实参列表)
引用类型 - 类引用
只要出现了关键字new就开辟了内存
一个文件中只能有一个public的类,该类的名称必须和文件名一致
一个类会生成一个 .class 字节码文件
对象中存储的主要是属性,也可以找到方法区中对象对应的类
对象(引用数据类型)必须在实例化后调用,否则会产生NullPointerException(运行时报错),编译时不会出错
Eg:Person p = null;
//定义了一个没有指向任何对象的Person类型的引用(类类型的引用)
Person p = new Person(...);
//定义了一个Person类型的对象
//定义了一个指向Person类型的对象的Person类型的引用(类类型的引用)
垃圾空间:没有任何栈内存指向的堆内存空间
由于匿名对象不会有任何的栈空间所指向,所以使用⼀次后就成为垃圾空间。
4、实例化对象的过程
1)new 关键字 计算对象需要的内存大小,开辟空间,初始化为0x0
p = malloc(sizeof(Person));
memset(p,0x0,sizeof(Person));
2)调用构造方法,对属性初始化
3)构造方法调用结束,返回一个指向新对象的引用
Person tmp = 新的对象;
5、如何访问对象的属性(内部 | 外部)
如何调用对象的方法(内部 | 外部)
1)内部(在类的方法中访问类的属性和调用类的方法)
属性:直接通过属性名称访问即可(出现命名遮挡时用this.属性名)
方法:直接通过过方法名称调用即可
2)外部(在其他类的方法中访问该类的属性和调用该类的方法)
属性:对象的引用.属性名称
方法:对象的引用.方法名称(实参列表)
6、其他(注意区分两种调用)
1)嵌套调用
System.out.println(Arrays.toString(rotate(new int[]{1,2,3,4,5},3)));
分解如下:
int[] tmp1 = new int[]{1,2,3,4,5};
int[] tmp2 = rotate(tmp1,3);
String tmp3 = Arrays.toString(tmp2);
System.out.println(tmp3);
2)链式调用(暂时不能有一个很好的实例)
7、this关键字的使用
1)在构造方法中调用其他构造方法,调用语句必须出现在第一行(形如:this(参数))
2)通过this访问属性或方法(一般出现在发生了命名遮挡的时候)(this.方法名称(参数))
3)this代表的就是当前对象的引用(current object)
普通属性和普通方法,其实都绑定着一个隐含的对象
标准输入 stdin 键盘
标准输出 stdout 屏幕
标准错误 stderr 屏幕
JavaSE day6:
一、类和对象(续)
1、访问限定符
包(package) eg:import.java.util.Arrays
拓展 定义包:
(1)新建目录,目录名称就是包名称(全小写,单词之间用下划线“_”分隔)
Eg:package hello_world;
(2)定义目录 p1/p2/p3; 定义一个类HelloWorld
Eg:package p1.p2.p3;
(3)使用包
import 包名称.类名称
Eg:import p1/p2/p3.HelloWorld;
1)限定符 2)影响的是访问权限
两种情况:修饰顶级的(top-level); 修饰成员级(meber-level)
四种访问限定符(封装):
1)public -- public(定义语法) -- 所有类都有访问权限
2)package-private -- 空白 -- 只有一个包的类有访问权限
3)protected -- protected -- 该部分内容待定(涉及继承)
4)private -- private -- 只有本类有访问权限
public和package-private是可用于顶级的访问权限
2、静态(静态方法和静态属性)
方法 普通方法 | 静态方法(类方法)
属性 普通属性 | 静态属性(类属性)
语法:被限定符(static)修饰
含义:和对象解绑,即静态属性不再保存在对象(堆区)中,而是保存在类(方法区)中,静态方法调用时,没有隐含着的对象,故无法使用this关键字
1)访问静态属性/调用静态方法的语法
内部:1>属性名称 2>类名称.属性名称 3>this.属性名称(保证当前方法不是静态方法)
1>方法名称(实参) 2>类名称.方法名称(实参) 3>this.方法名称(保证当前方法不是静态方法)
外部:1>类名称.属性名称 2>对象的引用.属性名称
1>类名称.方法名称(实参) 2>对象的引用.方法名称(实参)
强调:
在静态方法(静态上下文)中,无法使用this关键字,因为没有一个隐式的对象和该方法绑定(不能访问普通属性,不能调用普通方法)
一个类的所有对象,是可以共享静态属性的
3、属性的初始化
1)普通属性的初始化(发生在对象实例化的时候)
1>定义时初始化 int a = 10;
2>构造代码块 { a = 10; }
3>在构造方法中初始
注释:上面三个初始化同时出现时,1>和2>优先按定义顺序执行,最后执行构造方法
2)静态属性的初始化(发生在类被加载的时候)
拓展:类的信息一开始是以字节码(bytecode)形式保存在磁盘上的,类的加载过程就是类加载器(ClassLoader)在对象的目录上找到指定类的字节码文件,并且进行解析,然后放到内存的方法区的过程;类只有在被用到的时候才会进行加载。
类的加载一定是发生在对象实例化之前
1>定义时初始化 static int a = 10;
2>静态构造代码块 static { a = 10; }
3>静态构造方法
注释:上面三个初始化同时出现时,1>和2>优先按定义顺序执行,最后执行构造方法