构造方法
构造方法
- 概述:在创建一个对象时,构造方法可以给对象中的属性初始化
- 别名:构造器 构造函数
- 格式:
修饰符 方法名(参数列表){
方法体语句;
}
- 说明:
(1)修饰符:public
(2)方法名:和类名一模一样
(3)参数列表:要和那些属性赋值,就定义那些变量
(4)方法体语句:给属性赋值的操作 - 特点:
(1)构造方法是在创建对象时,由虚拟机默认调用
(2)构造方法不能自己手动调用
(3)一个对象只能调用一次构造方法
注意事项
-
如果类中没有定义任何构造方法,系统默认提供一个空参构造
-
如果在类中定义个任意一个构造方法,系统不再提供另外一个
-
一般在类中既要提供空参构造,也要提供有参构造(利用方法的重载)
如果在创建对象时,传递参数,就会默认调用有参构造给属性赋值
如果在创建对象时,不传递参数,就会默认调用空参构造public class Person { String name; int age; public Person() { super(); // TODO Auto-generated constructor stub } public Person(String name, int age) { super(); this.name = name; this.age = age; } }
public static void main(String[] args) {
Person p = new Person("张三",18);
}
静态
静态的好处
- 如果没有静态:
某个类型的每一个对象中,都有一个相同的属性值,就需要在每一个对象中给这个相同 的属性值,都开辟一段空间来进行存储。 - 有静态:
如果某个类型中的每一个对象中都有一个相同的属性值,可以将该属性定义为静态
一旦定义为静态之后,该静态变量就在方法区中开辟空间存储数据
好处:
(1)解决堆内存空间
(2)如果需要赋值或者需要修改只需要操作一次即可,数据维护起来比较容易
静态的特点
- 静态使用 static 关键字来表示
- 静态变量是随着类的加载就存在
- 静态变量是在对象的创建之前就已经存在,可以被访问
- 某个类型中的静态变量可以被该类所有对象所共享
- 静态可以被类名直接调用,也可以被对象调用
静态方法
- 静态方法:通过static修饰的方法就是一个静态方法
- 跟静态特点相同:
- 注意事项:
(1)静态方法不能访问非静态变量,可以访问静态变量
静态方法随着类的加载就可以被调用,这时对象可能还没创建,对象没创建,非静态变量就还没有存在,没有存在,就不能被访问。
(2)静态方法中不能调用非静态方法
因为非静态方法可以访问非静态变量,如果静态方法可以访问非静态方法,就相当于静态方法可以间接的访问非静态变量,和第一点矛盾。
(3)静态方法中不能存在this关键字
this表示当前对象,静态方法可以被调用的时候,对象可能还没创建,this不知道指向哪一个对象 - 总结:静态不能访问非静态
静态变量和非静态变量的区别
- 所属不同:
静态变量:属于类
非静态变量:属于对象 - 存储的空间不同:
静态变量:随着类的加载存在,在方法区中存储
非静态变量:在堆内存中存储 - 生命周期不同:
非静态变量:随着对象的创建存在,随着对象的回收消失
静态变量:随着类的加载存在,随着类的字节码对象回收 - 调用方式不同:
静态变量既可以通过类名调用,也可以通过对象调用
非静态变量只可以通过对象调用
继承
继承
- 概述:面向对象三大特征之一,让类和类之间产生子父类的关系
- 关键字:extends
- 子类:用于继承其他的类 派生类
- 父类:被其他类继承的类 基类 超类
- 继承的好处:
(1)减少代码的冗余量
(2)提高代码的复用性
(3)提高代码的可维护性 - 缺点:
提高了类之间的耦合性
耦合性:类之间的关联 - 效果:子类继承父类之后,父类的一些内容,子类可以继承,可以使用
继承的注意事项
- 父类中定义的私有变量和私有方法,子类不能继承
父类的私有成员变量,在子类中不能直接访问、使用
虽然父类的私有变量子类不能直接访问,但是可以使用继承而来的公共访问方法去间接的访问。 - 父类中的构造方法,子类也不能继承
原因1:
父类的构造方法名字应该和父类的类名保持一致
子类的构造方法名应该和子类的类名保持一致
如果子类继承了父类的构造方法,那么子类的构造方法名就不能喝类名保持一致
原因2:
父类的构造方法是用于给父类的成员变量初始化赋值
子类的构造方法用于给子类的成员变量初始化赋值
如果子类继承父类的构造,子类中定义的特殊属性,就不能使用构造赋值 - 使用继承需要遵循两个原则:
原则1:
父类中应该定义的是一些公共内容
如果子类有特殊内容,可以在子类中单独定义
原则2:
子类必须是父类的一种
this和super关键字
-
this:当前对象,哪个对象调用this所在的方法,表示哪一个对象
-
super:当前对象中父类的对象
-
访问的内容:
this可以访问本类对象中的属性
super可以访问本类对象中父类对象的属性
this可以访问本类对象所属类型的方法
super可以访问本类对象父类对象所属类型的方法
this()表示访问本类的构造方法
super()可以访问父类的构造方法class Fu{ int i = 10; } class Zi extends Fu{ int i =1000; public void get(int i) { System.out.println(i);//1000就近原则 System.out.println(this.i);//1000当前对象 System.out.println(super.i);//10当前对象中父类的对象 } }
方法的重写
-
引入:
父类中定义了一个方法,子类需要这个功能,但是不想使用父类中定义的实现内容 -
解决:
可以正常继承父类的方法,但是可以将父类的内容进行修改,这就是方法的重写 -
重写:
在子父类中,方法的名字相同,参数列表相同,返回值类型也相同,方法体语句可以不同。
4、要检测一个方法是否是重写,可以使用一个注解:
@Override
在重写的方法上加上注释,如果不报错,表示当前方法是重写的父类方法
如果加上注释之后,方法编译报错,表示此方法不是重写的class Fu{ public void work() { System.out.println("工作"); } } class Zi extends Fu{ @Override public void work() { System.out.println("读书"); } }