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里面的资源来进行直接添加,当全参构造直接添加之后,原来默认存在的无参构造会被覆盖,所以这时候需要进行手动添加.
构造方法也会存在重载的现象:方法的重载,在同一个类中,方法名相同且参数列表不同的现象
关于构造函数的记忆:
- 特点:构造函数方法名与类名相同,且没有返回值类型
- 执行时机:创建对象时立即执行
- 默认会创建无参构造,但是,如果自定义了含参数构造,默认的无参数构造会被覆盖,注意需要手动添加
2.变量
2.1概念
变量是指可以改变的数,在Java园中,所有的变量使用前都需要进行声明
一般通过"变量类型 变量名 = 变量值",这三个部分来描述一个变量:如 int a = 3;
2.2局部变量
位置:定义在方法里或者局部代码块中
注意:必须进行手动初始化分配内存,如:int i= 5;
作用域:也就是方法里面或者局部代码块当中,方法运行完了就会被释放
2.3成员变量
位置:定义在类里方法外
注意:不用初始化,也会自动被初始化成默认值
作用域:整个类中,类消失了,变量才会被释放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构造代码块的特点
- 位置:在类的内部,在方法的外部
- 作用:用于抽取构造方法中的共性代码
- 执行时机:每次调用构造方法前都会调用构造代码块
- 注意事项:构造代码块优先于构造方法加载
3.2局部代码块
- 位置:在方法里面的代码块
- 作用:通常用于控制变量的作用范围,出了花括号就失效
- 注意事项:变量的作用范围越小越好,成员变量会存在线程安全的问题
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;
/**构造代码块:
- 位置:类里面构造方法外面
- 作用:用来提取构造方法的共性功能
- 执行时机:在构造方法之前调用
*/
{
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特点
- 使用extends关键字来表示继承关系
- 相当于子类把父类的功能复制了一份
- Java只支持单继承
- 继承可以传递(爷爷\爸爸\儿子这样的关系)
- 不能继承父类的私有成员(私有属性\私有方法)
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
- 继承以后,子类就拥有了父类的功能
- 在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
- 子类中方法的签名与父类完全一样时,就会发生覆盖/重写
- 格式要求:方法的返回值 方法名 参数列表要完全一致,及时方法体是重写的
- 注意:父类的私有方法不被重写,子类在重写父类方法时候,修饰符要大于等于父类的修饰符