005构造方法

1.构造方法

1.1概念
构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法.
对象创建就是通过构造方法完成的,主要功能是完成对象的创建或者对象的初始化
当类创建对象(实例化)时,会自动调用构造方法
构造方法与普通方法一样可以重载/
1.2形式
与类同名,且没有返回值类型,可以含参数也可以不含参数

修饰符  方法名([参数列表]){方法体}

1.3关注全参构造\无参构造

package oop;

public class Demo1_Constructor {
	public static void main(String[] args) {
		Person person = new Person();
		System.out.println(person.age);
		System.out.println(person.gender);
		System.out.println(person.name);
		System.out.println(person.salary);
		person.eat();
		person.play();
	}

}

class Person {
	String name;
	int age;
	String gender;
	double salary;

	public Person() {
		System.out.println("我是Person的无参构造");
	}

	public Person(String s, int i, String s2, double d) {
		name = s;
		age = i;
		gender = s2;
		salary = d;
		System.out.println("我是Person的全参构造");
		System.out.println("我的名字叫" + s + "今年" + i + "岁,我是" + s2 + "工资" + salary);
	}

	public void eat() {
		System.out.println("北方人爱吃面~");
	}

	public void play() {
		System.out.println("她喜欢做手工~");
	}
}

这里需要注意:全参构造可以通过Source里面的资源来进行直接添加,当全参构造直接添加之后,原来默认存在的无参构造会被覆盖,所以这时候需要进行手动添加.

构造方法也会存在重载的现象:方法的重载,在同一个类中,方法名相同且参数列表不同的现象

关于构造函数的记忆:

  1. 特点:构造函数方法名与类名相同,且没有返回值类型
  2. 执行时机:创建对象时立即执行
  3. 默认会创建无参构造,但是,如果自定义了含参数构造,默认的无参数构造会被覆盖,注意需要手动添加

2.变量

2.1概念
变量是指可以改变的数,在Java园中,所有的变量使用前都需要进行声明
一般通过"变量类型 变量名 = 变量值",这三个部分来描述一个变量:如 int a = 3;
2.2局部变量
位置:定义在方法里或者局部代码块中
注意:必须进行手动初始化分配内存,如:int i= 5;
作用域:也就是方法里面或者局部代码块当中,方法运行完了就会被释放
2.3成员变量
位置:定义在类里方法外
注意:不用初始化,也会自动被初始化成默认值
作用域:整个类中,类消失了,变量才会被释放005构造方法2.4局部变量与成员变量

package cn.oop;

import java.util.Iterator;

public class VariableTest {
	static int count;
	static int sum = 200;

	public static void main(String[] args) {
		int sum = 100;
		System.out.println(sum);// 100,变量使用:就近原则
		System.out.println(count);// 0
		for (int i = 0; i < 10; i++) {
			System.out.println(i);
		}
//	System.out.println(i);//i会报错,i cannot be resolved to a variable
	}
}

3.构造代码块与局部的代码块
3.1构造代码块的特点

  1. 位置:在类的内部,在方法的外部
  2. 作用:用于抽取构造方法中的共性代码
  3. 执行时机:每次调用构造方法前都会调用构造代码块
  4. 注意事项:构造代码块优先于构造方法加载

3.2局部代码块

  1. 位置:在方法里面的代码块
  2. 作用:通常用于控制变量的作用范围,出了花括号就失效
  3. 注意事项:变量的作用范围越小越好,成员变量会存在线程安全的问题

3.3测试代码块的加载顺序
package cn.edtu.oop;

