7.构造函数和方法

构造函数和方法

一、构造函数(为什么要用):
a)简化对象的创建对象的过程
b)代码重用,为对象的属性赋值,当然还可定一些代码逻缉
在这里插入图片描述
二、构造函数规则:
a)构造函数名和类名完全一致
b)没有返回类型

三、构造函数语法:

public class Teacher {
	//默认构造函数
	public Teacher(){
}
//以下两个版本是不同的构造函数
public Teacher(String pName,  int pAge){
	name = pName;
	age = pAge;
}

public Teacher(int pAge,  String pName){
	name = pName;
	age = pAge;
    //根据需要这里还可以写上其它处理逻辑的代码
 }
}

注意:一个类可以有多个版本的构造函数(即构造函数重载),各版本的构造函数要么参数的个数或参数的类型不一样,参数顺序不一样也可以

四、如果定义类时,你定义了带参数的构造函数,那么此时默认构造函将变成不可用,如果你的确需要使用默认构造函数,那么你必须把默认构造函数明确的写出来。

public class Teacher {
//这样Teacher类的默认构造函数不可用了,如要用默认构造函数就要明确写出
public Teacher(String pName, int pAge){
	name = pName;
	age = pAge;
}
}

五、创建对象时内存中的分配情况:使用new关键字调用构造函数。
public static void main(String[] args) {
Dog dog = new Dog(); //默认构造函数
Person p1 = new Person(dog);
}
JVM的内存区分为:栈(地址,局部变量),堆,代码段,数据段。
在这里插入图片描述

六、类定义的进一步改进:
在这里插入图片描述
七、构造函数的作用。
在这里插入图片描述
•通过带参数的构造方法,显式地为实例变量赋予初始值。
•可以给一个类添加多个版本的构造函数,每个版本的构造函数必须要参数的个数不同或参数的类型不同。
•构造方法除了给属性赋值还可根据需要写其它代码,一个构造方法内还可以调用另一个构造方法。

public class Teacher2 {
	//属性
	String name;
	int age;
	String education; //学历
	String position; //职位
	
	//默认构造函数
	public Teacher2( ){
		name = "某某";
	}

	//带参数构造函数
	public Teacher2(String pName, int pAge){
		//主体
		name = pName;
		age = pAge;
	}

	public Teacher2(String pName, int pAge, String pEducation,String pPosition){
		//主体
		this(pName,  pAge); //调用上面的构造函数
        //name = pName;
		//age = pAge;
		education = pEducation;
		position = pPosition;
	}
}

//省略toString()方法……

public static void main(String[] args)  {
		Teacher2 t1 = new Teacher2();
		t1.name= "张三";
		t1.age= 20;
		t1.education = "本科";
		t1.position = "高级工程师";
		System.out.println(t1);

		Teacher2 t2 = new Teacher2("李四", 22, "本科", "教师");
		System.out.println(t2);

		//字符串属性不需要初始化时可以传null值
		Teacher2 t3 = new Teacher2("王五", 27, null, null);
		System.out.println(t3);
	}

方法部分

一、方法签名:方法的名字和方法的参数列表构成了方法的签名,值得注意的是方法的返回类型不被视为方法签名的一部分。
语法:

[访问修饰符] 返回类型/void  方法名( [参数列表] ){
		//方法主体
}
访问修饰符有4个:public, private, protected, default(不写出来)

void  a(){ }
String  a(){ }
这两个方法是相同的,语法错误!

二、方法调用:

语法:变量.方法(); 或 变量.方法(参数列表)
Person  person = new  Person();
person.speak();
person.eat(“肉”);
注意:在一个方法内也可以调用另一个方法。

三、构造函数和方法参数的两种参数传递方式:
a)按值传递:所有的8种基本数据类型即值类型(包括它们对应的包装类)都是按值传递方式也就是说传递的是变量值的副本,String也是按值传递。
int --> Integer类, float --> Float类, boolean --> Boolean类
b)按引用传递:所有引用类型(除String)都是按引用传递参数的即传递的是对象地址。
在这里插入图片描述

变量作用域、关键字部分

一、变量作用域
在这里插入图片描述
变量按可访问范围可分为:
a)成员变量(包括实例变量和类变量(也叫静态变量))也就是属性。
i.普通的属性(实例变量,非静态的),每个对象的属性都是独立的。
ii.静态的属性(类变量),所有这个类的对象都共享这个属性值。
b)局部变量也就是在构造函数、方法或代码块内(if-else, for, while,switch)声明的变量

二、this关键字
在这里插入图片描述
在这里插入图片描述
a)对象创建时,JAVA虚拟机都会给每个对象分配一个this关键字, 在本类中使用this时代表当前对象。
b)this用于构造函数和任何实例方法内,指向当前调用构造函数或方法的对象。
c)this 指向调用方法的当前对象。
d)this 关键字可在需要当前对象的引用时使用。
e)this不能在static静态方法里使用,如:main方法。
f)通过this(参数列表) 调用其他构造方法的时候, this()必须放到构造方法当中的第1行。
this(“alisa”, 24); //调用构造函数
public void aMethod() {
this.bMethod(); //调用本类的另一个方法
} 在这里插入图片描述

