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