* 1.使用static关键字修饰的成员变量(属性):全局变量或类变量*
成员变量和全局变量的区别:
* a.在计算机内存中保存的位置不同:
* 成员变量保存在堆中,全局变量保存在方法区
* b.保存的份数不同
* 成员变量每new一次都开辟空间,保存多份。
* 全局变量只有1份
* c.访问方式不同
* 成员变量:对象名.属性,可以使用this关键字。
* 全局变量:类名.属性(推荐)
* 对象名.属性
* d.创建时间不同:
* 成员变量:只有使用new关键字创建对象时才会在堆中为其分配空间
* 全局变量:在类加载时在方法区中分配空间。
*
* 2.使用static关键字可以修饰方法:静态方法或类方法
* 特点:静态方法中无法访问非静态的成员变量或方法;但非静态的方法中是可以访问静态的成员
* 访问方式:
* 类名.方法名(推荐)
* 对象名.方法名
访问方式:类名.属性或类名.方法名()
*/
*3.使用static修饰代码块,静态代码块
* 语法:static{
* //代码
* }
* 执行过程:在类加载时执行静态代码块。静态代码块>普通代码块>构造方法。只会执行1次。
*
* 代码块:使用花括号包含的代码。使用比较少。不需要显式调用。
* 代码块的执行顺序:在创建实例时执行。代码块在构造方法之前执行,并且按照顺序执行,每创建一个对象就会执行1次。执行多次。
*
* 类中代码的执行顺序:
* 静态代码块>代码块>构造方法>静态方法或实例方法。
* 静态的方法中只能访问静态变量, 非静态的方法可以访问静态或非静态的变量
*/
public class TestStatic {
static int count=0;
int count2=0;
//代码块1
{
System.out.println("普通代码块1被调用了....");
// System.out.println(count);
System.out.println(count2);
}
//静态代码块
static{
System.out.println("静态代码块1被调用....");
}
//构造方法
public TestStatic(){
System.out.println("TestStatic构造方法被调用了...");
}
//代码块2
{
System.out.println("普通代码块2被调用了....");
}
//静态代码块2
static{
System.out.println("静态代码块2被调用....");
}
//静态方法:
public static void m1(){
System.out.println("静态方法m1被调用了....");
}
//实例方法:
public void m2(){
System.out.println("实例方法m2被调用.....");
}
public static void main(String[] args) {
TestStatic testStatic = new TestStatic();
//静态方法
testStatic.m1();//对象名.方法名();
//普通方法
testStatic.m2();
// System.out.println("******************");
// TestStatic testStatic2 = new TestStatic();
}
}
public class Student {
public String name;//姓名
public int age;//年龄
public double height;//身高
public double weight;//体重
public static String className;//班级
public Student(){
}
public Student(String name,int age,double height,double weight,String className){
this.name=name;
this.age=age;
this.height=height;
this.weight=weight;
// this.className=className;
Student.className=className;//静态
}
public void showInfo(){
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("身高:"+height);
System.out.println("体重:"+weight);
System.out.println("班级:"+className);//非静态的方法中是可以访问静态属性
}
public static void study(){
System.out.println("good good study!");
System.out.println("day day up!");
// System.out.println(name);//静态方法不能访问非静态的成员变量。
System.out.println(className);//
}
}
public class TestStudent {
public static void main(String[] args) {
//1.创建对象:
Student student = new Student("zhangsan", 20, 175, 70, "A101");
student.showInfo();
// student.study();//不推荐
Student.study();//推荐
System.out.println("*********************************");
Student student2 = new Student("lisi", 22, 180, 80, "A101");
student2.showInfo();
}
}
this关键字:代表当前对象本身。
* 1.可以通过this关键字区分成员变量和局部变量
* 2.可以通过this访问当前对象的成员变量和成员方法(可以使用this调用属性和方法)
* 3.可以使用this关键字调用构造方法,但是必须放在构造方法的第一行。
*/
public class Dog2 {
public String name;//姓名
public String bland;//品种
public int age;//年龄
public String color;//颜色
/**
* 无参构造方法
*/
public Dog2(){
}
public Dog2(String name,String bland,int age){
this.name=name;
this.bland=bland;
this.age=age;
}
/**
* 有参数构造方法
* @param _name
* @param _bland
* @param _age
* @param _color
*/
public Dog2(String name,String bland,int age,String color){
// this.name = name;
// this.bland= bland;
// this.age = age;
this(name,bland,age);//通过this调用构造方法
this.color = color;
}
public void test(){
System.out.println("测试this关键字调用实例方法....");
}
public void showInfo(){
System.out.println("名字:"+this.name);//通过this访问当前对象的属性
System.out.println("品种:"+this.bland);
System.out.println("年龄:"+age);
System.out.println("颜色:"+color);
this.test();//通过this方法当前对象的实例方法
}
}
public class TestDog2 {
public static void main(String[] args) {
// Dog dog = new Dog();
// dog.name="旺财";
// dog.age=2;
// dog.bland="中华田园犬";
// dog.color="黄色";
Dog2 dog = new Dog2("旺财", "中华田园犬", 2, "黄色");
dog.showInfo();
Dog2 dog2 = new Dog2("大黄", "黑贝", 3, "黑色");
dog2.showInfo();
}
}
super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
普通方法:
没有顺序限制。可以随便调用。
构造函数中: 任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(...);那么Java默认都会调用super();作为父类的初始化函数。 所以你这里的super();加不加都无所谓。
public class Test { public static void main(String[] args) { new ChildClass().f(); } } class FatherClass { public int value; public void f(){ value = 100; System.out.println ("FatherClass.value="+value); } } class ChildClass extends FatherClass { public int value; public void f() { super.f(); value = 200; System.out.println ("ChildClass.value="+value); System.out.println(value); System.out.println(super.value); } }
|