概述
程序: 数据结构&算法。
面向对象:先决定如何组织数据,再决定如何操作数据;先设计类,再添加方法。
instance:创建类的实例也就是由类构造对象。
封装:将数据和行为组合起来,并对对象的使用者隐藏数据的实现方式;实例域(instance field)存放数据,行为即方法(method)操作数据。
类之间的关系:依赖、聚合、继承。
- 依赖:use、偶然性、临时性。例如类B作为类A的方法参数,局部变量,返回值等。
- 关联:必然的、长期的。例如类B作为类A的成员变量。
- 聚合:has、加强版的关联,整体和部分的关系。
- 继承:is、
构造器:创建类的对象并初始化实例域(属性)。
对象变量:引用对象,而不是变量处包含了对象。
类
- final
修饰基本数据类型:值不可变。
修饰引用:引用的对象不可变,但是引用的对象的属性可以变。
public class Finaltest {
public static void main(String[] args) {
final StringBuilder sb = new StringBuilder("abc");
sb.append("de");
System.out.println(sb);
}
}
- this
表示隐式参数,可以将实例域和局部变量区分。
构造器的第一行写this,表示这个构造器将调用类的另一个构造器。 - private
私有方法不会被外部的其他类调用
public class S1 {
private int numb;
private String name;
public S1(int numb, String name) {
super();
this.numb = numb;
this.name = name;
}
private int getNumb() {
return numb;
}
public String getName() {
return name;
}
}
- static 静态
- 静态方法不能访问实例域(成员变量),因为它不能操作对象。
- 静态方法可以通过类调用,也可以通过类的对象调用,但是后者容易造成混淆,实际上方法的执行结果和对象没有任何关系。
(前边学的线程sleep是不是因为这个?)是的。
方法参数
- 按值调用:方法接收的是调用者提供的值。
- 按引用调用 :方法接收的是调用者提供的变量地址。
java只有一种情况,传值调用,即方法得到的值是参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。
public class CallByTest {
public static void main(String[] args) {
int a = 1;
int b = 2;
swap(a,b);
System.out.println("a="+a+" b="+b);
}
public static void swap(int num1, int num2) {
int c = num1;
num1 = num2;
num2 = c;
}
}
- 方法参数是对象的引用时
拷贝的引用与原引用引用相同的对象。
public class CallByTest {
public static void main(String[] args) {
// Integer a = 1;
// Integer b = 2;
// swap(a,b);
// System.out.println("a="+a+" b="+b);
A a = new A(1);
B b = new B(2);
System.out.println("a="+a.num+" b="+b.num);
swap(a,b);
System.out.println("a="+a.num+" b="+b.num);
}
public static void swap(A oba, B obb) {
int c = oba.num;
oba.num = obb.num;
obb.num = c;
System.out.println("交换完毕");
}
}
class A {
int num;
public A(int a) {
this.num = a;
}
}
class B {
int num;
public B(int a) {
this.num = a;
}
}
- 如何证明java中只有 按值调用
对象引用也是按值调用的,即方法不能让对象参数引用一个新的对象。例子中对象本身直接参与交换。
public class CallByTest {
public static void main(String[] args) {
// Integer a = 1;
// Integer b = 2;
// swap(a,b);
// System.out.println("a="+a+" b="+b);
A a1 = new A(1);
A a2 = new A(2);
System.out.println("a1=" + a1.num + " a2=" + a2.num);
swap(a1, a2);
System.out.println("a1=" + a1.num + " a2=" + a2.num);
}
public static void swap(A oa, A ob) {
A oc = oa;
oa = ob;
ob = oc;
System.out.println("交换完毕");
}
}
class A {
int num;
public A(int a) {
this.num = a;
}
}
对象
- 如果没有在构造方法中显式地给对象实例域赋值,会自动滴给实例域赋予默认值,0、null、false。这么做不好,影响可读性。
- 编写类没有无参构造,系统会自动提供一个无参构造;如果显示声明了有参构造,系统不再自动提供无参构造,使用无参构造创建新对象会报错。
实例域初始化
- 构造器中赋值,有参构造。
- 类声明时赋值,这样执行构造器之前先进行赋值操作,所有的对象实例域的值都相同。
- 对象初始化块,就是一个代码块,建议放在实例域后面。先运行该初始化块,再执行构造器的主体部分。
- 静态初始化:如果有,类在第一次加载时会进行静态初始化,之后再创建类的对象不会再进行这种初始化。
- 执行顺序:
包
- 将类组织起来,可以避免命名冲突。
- 使用方式:类名之前加完整的包名
java.time.LocalDate today = java.time.LocalDate.now();
;import导包。 - 包作用域:没指定public、private 即默认的,default。