static&继承&多态&包&final&权限修饰符&代码块

1.Static静态变量

static表示静态变量,是Java中的一个修饰符,可以修饰成员方法,成员变量

(静态变量随着类的加载而加载,优先于对象出现。静态区中的变量共享,谁用,谁去调用)

被static修饰的成员变量,叫做静态变量被static修饰的成员方法,叫静态方法
特点:被该类的所有对象共享;不属于对象属于类;随着类的加载而加载优于对象存在
调用方式:类名调用(推荐)
对象名调用
特点:对用在测试类和工具类中,Javabean中很少使用
调用方式:
类名调用;对象名调用
  • 静态方法只能访问静态变量和方法
  • 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
  • 静态方法中没有this关键字

总结:静态方法中,只能访问静态;非静态方法可以访问所有;静态方法中没有this关键字

public class Helloword{
    public static void main(String[] args){
       //public:  被JVM调用,访问权限足够大
       //static: 被JVM调用,不用创建对象,直接类名访问,因为main方法是静态的,所以测试类中其他方法也需要静态的
       //void:被JVM调用,不需要给JVM返回值
       //main: 一个通用的名称,虽然不是关键字,但是被JVM识别
       //String[] args:以前用于接受键盘录入数据的,现在已经没用了。(界面运行按钮的左边,点击选择Edit Configuration在program arguments输入传递参数)
    }
}

2.工具类

定义时:类名见名知意;私有结构化构造方法;方法定义为静态

Javabean类:用来描述一类事物的类。比如Student、Teacher、Dog等

测试类:用来检查其他类是否书写正确,带有main方法的类,是程序的入口

工具类:不是用来描述一类事物的,而是帮我们做一些事情的类

3.继承

3.1关键字extends

public class 子类 extends 父类{}

使用继承的好处:

  • 可以把多个子类(派生类)中重复的代码抽取到父类(基类或者超类)中,提高代码的复用性,减少代码冗余,提高代码的复用性
  • 子类可以在父类的基础上,增加其他的功能,是子类更加强大。

3.2什么时候用继承

当类与类之间,存在相同的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码

3.3继承的特点

Java只支持单继承,不支持多继承,但支持多层继承

单继承:一个子类只能继承一个直接父类

多继承:子类不能同时继承多个父类

多层继承:子类A继承父类B,B继承父类C。C则是A的间接父类

每个类都直接或者间接的继承于Object

子类只能访问父类的非私有的成员

3.4子类能在父类中继承那些内容

构造方法: 非私有(不能) private(不能)

成员变量: 非私有(能) private(能)

成员方法: 非私有,在虚方法表中(能) private(不能)

3.4.1继承中成员变量访问特点:就近原则

先在局部位置找,本类位置找,父类成员位置找,逐级往上。

class Fu{
    String name = "Fu";
}
class Zi extends Fu{
    String name = "Zi";
    public void zishow(){
        String name = "zishow";
        System.out.println(name);//就近原则调用zishow方法中的name变量
        System.out.println(this.name);//调用的是Zi类中name变量
        System.out.println(super.name);//调用的是Fu类中name的变量
    }
}

3.4.2继承中成员方法访问特点

class Person{
    public void eat(){
        System.out.println("吃米饭,吃菜");
    }
    public void drink(){
        System.out.println("喝开水");
    }
}

class Student extends Person{
    //先在本类中查看eat和drink方法,就会调用子类的,如果没有,就会调用从父类中继承下来的eat和drink方法
    public void lunch(){
        eat();//隐含了this
        drink();
        
        //直接在父类中寻找调用
        super.eat();
        super.drink();
    }
}

3.4.3继承中构造方法的访问特点

  • 父类中的构造方法不会被子类继承

  • 子类中所有的构造方法默认先访问父类中的无参构造,在执行自己

    为什么?

    • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类中的数据
    • 子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化

    怎么调用?

    • 子类中构造方法第一行语句默认都是:super(),不写也存在且必须在第一行。
      • 如果想调用父类有参构造,必须手动写super进行调用。

3.5方法的重写

当父类中的方法不能满足子类现在的需求时,需要进行方法重写

