4.1.类是什么?
通过java语言描述的一组性质和特征相同或相似的自己定义的复合数据类型。
1.性质或特征相同或相似的事物综合体就是类。
2.类–类型–java数据类型—java中的复合数据类型–自己定义的复合数据类型
4.2.类是如何编写的?
通过class关键字来创建一个类
格式:访问限制修饰符 class 类名{
}
创建一个学生类
public class Student{
}
class Student{
}
1.访问限制修饰符—public 缺省的
public----[公共的] 所有包都可以访问
缺省的–[友好的] 同一个包中可以访问。
2.class—创建类的关键字【类的标志】
3.类名–合法的标识符【每一个的单词的首字母大写】
{}----类体
4.3类中可以编写什么?
类中可以编写变量和方法。
用变量来描述事物的基本特征【属性】,用方法来描述事物的基本行为【功能】。
我们描述一组事物通常是通过2个途径来描述:
1.基本特征【属性】--------变量
2.基本行为【功能】--------方法
例如:汽车
颜色 大小 速度 品牌------基本属性
前进 后退 转弯----------------基本行为
4.4 类中的变量的分类以及特征?成员变量的隐藏?静态成员变量与实例变量的区别?
变量的分类
1.成员变量【全局变量】—类中除过方法以外的地方【在类体,但没有在方法中】。
2.局部变量—类中的方法里面和方法的参数。
package com.click369.test1;
public class TestClass1 {
//类体中可以有变量和方法
//定义一个变量
/*
* 1.数据类型
* 2.变量名称
* 3.初始值
* 4.作用域【全局/局部】
* 全局/成员--整个类中通用【整个类中的任何一个方法中都可以调用】
* 局部-----只能在本方法中使用
*/
//出现在类体中,但不在方法中----成员变量【全局变量】
int test1=1001;
//类中的方法
public void my1(){
//出现在类体中,在方法中----局部变量
double dou=12.5;
}
//char ch变量出现在方法的参数位置----局部变量
public void my2(char ch){
}
}
成员变量的隐藏:
类中的某一个成员变量的名称与某一个方法中的局部变量的名称相同,那么类中的成员变量的数据值被局部变量覆盖隐藏。
成员变量与局部变量的区别?
成员变量【全局变量】的特征
1.类中除过方法以外的地方。
2.可以没有初始值,系统会自动赋予这个全局变量一个默认的初始值。
3.需要访问限制修饰符
4.可以在本类中的任何一个方法中被使用,且不受访问限制修饰符的影响。
局部变量的特征
1.类中的方法里面和方法的参数。
2.局部变量一定要有初始值。
3.不能有访问限制修饰符
4.只能在定义该局部变量的方法中使用,超出本方法就错误
4.5 类中的方法以及表现形式和特征?方法的重载?
1.方法
用来描述具有共同性质的一组事物的基本行为。
普通方法【实例方法】基本格式:
访问限制修饰符 方法的返回值类型 方法的名称(方法参数列表){
需要实现的基本行为
}
访问限制修饰符—public 缺省的
方法的返回值类型—方法执行成功以后的结果的数据类型
–有结果,方法的返回值类型就是结果类型【基本类型,复合数据类型】,方法体的最后一句话是return xxx;语句
–没有结果,使用void表示
方法的名称----合法的标识符【首字母小写,从第二个单词开始首字母大写】
test testHello testHelloWorld
方法参数列表—接收方法以外的数据进入本方法【请人帮忙】
—可以一个参数都没有()。
—可以有一个/多个(变量)/(int num1,double test1,String test)
{}—方法体
例如:
package com.click369.method1;
public class TestMethod1 {
/*
访问限制修饰符 方法的返回值类型 方法的名称(方法参数列表){
需要实现的基本行为
}
*/
public void test1(){
System.out.println("public修饰的没有返回值,没有参数,名称是test1的方法");
}
void test2(){
System.out.println("缺省修饰符修饰的没有返回值,没有参数,名称是test2的方法");
}
public int test3(){
System.out.println("public修饰的返回值为int,没有参数,名称是test3的方法");
return 100;
}
String test4(){
System.out.println("缺省修饰符修饰的返回值为String,没有参数,名称是test4的方法");
return "100";
}
public int test5(int num){
System.out.println("public修饰的返回值为int,有一个int型参数,名称是test5的方法");
return 100+num;
}
double test6(int num,double test){
System.out.println("缺省修饰符修饰的返回值为double,有两个参数,名称是test6的方法");
return num+test;
}
}
静态方法【类方法】基本格式:
访问限制修饰符 static 方法的返回值类型 方法的名称(方法参数列表){
需要实现的基本行为
}
package com.click369.method1;
public class TestMethod2 {
/*
访问限制修饰符 static 方法的返回值类型 方法的名称(方法参数列表){
需要实现的基本行为
}
*/
public static void test1(){
System.out.println("public修饰的没有返回值,没有参数,名称是test1的静态方法");
}
static void test2(){
System.out.println("缺省修饰符修饰的没有返回值,没有参数,名称是test2的静态方法");
}
public static int test3(){
System.out.println("public修饰的返回值为int,没有参数,名称是test3的静态方法");
return 100;
}
static String test4(){
System.out.println("缺省修饰符修饰的返回值为String,没有参数,名称是test4的静态方法");
return "100";
}
public static int test5(int num){
System.out.println("public修饰的返回值为int,有一个int型参数,名称是test5的静态方法");
return 100+num;
}
static double test6(int num,double test){
System.out.println("缺省修饰符修饰的返回值为double,有两个参数,名称是test6的静态方法");
return num+test;
}
}
构造方法:
1.没有方法返回值类型部分
2.方法的名称与类名称相同
访问限制修饰符 类名称(方法参数列表){
需要实现的基本行为
}
注意:1.用来创建对象的方法。
2.当我们创建好一个类以后,默认就有一个无参数的构造方法存在,只是没有显示出来。
3当类中出现有参数的构造方法时,我们最好将无参数的构造方法,手动显示出来,如果没有手动显示出无参数的构造方法,那么有参数的构造方法会将原本默认存在的无参数的构造方法覆盖。
package com.click369.method1;
public class TestMethod3 {
//1.没有方法返回值类型部分
//2.方法的名称与类名称相同
//访问限制修饰符 类名称(方法参数列表){
// 需要实现的基本行为
//}
//用来创建对象的方法
//当我们创建好一个类以后,默认就有一个无参数的构造方法存在,只是没有显示出来。
//当类中出现有参数的构造方法时,我们最好将无参数的构造方法,手动显示出来,
//如果没有手动显示出无参数的构造方法,那么有参数的构造方法会将原本默认存在的无参数的构造方法覆盖。
public TestMethod3(){}
public TestMethod3(String test){
}
}
方法重载----在同一个类中,方法名称相同,参数不同这种现象就是方法重载。
参数不同–1.有或无
–2.数量不同
–3.类型不同
注意:方法重载与方法的返回值类型,没有关系。
package com.click369.method1;
public class TestMethod4 {
//方法重载与方法的返回值类型,没有关系。
//构造方法重载
public TestMethod4(){}
public TestMethod4(String test){
}
public TestMethod4(String test,int num){
}
public TestMethod4(int num){
}
//实例方法重载
public void test1(){}
public int test1(String test){
return 100;
}
public int test1(int test){
return 100;
}
public void test1(int num1,int num2){}
//静态方法重载
public static void testStatic1(){}
public static int testStatic1(String test){
return 100;
}
public static int testStatic1(int test){
return 100;
}
public static void testStatic1(int num1,int num2){}
}
4.6 同一个类中方法与变量的调用关系?方法与方法的调用关系?
同一个类中方法与变量的调用关系
1.在同一个类中只能方法调用变量,不能变量调用方法
同一个类中方法调用变量
package com.click369.test1;
public class TestClassDemo5 {
//实例变量
public int shilibianlang=1001;
//静态成员变量【类变量】
public static String staticbianliang="类变量";
//构造方法
public TestClassDemo5(){}
public TestClassDemo5(int num){
//1.构造方法可以调用实例变量,默认是this.实例变量,this.可以省略
System.out.println(this.shilibianlang);
System.out.println(shilibianlang);
//2.构造方法可以调用类变量,默认是类名.类变量,类名.可以省略,也可以是this.类变量,this.可以省略
System.out.println(TestClassDemo5.staticbianliang);
System.out.println(this.staticbianliang);
System.out.println(staticbianliang);
}
//实例方法
public void test1(){}
public int test2(int num){
//1.实例方法可以调用实例变量,默认是this.实例变量,this.可以省略
System.out.println(this.shilibianlang);
System.out.println(shilibianlang);
//2.实例方法可以调用类变量,默认是类名.类变量,类名.可以省略,也可以是this.类变量,this.可以省略
System.out.println(TestClassDemo5.staticbianliang);
System.out.println(this.staticbianliang);
System.out.println(staticbianliang);
return num;
}
//静态方法【类方法】
//静态方法【类方法】中你绝对不能出现this
public static void teststatic1(){}
public static int teststatic2(int num){
//1.类方法不可以调用实例变量
//System.out.println(this.shilibianlang);
//System.out.println(shilibianlang);
//2.类方法可以调用类变量,默认是类名.类变量,类名.可以省略
System.out.println(TestClassDemo5.staticbianliang);
//System.out.println(this.staticbianliang);
System.out.println(staticbianliang);
return num;
}
}
同一个类中方法调用方法
package com.click369.test1;
public class TestClassDemo6 {
//构造方法
public TestClassDemo6(){}
public TestClassDemo6(int num){
//构造方法可以调用其他的构造方法,new + 其他的构造方法;
new TestClassDemo6();
//构造方法可以调用实例方法,默认this.实例方法,this.可以省略
this.test1();
test1();
//构造方法可以调用类方法,默认类名.类方法,类名.可以省略,也可以是this.类方法,this.可以省略
TestClassDemo6.teststatic1();
this.teststatic1();
teststatic1();
}
//实例方法
public void test1(){}
public int test2(int num){
//实例方法可以调用其他的构造方法,new + 其他的构造方法;
new TestClassDemo6();
//实例方法可以调用其他实例方法,默认this.实例方法,this.可以省略
this.test1();
test1();
//实例方法可以调用类方法,默认类名.类方法,类名.可以省略,也可以是this.类方法,this.可以省略
TestClassDemo6.teststatic1();
this.teststatic1();
teststatic1();
return num;
}
//静态方法【类方法】
//静态方法【类方法】中你绝对不能出现this
public static void teststatic1(){}
public static int teststatic2(int num){
//类方法可以调用其他的构造方法,new + 其他的构造方法;
new TestClassDemo6();
//类方法不可以调用实例方法
//this.test1();
//test1();
//类方法可以调用类方法,默认类名.类方法,类名.可以省略
TestClassDemo6.teststatic1();
//this.teststatic1();
teststatic1();
return num;
}
}
4.7 对象是什么?对象如何创建?创建好的对象的作用?
1.对象
我们可以认为类它就是一个模具/图纸,而现在的对象它就是通过这个类创建出来的实体/实例。
类—抽象的【不能用的,给你看的】— 设计图纸
对象–具体【能用的,给你用的】— 制作出来的实际的实体
对象就是通过类创建出来的实体/实例。
因此上我们把创建对象的过程就叫实例化。【创建对象】
类是创建对象的模具/图纸。
对象是通过类制作出来的实际的实体。
没有类就没有对象。
没有对象类就没有意义。
2.如何创建对象?
1、对象就是通过类创建出来的实体
2、通过 new + 构造方法 创建的。
3、定义格式:类名 对象名称;
4、创建格式:对象名称=new 构造方法;
定义+创建格式: 类名 对象名称=new 构造方法;
public class Student{
}
//定义格式:类名 对象名称;
Student stu1; ====> int num1;
//创建格式:对象名称=new 构造方法;
stu1=new Student(); ===> num1=100;
//定义+创建格式: 类名 对象名称=new 构造方法;
Student stu2=new Student();=====>int num1=100;
3.对象的作用
1.可以通过对象来调用定义在类中的变量【实例变量/类变量】,和方法【实例方法/类方法】,忽略访问限制修饰符的影响。
2.Java程序=对象+消息【类中的变量,方法】
3.其他类中实例变量/实例方法只能对象调用。
4.其他类中类变量/类方法,可以对象调用,也可以类名调用。
package com.click369.test1;
/**
* 学生类
* @author Administrator
*
*/
public class StudentBean {
//成员变量
//1.可以没有初始值
//2.可以在本类中的任意一个方法中被调用
//实例变量
public int stuid;
public String stuname;
public int age;
public String stuaddress;
//类变量
public static String classname;
//构造方法
public StudentBean(){
System.out.println("StudentBean类的无参数构造方法");
}
public StudentBean(String val){
System.out.println("StudentBean类的有参数构造方法,参数val的值是=="+val);
}
//实例方法
public void test1(){
System.out.println("StudentBean类的无参数实例方法");
}
public void test2(int num){
System.out.println("StudentBean类的有参数实例方法,参数num的值==="+num);
}
//类方法
public static void testStatic1(){
System.out.println("StudentBean类的无参数类方法");
}
public static void testStatic2(char ch){
System.out.println("StudentBean类的有参数类方法,参数ch的值==="+ch);
}
}
package com.click369.test1;
/**
* 主类--包含主方法【mian】的类就是主类
* @author Administrator
*
*/
public class TestMain {
//主方法【mian】
public static void main(String[] args) {
//定义对象
StudentBean stu1;
//创建对象
stu1=new StudentBean();
//定义+创建
//StudentBean stu2=new StudentBean("参数是字符串");
//通过对象调用实例变量
stu1.stuid=1001;
stu1.stuname="zhangsan";
stu1.age=23;
stu1.stuaddress="西安";
System.out.println(stu1.stuid+"\t"+stu1.stuname+"\t"+stu1.age+"\t"+stu1.stuaddress);
//通过对象调用实例方法
stu1.test1();
stu1.test2(100);
//类变量可以通过对象调用
stu1.classname="java班";
//类变量也可以通过类名调用
System.out.println("班级名称=="+StudentBean.classname);
//类方法可以通过对象调用
stu1.testStatic1();
//类方法也可以通过类名调用
StudentBean.testStatic2('A');
}
}
4.8 对象的内存分配原理?
对象是通过类创建的,而类是一种复合数据类型,那么对象的内存分配与复合数据类型的内存分配是一致。因此对象的内存分配会在内存的堆区和栈区都有分配。
4.9 对象的使用?
4.10 类与对象的关系?
以实例方法为例,解释对象调用方法的关系
没有参数,没有返回值
没有参数,有返回值
有参数,没有返回值
有参数,有返回值
package com.click369.test2;
public class UserBean {
public void testUser1(){
System.out.println("UserBean类的testUser1的实例方法");
}
}
package com.click369.test2;
/**
* 个人信息类
* @author Administrator
*
*/
public class PersonBean {
//1.没有参数,没有返回值
public void test1(){
System.out.println("没有参数,没有返回值");
}
//2.没有参数,有返回值
public String test2(){
System.out.println("没有参数,有返回值");
return "hello";
}
//3.有参数,没有返回值
public void test3(int num1,double num2){
System.out.println("有参数,没有返回值");
System.out.println("int num1=="+num1);
System.out.println("double num2=="+num2);
}
//4.有参数,有返回值
public double test4(int num1,double num2){
System.out.println("有参数,有返回值");
System.out.println("int num1=="+num1);
System.out.println("double num2=="+num2);
return num1+num2;
}
//5.参数为复合数据类型
public void test5(UserBean user){
System.out.println("参数为复合数据类型");
user.testUser1();
}
//6.返回值为复合数据类型
public UserBean test6(){
System.out.println("返回值为复合数据类型");
//UserBean user=new UserBean();
//return user;
return new UserBean();
}
}
package com.click369.test2;
public class TestMain {
public static void main(String[] args) {
PersonBean person=new PersonBean();
//1.调用没有参数,没有返回值
//person.test1();
//2.调用没有参数,有返回值,创建变量接收方法的返回值结果
//String value=person.test2();
//System.out.println("test2方法的执行结果=="+value);
//3.调用有参数,没有返回值,传入参数值
//person.test3(100, 12.5);
//int a=100;
//double b=12.5;
//person.test3(a,b);
//4.调用有参数,有返回值,传入参数值,创建变量接收方法的返回值结果
//double num=person.test4(100, 12.5);
//System.out.println("test4方法的执行结果=="+num);
//5.调用参数为复合数据类型的方法
//person.test5(new UserBean());
//UserBean user=new UserBean();
//person.test5(user);
//6.调用返回值为复合数据类型的方法
UserBean user=person.test6();
user.testUser1();
}
}