三、super关键字:指向父类

public Music() {
		//調用父类的构造函数,如果不写出这行代码,那在编译类时JVM也会自动加入这行代码,并且这行代码必须出现在构造函数内的第一行
		super(); 
		//如果是调用父類的方法可以如下
		String str = super.toString();
}

四、 变量和方法的分类:
•变量按static分类:
.静态变量(也叫类变量):变量值被该类的所有对象共享。
.非静态变量(也叫实例变量):其值只属于单个对象,独立。
•方法的分类有两种:
.静态方法(也叫类方法):此种方法被该类的所有对象共享。
.非静态方法(也叫实例方法):此种方法对该类的所有对象都是独立的。
在这里插入图片描述
五、 要理解static的作用,首先对内存区域有所了解:
内存里分四个区域:
a)code segment 代码段(存放代码,如静态方法)
b)data segment 数据段(存放静态变量、常量)
c)Stack 栈(存放局部变量,对象地址)
d)Heap 堆(存放new出来的对象或者数组)

六、静态变量(类变量):
类变量就是该类的所有对象共享的变量,任何一个该类的实例去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。类变量值的变化对该类所有对象来说都是知道的。在类方法(静态方法)中不能使用this关键字。
a)语法:
static 数据类型 变量名 [=初值];
b)静态变量示例:参看chapter07/variables/StaticDemo.java
c)静态方法(类方法)示例:参看chapter07/ variables /StaticMethodDemo.java
d)静态初始化块: 参看chapter07/ variables /StaticCodeBlockDemo.java
static{ …… }
e)初始化代码块:
{ …… }

七、静态方法(类方法):
a)语法:
访问修饰符 static 数据返回类型 方法名([参数列表]){ …… }
如:public static void main(String[] args){ }
调用:类名.类方法名([参数列表]);
b)静态方法共享,但每个方法内部的局部变量是私有的,每调用一次方法,会在栈中分配局部变量,方法退出时释放所有局部变量空间。
c)示例:类名.静态方法( [参数列表] );
注意:不要乱用静态方法

八、静态与非静态成员的访 问总结:
a)静态的东东总是通过类名直接访问,无须通过对象来调用。当然通过对象访问静态成员也是可以的但从不推荐这样用。
b)非静态成员的东东总是和对象相关联,也就是说非静态成员总通过对象来访问。
c)静态成员不可以访问非静态成员,反之Ok。

九、什么是JavaBean?其实就是一个通用的类,JavaBean也叫POJO(Plain Old Java Object)类,它有以下特点:
a)属性一般私有,使用private关键字声明。
b)为属性提供public 的getter 取值器和setter设值器方法,如:getName(), setName(String name)。
c)必须有一个public的默认构造函数。

为什么要用JavaBean:
i.使对象的信息更好的隐藏起来,不会轻易的被外界破坏,这也是面向对象设计的本质。
ii.利用Java中反射技术可让程序自动化。

十、包的作用:包其实在window里就是文件夹。
a)防止类命名冲突
b)可以更好的保护类中的数据
c)更加的模块化
d)在实际开发当中应根据类的职责将类放入到不同的包中
e)包的命名规则:
i.包的命名遵守互联网域名的反向命名法: news.sina.com, game.sina.com
ii.企业性质(com,edu,org,net).公司名.项目名.模块名[.子模块].类名
iii.包名由全小写字母组成,不能以圆点开头或结尾
/*

  • com.sina.news.*负责新闻处理的类
  • com.sina.game.*负责游戏处理的类
  • [com | org | net | edu] .公司名.项目名.模块名.类(子包)。如:
  • com.lanqiao.olts.Xxx.Examination.java完整的类名(包+类名)、全限定类名
  • com.lanqiao.ibook.entity.Order, Customer
  • com.lanqiao.ibook.dao.OrderDao, CustomerDao(负责访问数据库)
    */
    package com.lanqiao.olts; //必须在import语句之前
    import ……;
    public class Xxx{

}

使用命令编译包中的类:
1.先去到包的顶级目录
2.编译:javac 包名1/包名2……/类名.java
3.运行:java包名1/包名2……/类名

十一、类的改进

在这里插入图片描述
十二、 访问修饰符
访问修饰符可以用在:类定义,构造函数定义、属性、方法定义。在这里插入图片描述

1)private: 私有访问修饰符的成员只能本类可以访问,其它类无法使用private修饰的成员。
2)public: 公有访问修饰符,任何包中的类都可以访问。
3)默认访问修饰符:就是没有修饰符,同一个包中的类都可以访问。
4)protected: 受保护的,就是提供给在不同包中子类使用的,也叫做子类访问级别。等到讲继承的时候再说。

猜你喜欢

转载自blog.csdn.net/weixin_40574657/article/details/85845818