18.Java的static关键字,代码块,继承

本文详细介绍了Java中的static关键字,包括它的特点、使用注意事项以及应用场景,如国籍的共享。同时,解释了代码块的概念,如局部代码块、构造代码块和静态代码块的执行顺序和作用。最后,探讨了Java中的继承机制,包括继承的好处、特点、成员变量和构造方法的关系,以及如何通过继承实现代码复用。示例展示了如何在Animal类的基础上创建Cat和Dog类,实现了特定功能的扩展。
摘要由CSDN通过智能技术生成

一.static关键字

1.静态static关键字的特点:
  (1)随着类的加载而加载
  (2)优先于对象存在:  它不能this共存   (this:代表当期类对象的地址值引用)对象还没有new的时候,当前被static修饰的成员就已经内存了;
  (3)被静态修饰的可以被多个对象共享:有共享共用的意思
     举例:饮水机中的水(适合)
             水杯共享(不适合)
  (4)被静态修饰的变量,方法----->静态变量或者静态方法
      我们所说的成员变量和成员方法:都指的是非静态
      静态的成员的访问方式:类名.变量
                                           类名.方法名()

2.关于static关键字的使用注意事项

(1)非静态的方法既可以访问静态变量,也可以访问非静态的变量,既可以调用静态方法,也可以调用

    非静态方法.

(2)静态的方法:只能访问静态变量,只能调用静态方法.

3.例题:使用Person类来描述人的属性(暂时先不私有化) 姓名,年龄, 国籍;
           提供一个show方法,显示,姓名,年龄,和国籍

问题描述:

每一个人都"中国",在创建对象的时候,每一次都需要给成员变量空间,浪费空间,如何优化呢?
Java提供关键字:static:  最基本概念:共享,共用 那么就国籍前面加上static修饰.

//定义一个Person类
class Person{
    String name ;//姓名
    int age ; //年龄
    //String country ;//国籍
    static String country ;//国籍  (类变量:这种变量随着类的加载而加载,优先于对象存在!)

    //提供无参
    public Person(){}

    //提供有参
    public Person(String name,int age,String country){
        this.name  = name ;
        this.age = age ;
        this.country = country ;
    }

    public Person(String name,int age){
        this.name = name ;
        this.age = age ;
    }

    //提供一个show方法显示人的信息
    public void show(){
        System.out.println("当前这个人的姓名是:"+name+",年龄是:"+age+",以及国籍是:"+country);
    }
}


//测试类
public class PersonDemo {
    public static void main(String[] args){

        Person p1 = new Person("小明",22,"中国") ;
        p1.show();
        System.out.println("----------------------------");
        Person p2 = new Person("小红",23);
        p2.show();
        System.out.println("-----------------------------");
        Person p3 = new Person("小王",24) ;
        p3.show();
        System.out.println("-----------------------------");
        Person p4 = new Person("小亮",20) ;
        p4.show();
        
    }
}

二.代码块

概念:在Java中,使用{}包裹棋起来的内容,成为代码块.

代码块的分类:

a.局部代码块:在方法中出现;限定变量生命周期,及早释放,提高内存利用率.
b.构造代码块:在类中方法外出现;多个构造方法方法中相同的代码存放到一起,

每次调用构造都执行,并且在构造方法前执行.

c.静态代码块: 在类中方法外出现,加了static修饰:在类中方法外出现,并加上static修饰;

用于给类进行初始化,在加载的时候就执行,并且值执行一次.

考点:优先级:静态代码块 > 构造代码块 > 局部代码块

        静态代码块:先执行,而且就执行一次(因为类就加载一次)

class Student{
    public Student(){
        System.out.println("Student的无参构造方法");
    }

    {
        System.out.println("Student的构造代码块");
    }

    public Student(String name){
        System.out.println("Student的有参构造方法");
    }

    static{
        System.out.println("Student的静态代码块");
    }

}
public class Test {
    static{
        System.out.println("我厉害吧!!!!");
    }
    public static void main(String[] args) {
        System.out.println("我是main方法");
        Student s = new Student() ;
        Student s2 = new Student("哆啦A梦") ;
    }
}

三.继承 (extends)

1.概念:将多个类的共性内容抽取到一个独立的类中,然后这多个类和独立的这个

           类产生一种关系: 继承关系,关键字: extends

2.好处:提高代码的维护性
           提高代码的复用性
           让类和类之间产生的关系,是"多态的前提条件"

3.特点:类与类之间的关系,继承关系,只支持单继承.

