Java类及类的成员

Java类及类的成员,属性、方法、构造器、代码块、内部类

类与对象

类(class):是对一类事物的描述,是抽象的,概念上的定义。
对象(object):是实际存在的该类事物的每个个体,也称实例。
面向对象程序设计的重点是类的设计;设计类,就是设计类的成员

一. 类的构成

①属性和方法
属性:对应类中的成员变量,声明在类的{ } 中;
方法:对应类中的成员方法(函数)method;
②类和对象的创建:创建类的对象=类的实例化=实例化类;

二. 类和对象的使用

①创建类,设计类成员
②创建类的对象
③通过对象.属性, 对象.方法,调用对象的结构

三.类和多个对象的关系

1.若创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性(非static)
意味着,修改一个对象的属性,不影响另一个对象的属性的值;
代码实例:

public class Csdn {
	public static void main(String[] args) {
		Person tom=new Person(); //创建Person类的对象tom
		int s=tom.age =18;  //调用属性赋值
		System.out.println("age:"+s);//输出
		Person tin=new Person(); //创建Person类的对象tin
		System.out.println("age:"+tin.age +"\t"+"name:"+tin.name );//输出
	}
}
	class Person{
		String name="Tony";//属性
		int age=20;
	}

四. 匿名对象的使用

1.概念:创建的对象,没有赋给一个变量名
2.特征:只能调用一次
3.使用