**书写格式:**在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

@Override重写注解:1. @Override是放在重写后的方法上,校验子类重写时语法是否正确。

​ 2.加上注解后如果有红色波浪线,表示语法错误。

​ 3.建议重写方法都加上@Override注解,代码安全

方法重写本质:覆盖虚方法表中继承的父类方法

方法重写注意事项和要求:

  1. 重写方法的名称、形参列表必须与父类中的一致
  2. 子类重写父类方法时,访问权限子类必须大于等于父类(空着不写<protected<public)
  3. 子类重写父类方法时,返回值类型子类必须小于等于父类
  4. 建议:重写方法尽量和父类保持一致
  5. 只有被添加到虚方法表中的方法才能被重

4.多态

4.1多态基本理解

**①什么是多态?**同类型的对象,表现出的不同形态。

②多态的表现形式: 父类类型 对象名称 = 子类对象

③多态的前提:

  • 有继承关系
  • 有父类引用指向子类对象
  • 方法重写

**④多态的好处?**使用父类作为参数,可以接收所有子类对象,体现多态的扩展性与便利

4.2多态调用成员的特点

  • 变量调用:编译看左边,运行看左边。(编译javac代码时,看左边父类中有没有这个变量,如果有则编译成功否则编译失败)(运行java代码时实际获取的就是左边父类中的变量)
  • 方法调用:编译看左边,运行看右边。(编译javac代码时,看左边父类中有没有这个变量,如果有则编译成功否则编译失败)(运行Java代码时实际获取子类的方法)

4.3多态的优势及劣势

优势:

  • 在多态的形势下,右边对象可以实现解耦合,便于维护和扩展。

    Person p = new Student();
    p.work();//业务逻辑发生改变时,后续代码无需更改
    
  • 定义方法时,使用父类类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。

劣势:

不能直接使用子类的特有功能,需要转换类型(注意转换类型时,要转换为对应的类型,Dog转换为Dog)

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
        //多态的弊端
        //不能调用子类的特有功能
        //a.lookHome()
        
        //报错原因?编译看父类中有没有方法,没有则报错
        //解决方法:变回子类类型
        //注意转换的时候,不能转换成其他类型,狗类型不能转换为猫类型
        //Dog dog  = (Dog) a;
        //dog.lookHome();

        //Java判断特性  instanceof
        /*if(a instanceof Dog){
            Dog dog = (Dog) a;
            dog.lookHome();
        } else if (a instanceof  Cat) {
            Cat c =(Cat) a;
            c.catchHome();
        }else{
            System.out.println("没有这个类型");
        }*/
        //JDK14新特性
        //先判断a是否为Dog类型,如果是则强转Dog类型,转换之后变量名为dog,如果不是则不强转
        if(a instanceof Dog dog){
            dog.lookHome();
        } else if (a instanceof  Cat c) {
            c.catchMouse();
        }else{
            System.out.println("没有这个类型");
        }
    }
}
class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    public void lookHome() {
        System.out.println("狗看家");
    }
}
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼干");
    }
    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}

1.Static静态变量

static表示静态变量,是Java中的一个修饰符,可以修饰成员方法,成员变量

(静态变量随着类的加载而加载,优先于对象出现。静态区中的变量共享,谁用,谁去调用)

被static修饰的成员变量,叫做静态变量被static修饰的成员方法,叫静态方法
特点:被该类的所有对象共享;不属于对象属于类;随着类的加载而加载优于对象存在
调用方式:类名调用(推荐)
对象名调用
特点:对用在测试类和工具类中,Javabean中很少使用
调用方式:
类名调用;对象名调用
  • 静态方法只能访问静态变量和方法
  • 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
  • 静态方法中没有this关键字

总结:静态方法中,只能访问静态;非静态方法可以访问所有;静态方法中没有this关键字

