java基础-类

2024-03-05

类成员

属性

声明

权限修饰符 数据类型 变量名
类的非静态变量赋值过程
	默认初始化
	显式初始化/代码块中的初始化(按定义先后顺序执行)
	构造器中的初始化
	有了对象以后,通过对象.属性或对象.方法赋值

与局部变量对比

局部变量没有初始化值,使用前一定要显示赋值
非静态属性加载在内存的堆空间中,局部变量加载在栈空间

方法

使用

// 声明
权限修饰符 返回值类型 方法名(形参列表) {
    方法体
}
// 返回值
有返回值时必须声明返回值类型,同时方法中使用return关键字,返回指定类型的数据
没有返回值的方法一般不使用return关键字,可以使用return;表示结束方法体

// 如何直接使用类成员
直接使用‘成员名’就可以
//  方法调用
在非静态方法中调用非静态方法时,直接使用’方法名’即可

重载

同一个类中,允许拥有一个以上同名方法,只要参数的个数/类型不同
如果形参的个数与类型都相同,但是顺序不同也是重载

重写

方法名和形参列表必须相同
权限修饰符允许比父类方法的权限修饰符大,但是不能小
	子类不能重写父类中private的方法
返回值类型
	父类被重写的方法的返回值类型是void,子类重写的方法的返回值类型必须是void
	父类被重写的方法的返回值类型是A类,子类重写的方法的返回值类型可以是A类或A类的子类
	父类被重写的方法的返回值类型是基本数据类型,子类重写的方法的返回值类型必须是相同的本数据类型
异常类型
	子类重写的方法的异常类型不能大于父类被重写的方法的异常类型
static
	都不是static才是重写
	static方法不能被重写

可变个数形参

java5.0新增特性

在方法的形参中,只能声明在末尾,且只能有一个

public void test(int ...a) {
    // 获取参数个数
		a.length;
	// 获取参数
		a[0];
		a[1];
}

// jdk5.0之前传递可变个数形参
public void test(int[] a) {}

值传递机制

基本数据类型
	将变量a赋值给变量b,变量a/b修改时不会对变量b/a造成影响,两者是互相独立的
引用数据类型
	将变量a赋值给变量b,变量a/b修改时会对变量b/a造成影响,两者是浅拷贝
	变量a的地址值赋值给变量b

构造器

作用

创建对象
初始化类属性

默认构造器

没有定义构造器时,系统默认提供一个空参的构造器
如果显式定义了类的构造器,系统将不会提供默认的空参构造器
默认构造器的权限修饰符和类的权限修饰符相同

定义

class Person{
    public Person() { // Person就是构造器
    }
    public Person(String n) { // Person就是构造器,构造器也可以重载
    }
}
// 使用
new 构造器(参数列表)
Person p = new Person();
Person p = new Person("名字")

代码块

用来初始化类和对象的信息(初始化类和对象的成员变量)
只能使用static关键字修饰代码块,不能使用其他关键字

分类

静态代码块

随着类的加载而执行
类的加载只有一次,静态代码块也只会执行一次
用来初始化类的信息
内部可以声明变量、调用属性和方法、编写输出语句等
先于非静态代码块执行
声明多个静态代码块时,按编写先后顺序执行
内部只能调用静态结构(属性、方法),不能调用非静态结构

非静态代码块

随着对象的加载(创建)而执行
每个对象创建时都会执行非静态代码块
用来初始化对象的信息
声明多个非静态代码块时,按编写先后顺序执行
内部可以调用静态结构(属性、方法),也可以调用非静态结构

定义

class {
	// 非静态代码块
	{
	   Integer i = 0;
       System.out.println(i);
	}	
	// 代码块
	static {
	    Integer i = 0;
        System.out.println(i);
	}	
}

内部类

定义

将一个类A定义在类B的内部,类A就是内部类
当类A的内部需要一个完整的结构进行描述,而这个内部的完成结构又只为外部类A提供服务,不在其他地方使用

分类

成员内部类

// 直接声明在外部类的里面
// 可以声明为静态成员内部类、也可以声明为非静态成员内部类
// 从类本身的角度看
//     可以声明属性、方法、构造器、代码块、内部类等结构
//    可以声明父类,可以实现接口
//     可以使用final修饰
//     可以使用abstract修饰
// 从外部类的成员的角度看
//     在内部可以调用外部类的结构
//     可以是public、private和protected修饰
//     可以使用static修饰
// 创建静态成员内部类的实例
//     new 外部类名.内部类名()
// 创建非静态成员内部类的实例
//     new 外部类名().new 内部类名()
// 如何在调用外部类的结构
//     可以直接不加修饰直接调用
//     当外部结构与内部结构重名时,外部类名.this.外部结构名()
public class A {
	String name = "a";
	Integer age = 11;
	public class B {
		String name = "b";
		public void show() {
			System.out.println("age" + age);
			System.out.println("name" + name);
			System.out.println("name" + this.name);
			System.out.println("name" + A.this.name);
		}
	}
}

局部内部类

// 声明在方法内、构造器内、代码块的内部类
// 匿名局部内部类、非匿名局部内部类
// 基本使用
public class A {
	String name = "a";
	Integer age = 11;
	public Comparable show() {
		// 非匿名实现
		public class B implements Comparable  {
			public int comparaTo(Obejct o) {
				return 0;
			}
		}
		return new B();
		// 匿名实现
		Comparable b = new Comparable ()  {
			public int comparaTo(Obejct o) {
				return 0;
			}
		}
		return b;
	}
}

权限修饰符

private
	类内部使用
	修饰的方法不能被重写
缺省(default)
	类内部使用
	同一个包内使用
protected
	类内部使用
	同一个包内使用
	不同包的子类内使用
		继承的子类中可以使用protected的结构
public
	类内部使用
	同一个包内使用
	不同包的子类内使用
	同一个工程内使用
class的权限修饰符只有public和缺省
所有权限修饰符都可以修饰属性、方法、构造器、内部类

使用

// 定义
public class Person
{
        String name;
        int age;
        boolean isMale;

        public void jieshao()
        {
                System.out.print("我叫" + name + ",今年" + age + "岁,我是" + (isMale ? "男" : "女"));
        }
}
//  实例化对象
Person person = new Person();
// 属性赋值
person.name = "Tom";	
// 打印属性的值
System.out.print(person.name);
// 调用方法
person.jieshao();

内存解析

类装载器
	方法区
		存储类的加载信息、常量、静态变量
	虚拟机栈
		存储局部变量
	本地方法栈
	堆
		存储new出来的结构
			比如对象、数组
			对象的非静态属性也存储在堆中
	程序计数器

将对象赋值给另一个对象时是浅拷贝,当有一个对象发生改变时,另一个对象也会改变

对象数组

Statudent[] arr = new Statudent[3];
// 对象数组的默认初始化值为null 

匿名对象

// 没有显式赋值给一个变量,只能使用一次
// new 对象名(){}.变量名
// new 对象名(){}.方法名()

public void show() {
      Thread t = new Thread() { // 他就是匿名对象
          @Override
          public void run() {
              
          }
      }
      t.start();
}


{/if}