static、final、多态

1.static

 1.1概念

是java中的一个关键字
用于修饰成员(成员变量和成员方法)

1.2特点


1.static可以修饰成员变量和方法
2.被static修饰的资源称为静态资源
3.静态资源随着类的加载而加载,最先加载,优先于对象进行加载
4.静态资源可以通过类名直接调用,也被称作类资源
5.静态被全局所有对象共享,值只有一份
6.静态资源只能调用静态资源
7.静态区域内不允许使用this与super关键字
 

1.3练习:static入门案例

package cn.tedu.oop;
/**本类用于静态static的入门案例*/
public class TestStatic1 {
    public static void main(String[] args) {
        Fruit.clean();//我们可以通过类名直接调用静态方法       类名.方法    调用静态方法
        System.out.println(Fruit.kind);//有提示,类名直接调用静态属性

        Fruit f = new Fruit();
        Fruit f2= new Fruit();
        f.grow();
        f.clean();//没有提示,需要自己写

        System.out.println(f.weight);
        System.out.println(f.kind);//没提示

        /**静态资源在内存中只有一份,而且被全局所有对象共享
         * 所以:当我们通过任意一种方式修改了静态变量的值以后
         * 不管用何种方式查看,静态变量的值都是刚刚修改后的值*/
        Fruit.kind = "苹果";
        System.out.println(Fruit.kind);
        System.out.println(f.kind);
        System.out.println(f2.kind);

        f.kind = "香蕉";
        System.out.println(Fruit.kind);
        System.out.println(f.kind);
        System.out.println(f2.kind);

        f2.kind = "猕猴桃";
        System.out.println(Fruit.kind);
        System.out.println(f.kind);
        System.out.println(f2.kind);
    }
}
/**0.被static修饰的资源统称为静态资源
 * 静态资源是随着类加载而加载到内存中的,比对象优先进入内存
 * 所以静态资源可以通过类名直接调用,即使没有创建对象,也可以调用*/
//1.创建水果类
class Fruit{
    //2.定义属性
    static String kind;
    double weight;

    //3.定义普通方法
    /**可以用static修饰方法吗?可以*/
    public static void clean(){
        System.out.println("洗水果~~");
    }
    public void grow(){
        System.out.println("水果长得好,很好吃~~");
    }
}

1.4练习:static静态调用关系

package cn.tedu.oop;
/**本类用于测试静态的调用关系
 * 总结:
 * 1.普通资源可以调用普通资源,也可以调用静态资源
 * 2.静态资源只能调用静态资源*/
public class TestStatic2 {
    public static void main(String[] args) {

    }
}
//1.创建老师类
class Teacher{
    //2.定义老师类的普通属性和方法
    String name;
    public void teach(){
        /**1.普通资源能否调用静态资源? -- 可以*/
        System.out.println("授课中~~~");
        System.out.println(id);//普通方法调用静态属性
        ready();//普通方法调用静态方法
    }
    //3.定义老师类的静态属性和方法
    static int id;
    public static void ready(){
        /**2.静态资源能否调用普通资源? -- 不可以*/
        System.out.println("备课中~~~");
        //System.out.println(name);
        //teach();
    }
    public static void eat(){
    /**3.静态资源能否调用静态资源? -- 可以*/
        System.out.println(id);//静态方法调用静态属性
        ready();//静态方法调用静态方法
    }
}

1.5静态代码块、构造代码块、局部代码块

静态资源随着类的加载而加载,并且只被加载一次,一般用于项目的初始化
特点: 被static修饰,位置在类里方法外

 1.5.1三种代码块的比较

  1. 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
  2. 构造代码块:在创建对象时会自动调用,每次创建对象都会被调用,提取构造共性
  3. 局部代码块:方法里的代码块,限制局部变量的范围

1.5.2练习:几种代码块的关系

package cn.tedu.oop;
/**本类用于测试代码块
 * 执行顺序: 静态代码块-->构造代码块-->构造方法-->普通方法-->局部代码块*/
