构造方法
1是一个与类同名的方法,并且他没有返回值 2作用是完成对象创建或者初始化 3当类创建对象时,就会自动调用构造方法 4构造方法与普通方法一样可以重载;
形式
与类同名,且没有返回值,可以含参,也可以不含参
修饰符 构造方法名(与类名相同)[参数列表 ] { 代码 -------- }
构造方法如何记忆 1特点 方法名与类名相同 ,且没有返回值类型 2执行时机;创建对象时会立即执行 3默认会创建无参构造,但是如果创建了含参构造时,会自动覆盖默认的无参构造,需要手动添加
/*构造方法的练习/ public class exercis { public static void main(String[] args) { //用new为gods 创建对象时 每一次定义都会执行构造方法 gods g=new gods(); gods g1=new gods(“火神”); gods g2=new gods(); } } //将"神王"抽象化定义为类 class gods{ //定义属性 也就是成员变量,不是局部变量 String firecgod; String watergod; String segod;
public gods(){
System.out.println("我是一个无参函数");
}
public gods(String s){
System.out.println("我是一个有参函数");
}
public gods(String firecgod, String watergod, String segod) {
this.firecgod = firecgod;
this.watergod = watergod;
this.segod = segod;
System.out.println("我是一个全参函数");
}
} 如图可见 ,对照有参和全参,调用有参时,()内输入类型.和参数, 输出结果才会时有参,不然括号没有内容,会象全参一样默认为无参
构造代码块与局部代码块
格式 : { } 构造代码块的特点 1 位置在类里,方法外 2,作用:用于抽取构造方法中的共性代码 3执行时机:每次调用构造方法时都会提前调用构造代码块 4注意事项:构造代码块优先于构造方法加载
局部代码块 位置: 在方法里面的代码块 作用:通常用于控制变量的作用范围,除了括号会失效 注意事项:变量的作用范围越小越好,成员变量会存在线程安全的问题
如图可见,创建对象时,会触发构造函数,而每次出发构造函数,一定会触发构造代码块,并且构造代码块要优先于构造函数.
局部代码块
this
代表本类对象的一个引用对象 this.name=name 形式 //当方法内的局部变量和成员变量同名时,可以使用this 来指定成员变量
,
this练习之构造方法间的调用
在有参中 this(); 可以调用无参 在无参中 this(类型;参数)可以调用无参 不要形成循环
创建对象的流程
person p =new person () 1把person.class 加载进内存 2在栈内存中开辟空间 用来存放变量p 3在堆内存开辟空间,用来存放 new person 所生成的对象 4对象生成后,会生成一个唯一的地址值 5将地址值交给变量p 6以后可以用变量p来调用 new person的属性值和方法
继承
是面向对象最显著的一个特征 是从已有的类中派生出新的类,新的类会继承以有类的属性和行为,并扩展新的能力 新类可以自定义增加新的数据和行为,且可以使用父类的功能,但不能选择性的继承父类(超类,基类) 这种继承方式可以节省开发效率,降低开发费用
继承的特点
1,使用extends 关键字来表示继承关系 2相当于把子类把父类的功能复制了一份 3java 只支持单继承 4继承可以传递 (爷爷-爸爸-儿子) 5父类的私有资源(private)修饰过的,不能被子类继承 6多用于功能的修改,子类可以在拥有父亲属性和行为的同时,在进行扩展
/*构造方法的练习/ public class exercis { public static void main(String[] args) { Elephant e=new Elephant(); Tiger t =new Tiger(); Dog d =new Dog(); e.Power(“大象”); t.Power(“老虎”); d.Power(“修勾”); t.god(“啸天虎”); d.gods(10000,“啸天神虎”); } } //定义爷爷类 class Elephant{ String weight; public void Power(String b){ System.out.println(b+“说他的力量是最强的”); }
} //定义儿子类 class Tiger extends Elephant { private String b = “其实我是虎王”;//私有属性 子类 "dog"用不了,访问不到
public void god(String a) {
System.out.println("我是" + a + "大象跟我装什么呢.");
}
} //定义孙子类 class Dog extends Tiger { public void gods(int c,String a) { //可以使用父类的所有的非私有资源,而且私有资源不能被限制访问到 System.out.println(“我差不多是”+c+“个”+a+“的加起来在呈1000的总成吧”); } } //定义父亲类 class tight{ int sum=1 }
//定义孙子类 class Dog extends Tiger { //定义子类的成员变量 int sum=10; public void gods( ) { int sum=100; System.out.println(sum);//结果为100 System.out.println(this.sum);//结果为10 System.out.println(super.sum);//结果为1
super之继承中构造方法的使用
本类用于测试继承中构造方法的使用
- 1.子类在创建对象时,默认会先调用父类的构造方法
- 2.原因是子类构造函数中的第一行默认存在super();–表示调用父类的无参构造
- 3.当父类没有无参构造时,可以通过super(参数)调用父类的其他含参构造
- 子类必须调用一个父类的构造函数,不管是无参还是含参,选一个即可
- 4.构造方法不可以被继承!因为语法的原因:要求构造方法的名字必须是本类类名
- 不能在子类中出现一个父类名字的构造方法
|