格式:class 子类名 extends 父类名{}
虽然不能支持多继承,但是可以支持多层继承

//使用继承的写法:
//将Student类和Worker类的共性内容抽取到:Person类 人类
 class Person{
    public void eat(){
        System.out.println("饿了,就需要吃饭...");
    }
    public void sleep(){
        System.out.println("困了,就需要休息...");
    }
}

//将学生类和工人类:继承自Person

class Student extends  Person{}
class Worker extends  Person{}

//测试类
public class ExtendsDemo {
    public static void main(String[] args) {
        //测试
        Student s = new Student() ;
        s.eat() ;
        s.sleep();
        System.out.println("----------------------") ;
        Worker worker = new Worker();
        worker.eat();
        worker.sleep();
        System.out.println("----------------------");
        //加入的继承
        Student s2 = new Student() ;
        s2.eat();
        s2.sleep();
        Worker w2 = new Worker() ;
        w2.eat();
        w2.sleep();

    }
}

4.继承中使用的注意事项:

(1)子类继承父类:可以继承父类的非私有的成员,私有的成员外界不能访问的,只能在本类中访问,但是可以通过公共方法间接访问.
(2)构造方法是不能被继承的,但是子类可以间接通过 super关键字访问父类的构造方法.

5.一个类的组成:成员变量,构造方法,成员方法. 

6.继承中,每一个成员变量的关系问题

   成员变量:

(a)子类继承父类,如果子类中的成员变量名称和父类的成员变量名称不一致,分别访问即可;
(b)子类继承父类,如果子类的成员变量名称和父类的成员变量名称一致:如何访问呢? (重点)
                   (1)首先在子类的局部位置找,是否存在局部变量名称,如果有,就使用;
                   (2)如果没有,就在子类的成员位置找,是否存在这个变量,如果存在,就使用;
                   (3)如果在子类的成员位置中没有找到,直接在父类的成员位置中找,如果有,就是使用;
                   (4)如果父类的成员位置都没有,就没有这个变量,报错;
     遵循一个原则:就近原则

7.继承中构造方法的访问:

(1)子类继承父类,子类的所有的构造方法都会默认的访问父类的无参方法

    子类的所有构造方法的第一句话:默认隐藏了super() ;  

     因为子类中肯能会使用到父类的数据,所以在继承关系中得先让父类初始化---->构造方法  :

     分层初始化;(先父类无参构造方法,在执行子类的构造方法)

     super:代表的父类对象的空间表示(父类对象的地址值引用)

(2)如果父类中的无参构造方法没有,子类会怎么样?如何解决呢?

     答:子类的所有的构造都会报错(因为子类所有构造方法默认父类的无参构造方法)

          解决办法:(推荐)手动给出父类的无参构造方法

8.代码案例

定义一个动物类Animal,动物类中有name属性,age属性,color属性。按照标准类的书写该类,猫类和狗类都继承自动物类,自己分析猫和狗的特有功能并且提供AnimalTest测试类进行测试

//动物类
public class Animal {
    private String name ;
    private int age ;
    private String color ;
    
    public Animal() {
    }
    public Animal(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public void eat(){
        System.out.println("动物都需要吃饭...");
    }
    public void sleep(){
        System.out.println("动物都需要睡觉...");
    }
}
//cat类
public class Cat extends Animal {
    public Cat() {
    }
    public Cat(String name, int age, String color) {
        super(name, age, color);
    }
    public void playGame(){
        System.out.println("猫爱玩毛线...");
    }
}
//Dog类
public class Dog extends Animal {
    public Dog() {  
    }
    public Dog(String name, int age, String color) {
        super(name, age, color);
    }
    public void lookDoor(){
        System.out.println("狗看门..");
    }
}
//测试类
public class ExtendsTest {
    public static void main(String[] args) {
        Dog d = new Dog() ;
        d.setName("小白");
        d.setAge(5);
        d.setColor("白色");
        System.out.println("狗的姓名是:"+d.getName()+",年龄为:"+d.getAge()+",颜色是:"+d.getColor());
        d.eat();
        d.sleep();
        d.lookDoor();
        System.out.println("-----------------------------------------");
        Dog d2 = new Dog("小黑",3,"黑色") ;
        System.out.println("狗的姓名是:"+d2.getName()+",年龄为:"+d2.getAge()+",颜色是:"+d2.getColor());
        d2.eat();
        d2.sleep();
        d2.lookDoor() ;
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值