public class TestBlock {
    public static void main(String[] args) {
        Apple a1 = new Apple();
        Apple a2 = new Apple();
        a1.clean();
    }
}
//1.创建类
class Apple{
    //6.创建本类的静态代码块
    /**格式:static{}
     * 位置类里方法外
     * 执行时机:静态代码块也属于静态资源,随着类的加载而加载,优先于对象加载
     *          并且静态资源只会加载一次
     * 作用:用于加载那些需要第一时间就加载,并且只加载一次的资源,常用来初始化
     * */
    static{
        System.out.println("我是一个静态代码块~~~~");
    }
    //2.创建本类的构造代码块
    /**位置:类里方法外
     * 执行时机:创建对象时执行,并且优先于构造方法执行
     * 作用:用于提取所有构造方法的共性功能
     * */
    {
        System.out.println("我是本类的构造代码块~~");
    }
    //3.创建本类的无参构造
    public Apple(){
        System.out.println("我是本类的无参构造~~");
    }
    public void clean(){
        System.out.println("我是一个普通方法~~");
        //5.创建本类的局部代码块
        /**位置:方法里
         * 执行时机:每次调用局部代码块所处的方法时才会执行
         * 作用:用于控制变量的作用范围
         * */
        {
            System.out.println("我是局部代码块");
        }
    }
}

2.final


2.1 概念


是java提供的一个关键字
final是最终的意思
final可以修饰类,方法,字段(属性)
初衷:java出现继承后,子类可以更改父类的功能,当父类功能不许子类改变时,可以利用final关键字修饰父类。


3.2 特点


被final修饰的类,不能被继承
被final修饰的方法,不能被重写
被final修饰的字段是个常量,值不能被修改
常量的定义形式:final 数据类型 常量名 = 值
 

3.3练习:final入门案例

package cn.tedu.oop;
/**本类用于测试final关键字*/
public class TestFinal {
    public static void main(String[] args) {

    }
}

//1.定义父类
/**1.final可以用来修饰类,被final修饰的类是最终类,不可以被继承
 * 可以把被final修饰的类看成树结构中的叶子节点
 * */
//3.测试类被final修饰
//final class Father2{
class Father2{
    //4.定义父类的普通方法
    /**2.final可以用来修饰方法,被final修饰的方法是这个方法的最终实现,不可以被重写*/
    //public final void  work(){
    public void  work(){
        System.out.println("在工厂上班~~");
    }
}
//定义子类
class Son2 extends Father2{
    final int C = 66;//
    //5.重写父类的方法
    @Override//这个注解用来标记这是一个重写的方法
    public void work(){
        /**3.被final修饰的常量。常量的值不可以被修改
         * 注意:不管是成员位置还是局部位置,常量定义的时候必须赋值
         * 注意:常量的名称必须是全大写,单词与单词之间使用 _ 分割*/
        final int B = 100;
        //B = 200; //错,常量的值不可以被修改
        System.out.println("在互联网大厂上班~~");
        System.out.println(Integer.MAX_VALUE);
    }
}

3.多态

1. 概念

多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。

2.特点

  1. 多态的前提1:是继承
  2. 多态的前提2:要有方法的重写
  3. 父类引用指向子类对象,如:Animal a = new Cat();
  4. 多态中,编译看左边,运行看右边

3.多态的好处

多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法
提高了程序的可扩展性和可维护性


4.多态的使用


前提:多态对象把自己看做是父类类型

成员变量: 使用的是父类的
成员方法: 由于存在重写现象,所以使用的是子类的
静态成员: 随着类的加载而加载,谁调用就返回谁的

5.设计汽车综合案例

package cn.tedu.oop2;

import javax.jws.soap.SOAPBinding;

/**本类用于完成汽车设计案例*/
public class DesignCar {
    public static void main(String[] args) {

        //9.创建一个纯纯的父类对象测试
        Car c = new Car();
        System.out.println(c.getColor());//null
        c.start();
        c.stop();
        //c.swim();//父类对象不可以调用子类的特有功能

        //10.创建一个纯纯的子类对象测试
        BMW b = new BMW();
        System.out.println(b.color);//黑色
        System.out.println(b.getColor());//null
        b.start();
        b.stop();

        //11.创建多态对象测试
        Car c2 = new TSL();
        System.out.println(c2.getColor());
        c2.stop();
        c2.start();
        //c2.swim();//把自己看成父类,所以不能使用子类特有功能



    }
}

//1.通过分析,抽象形成一个汽车类
class Car{
    //2.定义并封装汽车类的属性--成员变量
    private String brand;
    private String color;
    private int id;
    private double price;

    //3.1创建父类普通方法
    public void start(){
        System.out.println("我的车启动了~~");
    }
    public void stop(){
        System.out.println("我的车熄火了~~");
    }
    //get  set
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
}

//4.创建子类
class BMW extends Car{
    String color = "黑色";
    //6.重写父类方法
    @Override
    public void start(){
        System.out.println("我的车开的飞快~~");
    }
}
//5.创建子类
class TSL extends Car{
    //7.重写父类方法
    @Override
    public void stop(){
        System.out.println("刹车失灵");
    }
    //8.添加子类的特有功能
    public void swim(){
        System.out.println("我还是个潜水艇~!~!~!~!~!");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值