Java基础_静态与多态

Day_10 static关键字与多态

一.static关键字
1.定义:用于修饰成员变量和成员方法。
2.特点:
<1>随着类的加载而加载,优先于对象加载。
<2>只加载一次就会一直存在,不再开辟新的空间。
<3>全局唯一,全局共享。
<4>可以直接被类名调用。
<5>静态只能调用静态,非静态可以随意调用。
<6>static不能和super或者this共用,因为有static的时候可能还没有对象。

二.入门案例

public class Static {
     

	public static void main(String[] args) {
     
		
		/*int i = Student.age;//优先于对象加载,有没有对象都有static。
		System.out.println(i);*/
		
		Student s = new Student();
		
		System.out.println(s.name);
		System.out.println(s.age);
		
		s.speak();
		s.eat();

	}

}

class Student{
     
	
	String name = "Yan Dexuan";
	static int age = 20;
	
	public static void speak() {
     
		
		System.out.println("说话");
		
	}
	
	public void eat() {
     
		
		System.out.println("吃饭");
		
	}
	
}

三.静态调用关系

public class Static_Relationship {
     

	public static void main(String[] args) {
     
		
		Teacher t = new Teacher();
		
		t.speak();

	}

}

class Teacher{
     
	
	static int age = 30;
	String name = "Yan Dexuan";
	
	//非静态测试,非静态能够调用静态方法。
	public void speak() {
     
		
		System.out.println(age);
		System.out.println(name);
		qiao();
	}
	
	//静态测试,静态能调用静态。
	public static void qiao() {
     
		
		System.out.println(age);
		//System.out.println(name);静态无法调用非静态。
		//speak();
	}
	
}

四.静态代码块
1.随着类的加载而加载,并且只被加载一次,一般情况下用于项目的初始化。static{…}。
2.静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化。
3.构造代码块:在调用构造方法前会自动调用,每次创建对象都会被调用。
4.静态代码块:static{…},位于类里方法外。
5.执行顺序:静态-构造代码块-构造-局部代码块。

五.代码执行顺序

public class Static_Block {
     

	public static void main(String[] args) {
     
		
		Car c = new Car();
		c.show();
		
	}

}

class Car{
     
	
	//1.静态代码块。
	static{
     
		System.out.println("静态代码块");
	}
	
	//2.构造代码块。
	{
     
		System.out.println("构造代码块1");
	}
	
	//3.构造方法。
	public Car() {
     
		System.out.println("构造方法");
	}
	
	//4.局部代码块。
	public void show() {
     
		
		{
     
		System.out.println("构造代码块2");
		}
		
		System.out.println("局部代码块1");
		System.out.println("局部代码块2");
		
	}
	
}

六.final关键字
1.定义:final用于修饰类,方法以及成员变量。
2.特点:
<1>被final修饰的类,不能被继承。
<2>被final修饰的方法,不能被重写。
<3>被final修饰的变量是个常量,值不能被更改。
<4>常量的定义形式:final 数据类型 常量名 = 值。

七.final入门案例

public class Final {
     

	public static void main(String[] args) {
     
		
		Son s = new Son();
		
		s.speak();
		
		System.out.println(s.name);
		
		s.test();
		

	}

}

class Father{
     
	
	final String name = "Yan Dexuan";
	
	public final void speak() {
     
		
	   System.out.println("说话");
		
	}
	
}

class Son extends Father{
     
	
	//被final的方法,不能被重写。
	/*public void speak() {
		
		System.out.println("说什么");
		
	}*/
	
	public void test() {
     
		
		//super.name = "Yan";
		//被final的变量,不能被重新赋值。
		System.out.println(super.name);
		
	}
	
}

八.多态
1.定义:多态指同一个实体同时具有多种形式,他是面向对象程序设计的一个重要特征。主要是指同一个对象,在不同的时刻,代表的对象不一样,指的是对象的多种形态。

2.优点:
<1>可以吧不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的的代码,作出通用的变成,统一调用标准。例如,水在不同时刻可以有多种形态,包括水蒸气,冰以及水。Java体现多态,比如,狗有两种形态,狗和小动物。
<2>多态可以让我们不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法。
<3>提高了程序的拓展性和可维护性。

3.特点:
<1>多态的前提是继承。
<2>要有方法的重写。
<3>父类引用指向子类对象,例如:Animal a =new Dog();从小到大,向上转型。
<4>多态种,编译看左边,运行看右边。
<5>成员变量:使用的是父类的。
<6>成员方法:使用的是子类的。
<7>静态成员:随着对象而存在,谁调用就返回谁。

九.多态入门案例

public class Polymorphism {
     

	public static void main(String[] args) {
     
		
		Animal a = new Dog();//父类引用指向子类对象,把右边的小的给左边的大的。
		a.eat();//只能使用父类的功能,这样就统一了调用的标准。

	}

}

class Animal{
     
	
	public void eat() {
     
		
		System.out.println("动物吃饭");
		
	}
	
}

class Dog extends Animal{
     
	
	public void kanjia() {
     
		
		System.out.println("看家");
		
	}
	
	public void eat() {
     
		
		System.out.println("吃骨头");//发生重写,所以父类的方法被覆盖了。
		
	}
	
}

十.多态的使用

public class Polymorphism_Use {
     

	public static void main(String[] args) {
     
		
		Mother m = new Son3();
		
		System.out.println(m.number);//成员变量,使用的是父类的。
		
		m.study();//成员方法,使用的是子类的。
		
		System.out.println(Son3.count);//静态成员,谁调用就是谁的。
		m.sleep();
		
		System.out.println();

	}

}

class Mother{
     
	
	int number = 10;
	
	static int count = 100;
	
	public void study() {
     
		
		System.out.println("妈妈学习");
		
	}
	
	public static void sleep() {
     
		
		System.out.println("儿子睡觉");
		
	}
	
}

class Son3 extends Mother{
     
	
	int number = 20;
	
	static int count = 200;
	
	public void study() {
     
		
		System.out.println("儿子学习");
		
	}
	
	public static void sleep() {
     

		System.out.println("儿子睡觉");
	}
	
}

十一.执行顺序:静态代码块—构造代码块—构造函数

public class Comparation {
     

	public static void main(String[] args) {
     
		
		Block b = new Block();
		
		System.out.println();
		
		Block b2 = new Block();//静态代码只会被执行一次,就是在类第一次初始化时。
		

	}

}

class Block{
     
	
	{
     
		System.out.println("构造代码块1");
	}
	
	static {
     
		System.out.println("静态代码块1");
	}
	
	public Block(){
     
		
		{
     
			System.out.println("局部代码块1");
		}
		
	}
	
	{
     
		System.out.println("构造代码块2");
	}
	
	static {
     
		System.out.println("静态代码块2");
	}
	
}

十二.静态变量和实例变量的区别
1.在语法定义上的区别:静态变量之前要加static关键字,而实例变量不用加。

2.在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。而静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

你可能感兴趣的:(学习,java)