final、static、修饰符、内部类、参数传递

第一章 final关键字

1.1 概述

学习继承之后,我们可以通过子类在父类的基础上行修改父类内容,但是我们不能继承jdk中提供的类,改他的内容。为了避免这种随便写的情况。java提供了关键字final关键字,用来修饰不可以改变的内容。

  • final: 不可以改变的。 可以用来修饰类、方法和变量。

    • 类:被修饰的类,不能被继承

    • 方法:被修饰的方法,不能被重写

    • 变量:被修饰的变量,不能被重新赋值。

1.2使用方式

修饰类

格式

final class 类名{
    
}

 jdk中String,Scanner,Math 等学过的类 都被final修饰,目的就是给你用,你别改。

修饰方法

格式

修饰符 final  返回值类型 方法名(参数列表){
    //方法体
}

重写被final修饰的方法,编译时就会报错。

修饰变量

局部变量:只在当前大括号中能使用

全局变量:能在整个类中使用

  • 修饰局部变量---- 基本类型

        //声明变量,使用final修饰
        final int a ;

        //第一次赋值
        a=10;
        //a=20;  第二次赋值报错

        final int b =10;//声明并第一层赋值
        //b=20;//第二次赋值报错
final  int c =0;
for(int i =0 ;i<10;i++){
    c=i;//第二次赋值,报错
    System.out.println(c);
}
    
for(int i =0 ;i<10;i++){
    final int c =i ;//每循环一次定义一个变量c并赋值一次,不报错
     System.out.println(c);
}

每次循环都是一个新的变量c所以方式二通过编译;

  • 局部变量--引用类型

引用类型的局部变量,被final修饰之后,只能指向一个对象,地址值不能修改,但是不影响对象内部的成员变量值的修改;

public class Demo02 {
    public static void main(String[] args) {

        //创建Animal对象
        final  Animal animal= new Animal();
        System.out.println(animal);
        // animal=new Animal(); 报错   指向了新的对象,地址值改变
        //System.out.println(animal);
        animal.setName("张3");
        System.out.println(animal.getName());//可以修改
        animal.setName("李4");
        System.out.println(animal.getName());

    }
}
  • 成员变量

成员变量涉及到初始化的问题,初始化方式只有两种;

1.显示初始化

    private String name;

    //显示初始化
    final   String  address="张三";

2.构造方法初始化

   final   String  address;

    public Animal() {
        this.address="";
    }

    public Animal(String name, String address) {
        this.name = name;
        this.address = address;
    }

被final修饰的常量名称 ,一般都有书写规范,默认所有字母大写;

第二章 static关键字

2.1概述

static是静态修饰符,一般修饰成员。被static修饰的成员属于类,不属于单个的类的某个对象。static修饰的成员可以被多个对象共享。static修饰的成员属于类,但是会影响每一个对象。被static修饰的成员叫做类成员,不是对象的成员。

2.2定义和使用格式

类变量

当static成员变量时,该变量称之为类变量。该类的每个对象都能共享同一个类变量的值。任何对象都可以更改类变量的值。也可以在不创建类的对象的情况下对类变量进行操作。

  • 类变量: 就是使用static修饰的成员变量。

  • 定义格式:

static 数据类型 变量名;
static String  school;
        public static  String school="abc";
		//类变量,记录学生学习的学校		

        System.out.println(Student.school);//abc
        Student.school="def";
        System.out.println(Student.school);//def
静态方法

当static 修饰成员方法时,该方法称之为类方法。静态方法在声明时有static,建议使用类名来调用,不需要创建类的对象。

类名.方法名();

Student.study();

  • 注意事项:

    • 静态方法可以直接访问类变量和静态方法。

    • 静态方法不能直接访问普通成员变量和普通成员方法,反之,成员方法可以直接访问类变量或者静态方法。

    • 静态方法中,不能使用this关键字。

2.3静态原理图解。

static修饰的内容:

  • 是随着类加载的 ,且只加载一次。

  • 存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。

  • 它优先于对象存在,所以,可以被所有对象共享。

2.4静态代码块。

  • 静态代码块:定义在成员位置,使用static修饰的代码块{}

    • 位置:类中方法外

    • 执行:随着类的加载而执行且执行一次,优先于构造方法的执行。

  • 格式:

public class Person {
    private String name ;
    private  int age;

    public Person() {
        System.out.println("我是空参构造");
    }

    //    静态代码块
    static {
    System.out.println("我是静态代码块 我执行了");
    System.out.println("我是静态代码块 我执行了");
    System.out.println("我是静态代码块 我执行了");
    System.out.println("我是静态代码块 我执行了");
    System.out.println("我是静态代码块 我执行了");
    }

}