public class TestBlock {
public static void main(String[] args) {
/*每次创建对象时候,都会调用对应的构造方法/
final Student student1 = new Student();//通过调用无参构造创建对象
final Student student2 = new Student(“黄小仙”, “Java课程”);//通过调用全参构造创建对象
System.out.println(student2.name);
System.out.println(student1.subject);
student1.study();
student2.play();
}
}

class Student {
//定义属性—成员变量----全局生效
String name;
String subject;
/**构造代码块:

  1. 位置:类里面构造方法外面
  2. 作用:用来提取构造方法的共性功能
  3. 执行时机:在构造方法之前调用
    */
    {
    subject = “Java学习”;
    System.out.println(“这里是一个构造方法”);
    }

/**构造方法的定义:修饰符 方法名 (参数列表){方法体}
*/
public Student() {
System.out.println(“无参构造” + subject);
}

public Student(String n, String s) {
	name = n;
	subject = s;
	System.out.println("全参构造" + subject);
}

public void study() {
	{
	/**局部代码块:
	1.位置:方法里
	2.作用:用来控制变量的作用范围(作用范围越小越好,因为越小越安全)
	3.执行时机:调用方法时
	*/
		int i = 10;
		System.out.println(i);
	}
	// System.out.println(i);范围超过可用范围
	// i cannot be resolved to a variable
	System.out.println("正在学习java课程");
}

public void play() {
	System.out.println("正在玩手机游戏");
}

}

4.1概念
This代表本类对象的一个引用对象
4.2形式
this.name = name;
4.3练习this的方法之间的调用

package cn.edtu.oop;

public class TestThis {
	public static void main(String[] args) {
		new Dog();//含参构造旺旺,无参构造
		System.out.println("----------");
		Dog d = new Dog();//含参构造旺旺,无参构造
		System.out.println("---------");
		Dog d2 = new Dog("狗狗");//含参构造狗狗
	}
}
class  Dog{
	String name;
	public Dog() {
		this("旺旺");
		/** 在无参构造中调用含参构造的功能
		 * 规定:this关键字必须在构造方法中的第一行*/
		System.out.println("无参构造");
	}
	public Dog(String string) {
		//this();//Recursive constructor invocation Dog()不能同时调用无参中的含参的同时来调用含参中的无参,会造成死循环
		System.out.println("含参构造"+string);
	}
}

5.继承
5.1继承
继承是面向对象最显著的一个特征
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并扩展新的能力
java继承是会用已经存在的类的定义作为基础建立新 类的技术
新类的定义可以增加的数据或者新的功能,也可以使用父类的功能,但是不能选择性继承父类(超类/基类)
这种继承使得以前的代码复用非常容易,能够大大的缩短开发的周期,降低开发费用
5.2特点

  1. 使用extends关键字来表示继承关系
  2. 相当于子类把父类的功能复制了一份
  3. Java只支持单继承
  4. 继承可以传递(爷爷\爸爸\儿子这样的关系)
  5. 不能继承父类的私有成员(私有属性\私有方法)

5.3继承案例

package cn.edtu.oop;

public class TestExtends {
	public static void main(String[] args) {
		Dog2 dog = new Dog2();
		dog.eat();
		System.out.println(dog.a);
		// System.out.println(dog.b);
		final LittleDog littleDog = new LittleDog();
		littleDog.eat();
		System.out.println(littleDog.a);
	}

}

class Animal {
	public void eat() {
		System.out.println("动物什么都吃");
	}
}

class Dog2 extends Animal {
	int a = 100;
	private int b = 200;
}

class LittleDog extends Dog2 {

}

6.super
可以通过关键字使用父类的内容,Super代表的父类的一个引用对象
注意:在构造方法里面,出现的调用位置必须是在第一行

7.方法重写Override

  1. 继承以后,子类就拥有了父类的功能
  2. 在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
  3. 子类中方法的签名与父类完全一样时,就会发生覆盖/重写
  4. 格式要求:方法的返回值 方法名 参数列表要完全一致,及时方法体是重写的
  5. 注意:父类的私有方法不被重写,子类在重写父类方法时候,修饰符要大于等于父类的修饰符
上一篇:python基础005----字典&集合


下一篇:学习python -- 第005天