类与对象
类与类之间的关系主要有那些?依赖,聚合,继承;
一个类可以有哪些东西?一般来说有属性,方法,构造方法,代码块,内部类。关于类要了解他们的初始化顺序:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
注意:在执行之前,所有数据域初始化为默认值。初始化块和变量是按在类中的顺序来执行的。
1.对象与对象变量
一般通过new关键字来创建一个对象,也就是开辟一块内存,然后返回它的地址值。指向这个地址值的变量称为对象变量。如Date d=new Date(),这里d就是对象变量。与对象有着本质的区别,如Date da;这里da仅仅是一个变量,不能调用方法da.toString(),会编译出错。
对象变量初始化之后才可以用,两种方式,要么构造新的,要么使用现有的,如Date db=d;这样d和db都引用了同一个对象。
简单来说,对象就是存储在内存中的数据,对象变量就是引用某个对象的变量而已,甚至可以手动置为null。
2.构造器
构造器总是伴随着new操作符的执行而被调用,其他的特点比如与类名相同啊,没有返回值…
需要注意就是不能在构造器中定义与属性重名的局部变量,
3.方法
3.1隐式参数与显式参数。如
public void setId(Integer id) {
this.id = id;
}
隐式参数,在方法中通常用this表示代表当前对象,这样就可以将局部变量和类属性区分开,而id就是显式的。
3.2参数的传递。
方法的参数一共有两种:基本类型和引用类型,于是就有两种调用。
按值调用:方法接收的是调用者提供的值;
按引用调用:方法接收的是调用者提供的变量地址;
对于方法参数,记住以下三点:
1.方法不能修改基本数据类型的参数。
2.方法可以改变一个对象参数的状态。
3.方法不能让对象参数引用一个新的对象。
关于值传递的示例
public class User{
private String phone;
//省略get,set
}
public class Testpase {
public static void main(String[] args) {
//基本数据类型
int a1 = 10;
new Testpase().base(a1);
System.out.println(a1);
//字符串
String s1 = "hello";
new Testpase().string(s1);
System.out.println(s1);
//其他对象
User u=new User();
u.setPhone("119");
//new Testpase().other(u);
new Testpase().oother(u);
System.out.println(u.getPhone());
//结论:java中都是按照值传递的,基本类型传递它的值,引用类型传递它所指向的内存的地址值
}
/**
* 基本类型
* 相当于 int a2=a1; a2=19;
* a1与a2只是变量名,甚至可以相同
*/
void base(int a2) {
a2 = 19;
}
/**
* 字符串引用类型
* 相当于
* String s2=s1;s2="word";s1与s2只是变量名,甚至可以相同.
*/
void string(String s2) {
s2 = "word";
}
/**
* 其他引用类型
* 相当于
* User user=u;这里的赋值仅仅将u的地址复制给user,他们指向的是同一个内存区域,共享该对象的数据。
* u.setPhone("911");
*/
void other(User user){
user.setPhone("911");
}
/**
* 其他引用类型
* 相当于
* User user=u;user=new User();user.setPhone("911");这里重新开辟了一块内存,赋值给user,即user的地址值被覆盖了
*/
void oother(User user){
user=new User();
user.setPhone("911");
}
}
final与static
final
修饰类———该类不可改变(不能继承)
修饰变量——–值不可变或引用不会再指向其他对象
修饰方法———-不可修改(不能重写)
static
修饰内部类———可以作为普通类使用(不可修饰普通类)
修饰变量———–所有类实例将共享该变量
修饰方法————不能向对象方法操作,没有隐式参数(this)。如main方法
使用:
工厂方法:当无法命名构造器,或者无法改变所构造的对象类型,就可以使用静态工厂方法来构造对象。如LocalDate.now()可以构造一个LocalDate对象。
常量:使用static+final修饰
this与super关键字
在普通方法中,this表示隐式参数,即所构造的对象,super表示调用父类方法
public void method(int age){
this.age=age;
}
在构造器中,第一个语句形如this(…),表示调用同一类中其他构造器。super表示调用父类构造器。
public class User{
public User(){
this.(...)
...
}
public User(...){
...
}
}