7. 类和对象

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一个对象时被调用来初始化对象的且只执行一次

注意

  1. 若类中不提供构造函数,系统会给出默认构造函数(隐示)并自动调用
public Dog(){

};//函数体为空的无参构造函数;
  1. 构造函数可以重载(必须有不同的签名)
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;
}
  1. 构造函数是有return语句的
  • 不显示
  • 没有具体的返回值
  • 没有返回值类型
  1. 建议永远自己给出无参构造函数
  2. 成员函数不可以调用构造函数,构造函数可以调用成员函数和构造函数

7.3 变量

  • 成员变量
    位置:类中方法外,堆内存中
    生命周期: 随着对象的存在而存在,随着对象的消失而消失
    初始化值:有默认初始化值

  • 引用变量

类是一种引用类型,该类类型的变量都可以引用该类的实例

Dog d1=new Dog();//d1是包含对Dog对象引用的变量

必须在创建对象的基础上访问对象的方法

//Dog.eat();错误,未创建对象
d1.eat();

匿名对象 (创建对象但并不引用)

System.out.println(new Dog().eat());

引用数据域

  1. 引用类型的数据域没有引用任何对象,数据域就会有一个null值
  2. 引用类型直接量(默认值)-> null
    数值类型 -> 0
    boolean类型 -> false
    char类型 -> ‘\u0000’
  3. 不需要某个对象时,可以显示给该对象的引用变量赋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 静态

  • 静态变量
  1. 优先于对象存在
  2. 随着类的加载而加载
  3. 被类的所有对象共享
  4. 可以通过类名调用
  5. 内存中位置
    静态变量存储于方法区的静态区
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. 静态方法只能访问静态的成员变量和静态的成员方法

  • 静态代码块
  1. static代码块可以置于类中任何地方,类中可存在多个static块
  2. static{}语句块中的内容只执行一次
    在JVM的生命周期中,一个类只被加载一次,static{}伴随类的加载执 行,所以,无论new多少对象实例,static{}只执行一次
  3. 多个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**
  1. 既有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();
}

两层引用

  1. Dogs引用整个数组
  2. Dogs[1]引用一个Dog类对象

7.7 this引用

this是指向调用对象本身的引用名

  • this引用隐藏数据域(数据域名作为参数名)
public void setName(String name) {
	this.name = name;
}
  • this调用构造方法
public Dogg(){
	this("豆豆",4);
}

== 注意==

  1. 在构造方法中,this语句应在其他任何语句之前
  2. 在多个构造函数情况下,尽量使用this实现

7.8 final关键字

  1. 修饰类
    表示此类不可被继承
    注意
    final类中的所有成员方法都被隐式指定为final方法

  2. 修饰方法
    表示此方法不可被重写
    注意
    final类中的private方法被隐式指定为final方法

  3. 修饰变量

class Man{
	private final int i = 0;
	public Man(){
		i = 1;//错误1
		final Object obj = new Object();
		obj = new Object();//错误2
	}
}

final修饰基本数据类型变量,数值在初始化后不可更改
final修饰引用类型变量,对其初始化后不能指向另一个对象
(该引用变量指向的对象内容可以改变)

  1. 修饰成员变量
    必须初始化赋值(1直接赋值 2 在构造器中赋值)
    系统默认初始化,错误

final变量与普通变量的区别
在这里插入图片描述
结果为: true
false

当final变量为基本数据类型及String类型时,若在编译期间知道它的确切值,编译器会把它当做编译期常量使用,在用该final变量的地方,相当于直接访问这个常量。

b被final修饰,被当做编译期常量,在用到b的地方,直接替换为hallo
d的访问需要在运行时通过链接进行

猜你喜欢

转载自blog.csdn.net/weixin_43498251/article/details/87558747