7.1 定义类和创建对象
- 定义类
//定义Dog类
class Dog{
String name;
int age;
String color;
void eat(){
System.out.println("吃!");
}
}
- 创建对象
class test{ //主类test
public static void main(String[] args){
Dog d1=new Dog();//创建类Dog的对象d1
}
}
注意
1. 主类名text必须与.java文件名一致
2. .java文件中只能有一个类是公共(public)类
3. 每个类都被编译为一个.class文件 (test.class和Dog.class)
7.2 构造函数
特点
- 构造函数名与类名一致
- 构造函数无返回值类型,void都没有
- 构造函数是在new一个对象时被调用来初始化对象的且只执行一次
注意
- 若类中不提供构造函数,系统会给出默认构造函数(隐示)并自动调用
public Dog(){
};//函数体为空的无参构造函数;
- 构造函数可以重载(必须有不同的签名)
public Dog(String name){ //Dog d1=new Dog("豆豆");时调用
this.name = name;
} //age默认为0
public Dog(String name,int age){ //Dog d1=new Dog("豆豆",5);时调用
this.name = name;
this.age = age;
}
- 构造函数是有return语句的
- 不显示
- 没有具体的返回值
- 没有返回值类型
- 建议永远自己给出无参构造函数
- 成员函数不可以调用构造函数,构造函数可以调用成员函数和构造函数
7.3 变量
-
成员变量
位置:类中方法外,堆内存中
生命周期: 随着对象的存在而存在,随着对象的消失而消失
初始化值:有默认初始化值 -
引用变量
类是一种引用类型,该类类型的变量都可以引用该类的实例
Dog d1=new Dog();//d1是包含对Dog对象引用的变量
必须在创建对象的基础上访问对象的方法
//Dog.eat();错误,未创建对象
d1.eat();
匿名对象 (创建对象但并不引用)
System.out.println(new Dog().eat());
引用数据域
- 引用类型的数据域没有引用任何对象,数据域就会有一个null值
- 引用类型直接量(默认值)-> null
数值类型 -> 0
boolean类型 -> false
char类型 -> ‘\u0000’ - 不需要某个对象时,可以显示给该对象的引用变量赋null值
该对象没有被任何引用变量所引用,java虚拟机会自动进行垃圾回收
基本数据类型与引用数据类型的区别
基本数据类型作为形式参数:传值( 常量在常量池中的地址)
int i = 0;
int j = 1;
j = i;
j = 10;
System.out.println(i);
i=0
引用数据类型作为形式参数:传址(对象在堆内存中的地址)
Dog d1=new Dog("豆豆",4);
Dog d2=new Dog("皮皮", 5);
d1 = d2;//此时,d1,d2指向同一对象,d1以前引用的对象成为垃圾
d1.name = "米米";//改变d1的名字就是改变d2的名字
System.out.println(d2.name);
米米
- 局部变量
位置:方法内部或者方法声明上
生命周期: 随着方法的进栈而存在,随着方法的弹栈而消失
初始化值:没有默认的初始化之 必须先定义再赋值后才能使用
7.4 静态
- 静态变量
- 优先于对象存在
- 随着类的加载而加载
- 被类的所有对象共享
- 可以通过类名调用
- 内存中位置
静态变量存储于方法区的静态区
public static void main(String[] args){
Dog d1 = new Dog();
Dog d2 = new Dog();
System.out.println(d1.color);
System.out.println(d2.color);//共享
System.out.println(Dog.color);//通过类名调用
d1.color = "black";
System.out.println(d2.color);//改变静态变量后,d2的color也为black,
class Dog{
public static String color = "white";
}
black
- 静态方法
注意事项:
1. 在静态方法中是没有this关键字的
2. 静态方法只能访问静态的成员变量和静态的成员方法
- 静态代码块
- static代码块可以置于类中任何地方,类中可存在多个static块
- static{}语句块中的内容只执行一次
在JVM的生命周期中,一个类只被加载一次,static{}伴随类的加载执 行,所以,无论new多少对象实例,static{}只执行一次 - 多个static{}的情况,按照定义顺序,依次执行
public class test{
static{
System.out.println("1");
}
static{
System.out.println("2");
}
static{
System.out.println("3");
}
public static void main(String[] args){
System.out.println("5");
}
static{
System.out.println("4");
}
}
**程序会输出1 2 3 4 5**
- 既有static{}块,又有static变量,“先定义先执行”
7.5 private
(限定方法和数据域只能在类中访问)
- private只能修饰类成员
- public可以修饰类成员和类
- public和private不可修饰局部变量
private double weight;
private void eat();
类外间接访问私有成员(给类设置访问器和修改器)
- 访问器
public String getName() {
return name;
}
- 修改器
public void setName(String name) {
this.name = name;
}
== 用成员函数去访问类的私有成员 ==
7.6 对象数组
Dog[] Dogs = new Dog[10];//创建10个Dog对象的数组,元素默认为null
for(int i = 0;i < Dogs.length;i++){
Dogs[i] = new Dog();
}
两层引用
- Dogs引用整个数组
- Dogs[1]引用一个Dog类对象
7.7 this引用
this是指向调用对象本身的引用名
- this引用隐藏数据域(数据域名作为参数名)
public void setName(String name) {
this.name = name;
}
- this调用构造方法
public Dogg(){
this("豆豆",4);
}
== 注意==
- 在构造方法中,this语句应在其他任何语句之前
- 在多个构造函数情况下,尽量使用this实现
7.8 final关键字
-
修饰类
表示此类不可被继承
注意
final类中的所有成员方法都被隐式指定为final方法 -
修饰方法
表示此方法不可被重写
注意
final类中的private方法被隐式指定为final方法 -
修饰变量
class Man{
private final int i = 0;
public Man(){
i = 1;//错误1
final Object obj = new Object();
obj = new Object();//错误2
}
}
final修饰基本数据类型变量,数值在初始化后不可更改
final修饰引用类型变量,对其初始化后不能指向另一个对象
(该引用变量指向的对象内容可以改变)
- 修饰成员变量
必须初始化赋值(1直接赋值 2 在构造器中赋值)
系统默认初始化,错误
final变量与普通变量的区别
结果为: true
false
当final变量为基本数据类型及String类型时,若在编译期间知道它的确切值,编译器会把它当做编译期常量使用,在用该final变量的地方,相当于直接访问这个常量。
b被final修饰,被当做编译期常量,在用到b的地方,直接替换为hallo
d的访问需要在运行时通过链接进行