PhoneMe  me=new PhoneMe();
me.show(new Phone());
class PhoneMe{
	public void show(Phone phone){
	phone.sendEmail();
	phone.playGame();
	}

五.对象的内存解析

在这里插入图片描述
堆(Heap):存放对象实例(通过new出来的结构 数组、对象等)非static的对象
虚拟机栈(Static):通常所说的栈,存放局部变量(方法中声明的,形参等)
方法区(Method area):存放类信息、常量、静态变量
(static域)、即时编译后的代码数据
内存解析例1
在这里插入图片描述

六.对象数组的内存解析

注:引用数据类型的变量,只可存储两类值 null 或是地址值(包含变量类型)

//随机生成五名学生的个人信息
public class Id {
	public static void main(String[] args) {
		Student[] stu=new Student[5];//定义数组
		for(int i=0;i<stu.length;i++) {
			stu[i]=new Student();//给每个元素创建对象
			stu[i].number =(int)(Math.random()*30+1);//生成随机数赋值
			stu[i].score=(int)(Math.random()*100);
			stu[i].state=(int)(Math.random()*7+1);
		}
		for(int i=0;i<stu.length;i++) {
			System.out.println( "学号:"+stu[i].number+"  "+
		"年级:"+stu[i].state+"成绩:"+stu[i].score);
		}
	}
}
	class Student{
		int number;
		int state;
		int score;
	}

图示
在这里插入图片描述

类的结构

类的结构之一:属性

成员变量(属性)与局部变量的对比

一. 相同点
①定义变量的格式:数据类型 变量名=变量值;
②变量都有其对应的作用域

二. 不同点
① 声明位置
成员变量(属性):直接定义在类的一对{ } 内;

class People{
String  name="tom";//属性
int age=19;
		}

局部变量:声明在方法内,方法 形参,代码块内,构造器形参及内部变量;
②权限修饰符的使用
成员变量(属性):可以在声明属性时,指明其权限;
常用权限修饰符(private、public、缺省/友好(默认)、protected)
局部变量:不可使用权限修饰符
③默认初始化值
成员变量(属性):类的属性,根据其数据类型,都有默认的初始化值;
整型(byte、short、int、long) : 0;
浮点型(float、double): 0.0;
字符型(char): 0 (或“\u0000");
布尔型(boolean): false;
引用数据类型(String、类、数组、接口): null
局部变量:无默认初始化值,调用局部变量时,一定要显示赋值(初始化)形参调用时赋值
③在内存中加载的位置
成员变量(属性):加载到堆(Heap)空间(非static)
局部变量:加载到栈(Static)空间

类的结构之二:方法

类中方法的声明和使用
方法:描述类应该具有的功能;
例如:Math类 sqrt()\random()……
Scanner类 nextInt(),nextDouble()……
Array类 sort(),binarySearch(),toString()……

一. 方法的声明

① 权限修饰符 返回值类型 方法名(形参列表){
方法体 ; }
②返回值类型:
有返回值:必须在声明时,指定返回值的类型,同时使用return关键字返回指定类型的数据;
无返回值:方法声明时,用void 来声明,表示不使用return;若使用return,则写成"return;"表示结束此方法。
③方法名:属于标识符,遵循标识符的命名规则和规范 (见名知意)
④形参列表,方法可声明0个1个等多个形参
格式:方法名(数据类型1 形参1,数据类型2 形参2……)
⑤方法体 :方法功能的体现
return 关键字的使用
① 使用范围:使用在方法体中
②作用:(1)结束此方法
(2)有返回值类型的方法,return 指定数据类型的数据;
注:return 之后,不可声明执行语句

二.方法的使用

说明:1.可以调用当前类的属性和方法
2.方法中不可以再定义方法

1.方法的重载

概念:在同一类中,允许存在一个以上的同名方法且参数列表不同;
特点:
①与返回值类型无关,只看参数列表且参数列表必须不同
如何调用: 根据参数列表的不同来调用
两同一不同:同一个类,相同方法名,参数列表不同(个数,类型)
②与此方法的权限修饰符,返回值类型,形参变量名都无关(严格按照定义)
方法重载代码示例

public int boy(int age) {
		return age=18;
	}
	public String boy(String name) {
		return name="Tony";
	}
	public void boy(String name,String sex) {
		name="Tom";
		sex="man";
	}
2.可变个数的形参

①格式:数据类型 … 变量名
Java SE 5.0中,提供了允许直接定义能和多个实参相匹配的形参,传递个数可变的实参

public void show(String ...strs){   }

②当调用可变个数形参的方法时,传入的参数个数可以是0个 1个2个……
③可重载
④可变个数形参在方法形参中,必须声明在末尾;

public void man(int m,int ...sd)//在形参列表末尾
//错误表示
public void man(int ...sd,int m)

⑤可变个数形参等同于

public void show(String[]  strs) {   }

⑥可变个数形参的使用

public class Csdn {
	public static void main(String[] args) {
		Csdn test=new Csdn();
		test.show(new String[]{"Tom","tony","Mary"});
		System.out.println();
		test.show("aa","bb","cc","dd");
	}
	public void show(String...str) {
		for(int i=0;i<str.length;i++) {
		System.out.print(str[i]+"\t");
		}
	}
		//与上述方法相同
//	public void show(String[] str) {
//		for(int i=0;i<str.length;i++) {
//		System.out.print(str[i]+"\t");
//		}
//
//}
}

在这里插入图片描述

3.方法参数的值传递机制

①变量的赋值
变量为基本数据类型,赋值的是变量所保存的数据值;
变量为引用数据类型,赋值的是变量所存在的地址值;其中包含变量的数据类型;
②方法形参的传递机制:值传递
1.①形参:方法声明时,小括号里的参数
②实参:调用方法时,实际传递给形参的数据
2.值传递机制
参数为基本数据类型,此时实参赋给形参的是实参真实存在的数据值;
参数为引用数据类型,此时实参赋给形参的是实参存储数据的地址值;

public class Zhi {
	public static void main(String[] args) {
		Zhi s=new Zhi();
		Swap d=new Swap();
		 d.m=19;
		d.n=80;
		System.out.println(d.m+"\t"+d.n);
		s.swap(d.m, d.n);
		System.out.println("m:"+d.m+"  "+"n:"+d.n);
		s.swap(d);
		System.out.println("m="+ d.m +"  "+"n="+d.n);
	}
	public void swap(int i,int j) {//基本数据类型的形参
		int temp=i;
		i=j;
		j=temp;
	}
	public void swap(Swap swap) {//引用数据类型的形参参
		int temp=swap.m;
		swap.m=swap.n ;
		swap.n=temp;		
	}	
}
class Swap{
	int m;
	int n;
}

在调用含基本数据类型形参的方法时,只是将实参传给了形参,并且只是进行了数据交换这一动作,并没有将交换后的数据返回给实参,所以调用时原来的实参数并没有发生交换;
在调用含引用数据类型形参的方法时,方法内交换数值,实参传给形参的是一个地址值,(实参与形参)他们所指向的是同一个地址,所以在方法体内交换的数值,在调用时,值就发生了交换;

4.递归方法(recursion)

含义:一个方法内调用它本身;
特点:包含了一种隐式的循环,会重复执行某段代码,但这种重复执行无需循环控制;
使用:这种循环一定是有方向的;否则会造成无穷递归,类似死循环;
代码示例

	//递归求阶乘
	public int   method(int num) {
		if(num==1) {
			return 1;
		}else {
			return num*method(num-1);
		}	
	}

斐波那契数列

	public int som(int num) {
		if(num<=2) {
		return 1;
		}else {
			return som(num-1)+som(num-2);
		}
	}
}

类的结构之三 构造器(构造方法)constructor

1.作用:
① 创建对象 ; 格式 new + 构造器
②初始化对象的属性
2.说明:
① 当我们没有显式的定义类的构造器,系统会默认提供一个空参的构造器
② 格式:权限修饰符+类名() { }
③ 可与其他形参列表不同的构造器构成重载
④构造器默认权限与当前类的权限相同
⑤一旦定义了显示的构造器,系统就不再提供默认的空参构造器
⑥ 一个类中至少有一个构造器

拓展 1.属性赋值顺序

属性赋值的基本操作:
① 默认初始化
②显示初始化// ③代码块中赋值
④构造器初始化
⑤对象.属性,或对象 . 方法
执行的先后顺序为 ①—>②/③—>④—>⑤

2.Java Bean

含义:是一种Java语言写成的可重用组件
符合如下标准的Java类就是一个java Bean
① 类是公共的;
②有一个无参的构造器
③有属性,且有对应的get /set 方法

类的结构之四 代码块(或初始化块)

格式:

public class Daimak {
	static String name;
	int age;
	static {
		name="大黄";
	}
	{
		age=18;
		name="Tony";
	}
}

1.作用:用来初始化类对象
2.代码块如果要被修饰的话,只能用static 修饰;
3.分类:静态代码块 VS 非静态代码块
静态代码块
①内部可以输出语句
②随着类的加载而执行,而且只执行一次;
③作用:初始化类的属性
④若一个类中定义了多个静态代码块,则按照声明的先后顺序执行;
⑤优先于非静态代码块的执行;
⑥静态代码块内只能调用静态的结构和属性,不能调用非静态的结构和属性
非静态代码块
①内部可以输出语句
②随着对象的创建而执行;
③没创建一个对象,就执行一次非静态代码块;
④非静态代码块可以调用静态和非静态代码块的结构;

类的结构之五 内部类

1.含义:Java中允许将一个类声明在另一个类B中,则类A就是内部类,类B就是外部类;
2.内部类的分类
成员内部类:静态成员内部类,非静态成员内部类
一方面:作为一个类
①类内可以定义属性和方法
②可以被final修饰表示此类不能被继承,意味着不不用final修饰可以被继承;
③可以被abstract修饰
另一方面:作为外部类的成员
①可以调用外部类的结构,属性
②可以被static修饰
③可以被四种权限修饰符修饰
注:
①如何实例化成员内部类的对象
静态成员内部类

Person.Leg o=new Person.Leg();

非静态成员内部类

Person p=new Person();
Person.Hands h= p.new Hands();

②如何在成员内部类中区分调用外部类的结构

public  class Person {
	String name="二狗";
     class Hands{
    	String name="狗子";
	 public void playget(String name) {
		 System.out.println(name);//方法形参
		 System.out.println(this.name);//内部类属性
		 System.out.println(Person.this.name);//外部类属性	 
	 }		
	}
	}

③开发中如何使用
返回一个实现了某接口(如Comparable接口)的类的对象;
3.成员内部类和局部内部类在编译后都会生成字节码文件
格式:成员内部类 Person$Hands.class
局部内部类:Person$1AA.class

局部内部类使用当中的一个注意点:
在局部内部类的方法中,如果调用局部内部类所声明的方法中的局部变量,要求此局部变量声明为final的(jdk 7及以前)
jdk 8 之后 可以省略 final的声明

class Animal{
	public void show() {
	 int num=10;
		class Dog{
			public void sow() {
//				num=20;不能修改只能调用
				System.out.println(num);
			}
		}
	}
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值