public class Helloword{
    public static void main(String[] args){
       //public:  被JVM调用,访问权限足够大
       //static: 被JVM调用,不用创建对象,直接类名访问,因为main方法是静态的,所以测试类中其他方法也需要静态的
       //void:被JVM调用,不需要给JVM返回值
       //main: 一个通用的名称,虽然不是关键字,但是被JVM识别
       //String[] args:以前用于接受键盘录入数据的,现在已经没用了。(界面运行按钮的左边,点击选择Edit Configuration在program arguments输入传递参数)
    }
}

2.工具类

定义时:类名见名知意;私有结构化构造方法;方法定义为静态

Javabean类:用来描述一类事物的类。比如Student、Teacher、Dog等

测试类:用来检查其他类是否书写正确,带有main方法的类,是程序的入口

工具类:不是用来描述一类事物的,而是帮我们做一些事情的类

3.继承

3.1关键字extends

public class 子类 extends 父类{}

使用继承的好处:

  • 可以把多个子类(派生类)中重复的代码抽取到父类(基类或者超类)中,提高代码的复用性,减少代码冗余,提高代码的复用性
  • 子类可以在父类的基础上,增加其他的功能,是子类更加强大。

3.2什么时候用继承

当类与类之间,存在相同的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码

3.3继承的特点

Java只支持单继承,不支持多继承,但支持多层继承

单继承:一个子类只能继承一个直接父类

多继承:子类不能同时继承多个父类

多层继承:子类A继承父类B,B继承父类C。C则是A的间接父类

每个类都直接或者间接的继承于Object

子类只能访问父类的非私有的成员

3.4子类能在父类中继承那些内容

构造方法: 非私有(不能) private(不能)

成员变量: 非私有(能) private(能)

成员方法: 非私有,在虚方法表中(能) private(不能)

3.4.1继承中成员变量访问特点:就近原则

先在局部位置找,本类位置找,父类成员位置找,逐级往上。

class Fu{
    String name = "Fu";
}
class Zi extends Fu{
    String name = "Zi";
    public void zishow(){
        String name = "zishow";
        System.out.println(name);//就近原则调用zishow方法中的name变量
        System.out.println(this.name);//调用的是Zi类中name变量
        System.out.println(super.name);//调用的是Fu类中name的变量
    }
}

3.4.2继承中成员方法访问特点

class Person{
    public void eat(){
        System.out.println("吃米饭,吃菜");
    }
    public void drink(){
        System.out.println("喝开水");
    }
}

class Student extends Person{
    //先在本类中查看eat和drink方法,就会调用子类的,如果没有,就会调用从父类中继承下来的eat和drink方法
    public void lunch(){
        eat();//隐含了this
        drink();
        
        //直接在父类中寻找调用
        super.eat();
        super.drink();
    }
}

3.4.3继承中构造方法的访问特点

  • 父类中的构造方法不会被子类继承

  • 子类中所有的构造方法默认先访问父类中的无参构造,在执行自己

    为什么?

    • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类中的数据
    • 子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化

    怎么调用?

    • 子类中构造方法第一行语句默认都是:super(),不写也存在且必须在第一行。
      • 如果想调用父类有参构造,必须手动写super进行调用。

3.5方法的重写

当父类中的方法不能满足子类现在的需求时,需要进行方法重写

**书写格式:**在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

@Override重写注解:1. @Override是放在重写后的方法上,校验子类重写时语法是否正确。

​ 2.加上注解后如果有红色波浪线,表示语法错误。

​ 3.建议重写方法都加上@Override注解,代码安全

方法重写本质:覆盖虚方法表中继承的父类方法

方法重写注意事项和要求:

  1. 重写方法的名称、形参列表必须与父类中的一致
  2. 子类重写父类方法时,访问权限子类必须大于等于父类(空着不写<protected<public)
  3. 子类重写父类方法时,返回值类型子类必须小于等于父类
  4. 建议:重写方法尽量和父类保持一致
  5. 只有被添加到虚方法表中的方法才能被重

4.多态

4.1多态基本理解

**①什么是多态?**同类型的对象,表现出的不同形态。

②多态的表现形式: 父类类型 对象名称 = 子类对象

③多态的前提:

  • 有继承关系
  • 有父类引用指向子类对象
  • 方法重写

**④多态的好处?**使用父类作为参数,可以接收所有子类对象,体现多态的扩展性与便利

