java学习第五周
-
1、对于上期this学习的补充。
this修饰的方法。
public class ThisFangFa{
String name;
int number=1;
int age=18;
String sort;
public ThisFangFa(){
//如果这里this(12,2);不写在第一行也是会报错的。
//注意,这里如果写成this.ThisFangFa(12,2);会报错。报错:找不到符号。
this(12,2);//下面new 进来后顺序执行。
this.nameShow();//this.__如果横线上是成员方法,那是可以多次this来实现的。
this.show();
System.out.println("构造方法中的无参构造");
System.out.println("------------------------");
//如果构建了有参构造是不会自己再构造无参构造的
}
public ThisFangFa(String name){
this();//this()会根据后面括号内的参数来找到相应的语句。
}
/*
public void show(){
//this();//如果这里使用的话,会报错不在第一行。
//this可以在实例方法和构造方法中使用。也就是说不能在这个方法里面使用。
System.out.println("name="+ name);
}
*/
public ThisFangFa(String name,String sort,String lastName){
this.name=name;
this.sort=sort;//这里this后,后面再这样赋值也是传进去的值,而不是默认值。
System.out.println("name "+name+"\n"+"sort "+sort+"\n"+"lastName "+lastName);
}
public ThisFangFa(int age,int number){
this.age=age;//this的作用这里又可以证实是传递实际参数呢
this.number=number;
System.out.println("------------------------");
System.out.println("age="+age+" "+"number="+number);
}
public void nameShow(){
System.out.println(name+sort);
}
public static void main(String[] args){
ThisFangFa f1=new ThisFangFa();//无参构造,这里会调用无参?这里的意思是调用的上面的无参构造。
//f1.show();//但是这里输出就是null了。然后这里因为没有东西传进String name所以就是默认值了。
ThisFangFa f2=new ThisFangFa("l","x","m");
f2.nameShow();//输出所有字符。
//难道这里使用 __.___不能对构造方法使用吗?
ThisFangFa f3=new ThisFangFa("penguin");//这里f1,f2,f3不可以重复用。
//例如:
/* ThisFangFa f1=new ThisFangFa();
ThisFangFa f1=new ThisFangFa("l","x");
会报错已在方法main中定义了变量f1
*/
//这个new结束后,对于下一个新的f1 new的直接给GC了吧
}
}
输出为:
------------------------
age=12 number=2
nullnullnull
name= null
构造方法中的无参构造
------------------------
name l
sort x
lastName m
lxm
------------------------
age=12 number=2
nullnullnull
name= null
构造方法中的无参构造
------------------------
总结 :
1、a.如果是构造方法中,this();
以这种形式,然后根据参数不同,来调用相应参数的构造方法。
b.如果是其他的成员方法,就this可以省略。写成this.show();
和show();
效果是一样的。
2、this();得写在第一行。而且this是在构造方法中(和实例方法)才能使用,不然会报错。
3、构造方法中使用this()
可以调用对方(例如上面的ThisFangFa(String name)
就调用了ThisFangFa()
)。注意:构造方法中不要写成了this.
类名。
- 2、 构造方法。
public class GouZaoFangFa {
public static void main(String[] args) {
wuCanGouZao method=new wuCanGouZao();
System.out.println(method);
}
}
class wuCanGouZao {
}
并没有报错,而且输出为:
wuCanGouZao@15db9742
如果类中没有任何构造方法,系统会给一个默认的无参构造;
构造方法不需要写返回值,但是他的返回值还是存在的,返回为this
其类型为所代表的类型。(类是一种特殊的数据类型,包含了一些基本数据类型,引用类型和方法。)
public class GouZaoFangFa {
public static void main(String[] args) {
//注意这里没有用new了。
wuCanGouZao method = wuCanGouZao.getCanShu("pz",18);//---------也就是说这里有问题。
//wuCanGouZao method = new wuCanGouZao("pz",18);//这里面的方法用了private修饰后,就不能这样写了。
method.getCanShu("pz",18);
method.show();
//就是在外部传参。 //如果把参数消掉,对应调用方法又不行。
//System.out.println(method);//但是这里的输出应该怎么用呢?
}
}
class wuCanGouZao {
private String name;
private int age;
/*private wuCanGouZao(String name,int age) {
this.age=age;
this.name=name;
}*/
public static wuCanGouZao getCanShu(String name,int age) {
//也就是说这个也属于构造方法里面?不然这show下面的怎么就可以了?
//所以这种下面show中的方式是不需要new的一种调用构造方法的方式?
//如果去掉了 类名的话(也就是wuCanGouZao)那也会报错,说什么需要返回类型。
//public 这里使用,void会报错,如果我需要用void
wuCanGouZao canShu = new wuCanGouZao();
//参数对应不上也会报错?//这还是根据构造方法是否对应的上。
//这个如果没有this上面的语句,也会报错的。所以这个new语句是什么意思?
//以前也没有在方法里面来new实现过,参数什么的和调用之类的,都没有实现过。
System.out.println(name+" "+age);//那如果我要在外部输出呢?
return canShu;//这个能调用吗?//对于这个canShu怎么调用?
}
public void show() {
wuCanGouZao can = wuCanGouZao.getCanShu("pz",18);
//也就是说这也是一种直接不需要写new语句的?
//wuCanGouZao can = new wuCanGouZao("pz",18);
//跟在上面GouZaoFangFa中要求一样。
//如果需要在方法里面new的话,要求是什么?
can.getCanShu("pz",18);
}
}
输出为:
pz 18
pz 18
pz 18
pz 18
下面再给一段的:
public class PrivateV {
public static void main(String[] args) {
S sum = S.age(10);//没有在这里面new
}
}
class S {
private int age=9;
private int year;
public S(int age) {
this.age=age;
System.out.println(12);
}
public static S age(int age) {
S s = new S(age);//如果这里括号内为我在上面定义的year的话,就会报这个错:无法从静态转为动态。//所以这里的static不能忘记写了。
System.out.println(age);
return s;//这里的返回类型目前还不知道有没有其他的
}
}
//而且如果上面写成:S s = new S();那么则需要有一个相应的无参构造出现,或者没有一个有参构造,系统会默认的一个无参构造。
输出为:
12
10
先输出S的构造方法中的,再输出S age的。
- 3、类方法(
static{}
形式 )
public class LeiFangFa{
public static void main(String[] args) {
System.out.println("语句一");
}
static {
System.out.println("static类方法");
}
}
上面的这段输出是什么?
输出为:
static类方法
语句一
public class LeiFangFa{
public static void main(String[] args) {
System.out.println("语句一");
Lei lei = new Lei();//一次调用
Lei lei2 = new Lei();//二次调用,看是否会输出两次static类方法
}
}
class Lei {
public Lei() {
System.out.println("构造方法");
}
static {
System.out.println("static类方法1");
System.out.println("static类方法2");
}
}
//lei和lei2 说明了static语句只执行一次。初始化输出完了就结束了。
输出为:
语句一
static类方法1
static类方法2
构造方法
构造方法
上面这些例子说明,static(类方法)会在类初始化的时候就进行了实现。所以输出才会在最前面。而且还是遵守按顺序执行。
-
4、 实例方法。(
{}
形式)public class ShiLiFangFa { public static void main(String[] args) { System.out.println("100"); { System.out.println("语句一"); } ShiLi shili = new ShiLi(); ShiLi shili2 = new ShiLi(); } { System.out.println("语句二"); } } class ShiLi { public ShiLi() { System.out.println("构造方法"); System.out.println("---------"); } { System.out.println("实例方法1"); System.out.println("实例方法2"); } }
输出为:
100 语句一 实例方法1 实例方法2 构造方法 --------- 实例方法1 实例方法2 构造方法 ---------
实例方法可以在main中使用,而static(类方法)却不行,不过输出只输出了语句一,而没输出语句二。然后调用构造方法,这里和static不同的是这里的shili和shili2调用两次,然后实例方法也输出了两次。
注意上下文静态和动态的转变(static)。