第三章 权限修饰符

3.1概述

在java中提供了四种访问权限,使用不同的访问权限修饰符时,被修饰的内容会有不同的访问权限。

  • public : 公共的

  • protected: 受保护的

  • default: 默认的

  • private: 私有的

3.2不同权限的访问能力

publicprotecteddefault(空)private
同一个类中YesYesYesYes
同一个包中(子类与无关类)YesYesYes
不同包中的子类YesYes
不同包中的无关类Yes

编写代码时,建议大家,这样使用;

  • 成员变量使用private;

    • 隐藏细节

  • 构造方法使用public;

    • 方便创建对象

  • 成员方法使用public;

    • 方便调用。

第四章 内部类

4.1概述

将一个类A定义在类B里面,里面的那个类A就是内部类,B称之为外部类

4.2成员内部类

  • 成员内部类:定义在类中方法外的类

定义格式:

class  外部类{
    class 内部类{
        
    }
}

public class Car { //外部类
    class  FaDongJi{//内部类

    }
}

访问特点:
  • 内部类可以直接访问外部类的成员(成员变量和成员方法),包括私有成员。即可以在写内部类时直接用到外部类中的变量和方法。

  • 外部类要访问内部类的成员,必须要创建内部类的对象

创建内部类对象格式:

外部类名.内部类名  对象名=new 外部类型().new 内部类型();

public class Car { //外部类
    private boolean run = true;
    public boolean isRun(){
        return run;
    }
    class FaDongJi {//内部类
        public void drive() {
            if (run) {
                System.out.println("在跑");
            } else {
                System.out.println("不跑");
            }
        }
    }
}

public class Demo {

    public static void main(String[] args) {
        //创建外部类对象
        Car  c =new Car();
        //创建内部类对象
        Car.FaDongJi   faDongJi =c.new FaDongJi();
        //外部类创内部对象调内部方法
        faDongJi.drive();
        //外部类调外部方法
        boolean run = c.isRun();
        System.out.println("run = " + run);
    }
}

4.3匿名内部类

匿名内部类:是内部类的简化写法,本质是一个带具体实现的父类或者接口的匿名的子类对象

比如接口举例,当使用接口时

  • 定义实现类

  • 重写接口中的方法

  • 创建实现类对象

  • 调用重写方法

匿名内部类可以把这四步简化成一步

前提:

存在一个类或者接口,类可以是抽象类也可以是具体类

格式:

new  父类名或者接口名(){
    //重写方法
    @Override
    public void method(){
        //执行
    }
};

使用案例:
public abstract class Fly {
    public abstract void fly();
}

public class FlyDemo {
    public static void main(String[] args) {
        Fly fly=new Fly() {
            @Override
            public void fly() {
                System.out.println("起飞");
            }
        };
        fly.fly();
    }
}
//运行结果:
//起飞
public interface USB {
    public void open();
}

public class USBDemo {
    public static void main(String[] args) {
        new USB(){

            @Override
            public void open() {
                System.out.println("打开了");
            }
        }.open();
    }
}
//运行结果:
//打开了

第五章 引用类型作为方法参数

5.1类名作为方法的参数和返回值

  • 类作为方法的形参

    • 方法的形参是类,需要的是类的对象

    • 传递的是对象的地址值

  • 类作为返回值

    • 方法的返回值如果是类,需要的也是该类的对象

    • 传递的是对象的地址值

public class Car { 

    public void fly(){
        System.out.println("车飞了");
    }
}

public class Demo05 {

    public static void main(String[] args) {
        method(new Car());//调用了fly方法
        Car car = method2();
        System.out.println("car = " + car);//打印的对象car地址值
    }
    //类做形参
    public static  void method(Car c){
        c.fly();
    }
    //类做返回值
    public static Car method2(){
        return new Car();
    }
}


5.2接口作为形参和返回值

  • 接口作为形参和返回值

    • 方法的形参是接口名,需要的是接口的实现类对象

    • 返回值是接口,需要的是接口的实现类对象

/**1.Outer.method()说明是method是静态方法
 * 2.调用完方法发现还能调用,说明method返回的是一个对象且该对象能调用show方法
 * 3还要对接口中的抽象方法重写
 */
    public class Demo {

        public static void main(String[] args) {
               Outer.method().show();
        }
    }

    interface Inter {
        void show();
    }

    class Outer {
        public static Inter method(){
           return new Inter(){
               public void show(){
                   System.out.println("哈喽");
               }
           };
        }
     }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值