4.2多态调用成员的特点

  • 变量调用:编译看左边,运行看左边。(编译javac代码时,看左边父类中有没有这个变量,如果有则编译成功否则编译失败)(运行java代码时实际获取的就是左边父类中的变量)
  • 方法调用:编译看左边,运行看右边。(编译javac代码时,看左边父类中有没有这个变量,如果有则编译成功否则编译失败)(运行Java代码时实际获取子类的方法)

4.3多态的优势及劣势

优势:

  • 在多态的形势下,右边对象可以实现解耦合,便于维护和扩展。

    Person p = new Student();
    p.work();//业务逻辑发生改变时,后续代码无需更改
    
  • 定义方法时,使用父类类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。

劣势:

不能直接使用子类的特有功能,需要转换类型(注意转换类型时,要转换为对应的类型,Dog转换为Dog)

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
        //多态的弊端
        //不能调用子类的特有功能
        //a.lookHome()
        
        //报错原因?编译看父类中有没有方法,没有则报错
        //解决方法:变回子类类型
        //注意转换的时候,不能转换成其他类型,狗类型不能转换为猫类型
        //Dog dog  = (Dog) a;
        //dog.lookHome();

        //Java判断特性  instanceof
        /*if(a instanceof Dog){
            Dog dog = (Dog) a;
            dog.lookHome();
        } else if (a instanceof  Cat) {
            Cat c =(Cat) a;
            c.catchHome();
        }else{
            System.out.println("没有这个类型");
        }*/
        //JDK14新特性
        //先判断a是否为Dog类型,如果是则强转Dog类型,转换之后变量名为dog,如果不是则不强转
        if(a instanceof Dog dog){
            dog.lookHome();
        } else if (a instanceof  Cat c) {
            c.catchMouse();
        }else{
            System.out.println("没有这个类型");
        }
    }
}
class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    public void lookHome() {
        System.out.println("狗看家");
    }
}
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼干");
    }
    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}

5.包

什么是包?包就是文件夹。用来管理各种不同功能的Java类,方便后期代码维护。

  • 包的命名规则:公司域名反写+包的作用,需要全部英文小写,见名知意。(com.it.domain)

    包名+类名叫:全类名/全限定名

    使用其他类时需要使用全类名(在加载import之前应该是这样使用)

    public class Test{
        public static void main(String[] args){
            com.it.domain.(类名)  s = new com.it.domain.(类名)();
        }
    }
    

    加入import后

    import com.it.domain.(类名)
    public class Test{
        public static void main(String[] args){
            (类名)  s = new (类名)();
        }
    }
    
  • 包的导用规则

    1. 使用同一个类的包不需要导包
    2. 使用java.lang包中的类不需要
    3. 其他情况都要
    4. 如果使用两个包中的同名类,需要用全类名

6.final

  • 方法:表示方法为最终方法,不能被重写(一般在定义一种规则,不希望被改变时使用)

  • 类:表示该类为最终类,不能被继承

  • 变量:叫做常量,只能被赋值一次

  • 常量:实际开发中,一般作为系统的配置信息,方便维护,提高可读性

    命名规范

    ​ 单个单词:全部大写;多个单词:全部大写并且中间用下划线隔开

    细节:

    ​ final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。

    ​ final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变

7.权限修饰符

  • 权限修饰符:用来控制一个成员能够被访问的范围
  • 可以修饰成员变量,方法,构造方法,内部类

private < 空着不写 < protected < public

修饰符同一个类中同一个包中的其他类不同包下的子类不同包下的无关类
private
空着不写
protected
public
  • 使用规则

    成员变量私有;方法公开

    特列:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有。

8.代码块

  • 局部代码块:方法中的代码块,使用了就释放节约内存(提前结束变量的生命周期)

  • 构造代码块

  1. 写在成员位置的代码块
  2. 作用可以把多个构造方法中重复的代码抽取出来
  3. 执行时机:我们在创建对象时,先执行构造代码块在执行构造方法
  • 静态代码块

    格式:static{}

    特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次

    使用场景:在类的加载时,做一些数据初始化使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值