Java语言基础(八)

来源:互联网 发布:linux c服务器端开发 编辑:程序博客网 时间:2024/06/06 06:43
Java语言基础(八)


A.static关键字(可以修饰成员变量和成员方法):
  static关键字的特点:
  随着类的加载而加载;
  优先于对象存在;
  被类的所有对象共享;
  可以通过类名调用;
B.static关键字注意事项:
  在静态方法中没有this关键字;
  静态方法只能访问静态的成员变量和静态的成员方法;
静态变量和成员变量的区别:
1)所属不同:静态变量属于类,也成为类变量;
           成员变量属于对象,称为实例变量(对象变量)
2)存储的位置不同:静态变量存在内存的静态区;
成员变量存储在堆内存中;
3)出现的时间不同:静态变量随着类的加载而加载,随着类的消失而消失;
成员变量随着对象的创建而存在,随着对象的消失而消失;


C.继承


继承概念:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么
         多个类无需再定义这些属性和行为,只要继承那个类即可
继承关键字:extends
使用:class 子类名 extends 父类名{
     }
单独的这个类可以称为父类基类或者超类
多个的类可称为子类或者派生类;
有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,
还可以定义自己的新成员


继承的好处:a.提高了代码的复用性(多个类相同的成员可以放在同一个类中)
  b.提高了代码的维护性(如果功能代码需要修改,只需要修改一处即可)
  c.让类与类产生关系是实现多态的前提(弊端增加了代码的耦合性);
继承的特点:java只支持单继承,就是一个子类只有一个父类
  java支持多层继承


继承的注意事项: a.子类成员继承父类的非私有成员的成员和方法
b.子类不能继承父类的构造方法,但可以通过super关键字去访问父类构造方法;
c.不要为了部分功能而去继承;
************************************************************
继承事例:创建一个无参构造观看构造的调用和super指针
//定义一个基类
class BaseStudent3{
//定义一个私有成员人数
public String Member="我是基类成员";
public BaseStudent3(){
System.out.println("我是基类的构造");

}

}


//定义一个派生类
class DeriveStudent3 extends BaseStudent3{
private String Member="我是派生类成员";
public DeriveStudent3(){
System.out.println("我是派生类的构造");
}
//定义一个方法显示Number数据的不同输出
public void showMember(){
System.out.println(this.Member);
System.out.println(super.Member);
}

}


//定义一个测试类
public class StudentDemo3 {
public static void main(String[] args){
//定义一个派生类对象
DeriveStudent3 der=new DeriveStudent3();
//输出成员
der.showMember();

}


}
******************************************************************
输出结果:
我是基类的构造
我是派生类的构造
我是派生类成员
我是基类成员


由此我们可以分析:
1)super在类中使用它调用的是该类的父类的成员变量和方法;
2)在子类构造中隐藏了一个super();的方法即调用基类构造的方法;
(在创建子类对象的时候函数会自动调用构造,当他进入子类的构造时,代码的第一行隐藏了一个super();所以他会先调用父类的构造)
***********************************************************************************************************************
创建一个父类带参构造用super完成父类的初始化:
//创建一个父类
class Fu{
//创建两个成员变量,给他们的权限为私有
private String Member;
private int Date; 
//创建父类的有参构造
public Fu(String Member,int Date){
this.Member=Member;
this.Date=Date;
}
//创建一个方法显示
public void show(){
System.out.println("成员1:"+Member+"\t"+"创建日期:"+Date);
}
}
//创建一个子类
class DeriveFu extends Fu{
//定义一个子类构造
public DeriveFu(String Member,int Date){
super(Member,Date);
}
}


//测试类
public class StudentDemo4{
public static void main(String[] args){
//定义一个子类对象
DeriveFu son=new DeriveFu("高圆圆",20170711);
             //显示结果
son.show();

}



}
************************************************************************************************************
输出结果:
成员1:高圆圆 创建日期:20170711
************************************************************************************************************
父类带参构造给他的成员变量赋值的值两种方法:


1)创建父类的对象给他的构造传值;
2)创建子类对象将值传入子类的构造里通过super关键字将值传入父类的构造;
注意事项:1)当父类的成员为私有时
         2)在子类中我们不能用super.Xxx访问父类的成员
3)我们不能用son.DeriveFu("高圆圆",20170711)来调用构造方法;




D.代码块:用{}括起来的叫代码块
事例:class Method{
//构造代码块
{
System.out.println("我是构造代码块");
}
//静态代码块
static{
System.out.println("我是静态代码块");
}
//构造方法
Method(){
System.out.println("我是构造方法");
}

}
public class MethodDemo {
public static void main(String[] args){
//定义Method第一个对象
Method me=new Method();
System.out.println("*************************************");
//定义Method第二个对象
Method me1=new Method();
System.out.println("***************************************");
//定义第三个Method对象
Method me2=new Method();
}
}
//////////////////////////////////////////////////////////////////////////
输出结果:
我是静态代码块
我是构造代码块
我是构造方法
*************************************
我是构造代码块
我是构造方法
***************************************
我是构造代码块
我是构造方法


总结:静态代码块的格式:static{}
     构造方法的格式:类名(){};(有参传参)
     构造代码块的格式{};
执行:当对象一被创建那么代码块都会执行,执行顺序:静态代码块->构造代码块->构造方法
     并且静态代码块只执行一次,当再创建其他对象是静态代码块是不被执行的;