11 final关键字(修饰类、方法、变量)、权限修饰符(4中)、内部类、内部类中this与super、匿名内部类、引用类型总结

想了解更多请查看java学习(idea版)

目录

final关键字

final修饰类

final修饰方法

final修饰变量

修饰基本类型的局部变量

修饰引用类型的局部变量

修饰成员变量

权限修饰符

内部类

列:实现心脏在身体中跳动

 列:内部类this,super的用法

 列:方法中的内部类

 匿名内部类

引用类型用法总结

列:显示英雄的武器

列:实现英雄释放技能


final关键字

为了避免子类继承父类,使用final关键字

final : 不可改变。可以用于修饰类、方法和变量。
  1. 类:被修饰的类,不能被继承。
  2. 方法:被修饰的方法,不能被重写。
  3. 变量:被修饰的变量,不能被重新赋值。

 

final修饰类

final修饰类后,此类不能被继承,不能覆盖重写

public final class ClassFinal {
    public void method(){
        System.out.println("方法执行");
    }
}

final修饰方法

当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。

public abstract class Fu {
    public abstract void method();
    public final  void methodFinal(){
        System.out.println("父类--final修饰的方法");
    }
}
/*
子类继承父类。final修饰的方法不能被覆盖重写
 */
public class Zi extends Fu{
    @Override
    public void method() {
    }
    // 错误写法!不能覆盖重写父类当中final的方法
//    @Override
//    public void methodFinal() {
//        System.out.println("子类覆盖重写父类的方法!");
//    }
}

 

final修饰变量

修饰基本类型的局部变量

一次赋值,不可以在改变

 

    public static void main(String[] args) {
        int num = 10;//局部变量
        num = 20;

        //使用final用来修饰局部变量,这个变量不在改变
        final int num1 = 20;
//        num1=30;//错误写法final不可改变
        final int num3;
        num3 = 30;
    }

修饰引用类型的局部变量

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

修改
public class Student {
    private String name;

    public Student() {
    }

    public Student(String name) {

        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
    public static void main(String[] args) {
        //引用数据类型
        Student s1 = new Student("老赵");
        System.out.println(s1 + "\t" + s1.getName());
        s1 = new Student("老钱");
        System.out.println(s1 + "\t" + s1.getName());

        //final修饰的引用数据类型 地址不变
        final Student s2=new Student("老李");
       /*  错误写法!final的引用类型变量,其中的地址不可改变
        s2=new Student("老孙");*/
        System.out.println(s2+"\t"+s2.getName());
        s2.setName("老周");
        System.out.println(s2+"\t"+s2.getName());
    }

 结果:final修饰引用类型的局部变量后,引用类型的地址不在改变

 

修饰成员变量

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

 成员变量具有默认值,final修饰成员变量之后必须手动赋值,不会再给默认值了。


 

 

权限修饰符

可用范围publicprotected默认(default)private
同类中
同包中  
不同包的子类  
不同包中的无关类   
   成员变量使用 private ,隐藏细节。
   构造方法使用 public ,方便创建对象。
   成员方法使用 public ,方便调用方法。

 

 

 

 

 


内部类

内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名

$符号 。

列:实现心脏在身体中跳动

public class Body {
    //成员内部类
    public class Heart {
        private String myHeart;

        public void beat() {
            System.out.println(name + "心脏跳动");
        }
    }

    private String name;

    public Body(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void methodMybody() {
//        Heart heart = new Heart();
//        heart.beat();
        new Heart().beat();
    }

}

 

 

public class BodyTest {
    public static void main(String[] args) {
        Body body = new Body("老赵");
        //1通过外部类的成员方法访问内部类
        body.methodMybody();

        //2通过内部类直接访问内部类
        Body.Heart heart = new Body("老钱").new Heart();

        heart.beat();
    }
}

 

 列:内部类this,super的用法

public class Outer {
     int a=10;
    public  class Inner{
        int a=11;
        public void method(){
            int a=12;
            System.out.println(a+"\t"+this.a+"\t"+Outer.this.a);//12	11	10
        }
    }
}
public class OuterTest {

    public static void main(String[] args) {
        Outer.Inner inner = new Outer().new Inner();
        inner.method();
    }
}

 列:方法中的内部类

public class MyOut {
    public void methodMyOut() {

        class Inner {
            //局部内部类中的局部变量,那么这个局部变量必须是【有效final的】
            int a=10 ;

            public void methodInner() {
                System.out.println("方法执行");
            }
        }
        Inner inner = new Inner();
        inner.methodInner();

    }
}
public class demo01Test {
    public static void main(String[] args) {
        MyOut out=new MyOut();
        out.methodMyOut();

    }
}

 


 匿名内部类

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

格式

public interface MyInterface {
    void method1();
    void method2();
}

 

public class MyInterfaceImpl implements  MyInterface{
    @Override
    public void method1() {
        System.out.println("MyInterfaceImpl--method1()执行");
    }

    @Override
    public void method2() {
        System.out.println("MyInterfaceImpl--method2()执行");
    }
}
public class Demo01Test {
    public static void main(String[] args) {
        myMethod1();
        System.out.println("-------------------");
        myMethod2();
    }

    //2匿名对象的匿名内部类
    private static void myMethod2() {
        new MyInterface(){
            @Override
            public void method1() {
                System.out.println("匿名对象的匿名内部类--method1");
            }

            @Override
            public void method2() {

            }
        }.method1();

        new MyInterface(){
            @Override
            public void method1() {
                System.out.println("匿名对象的匿名内部类--method1");
            }

            @Override
            public void method2() {
                System.out.println("匿名对象的匿名内部类--method2");

            }
        }.method2();

    }
  //1匿名内部类
    private static void myMethod1() {
        
    MyInterface a=new MyInterface() {
        @Override
        public void method1() {
            System.out.println("匿名内部类--method1()");
        }

        @Override
        public void method2() {
            System.out.println("匿名内部类--method2()");
        }
    };
    a.method1();
    a.method2();

    }

}


 

引用类型用法总结

基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类型也是可以的。

列:显示英雄的武器

public class Weapon {
    private String code;// 武器的代号

    public Weapon() {
    }

    public Weapon(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}
// 游戏当中的英雄角色类
public class Hero {
    private String name; // 英雄的名字
    private int age; // 英雄的年龄
    private Weapon weapon; // 英雄的武器

    public Hero() {
    }

    public Hero(String name, int age, Weapon weapon) {
        this.name = name;
        this.age = age;
        this.weapon = weapon;
    }

    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 Weapon getWeapon() {
        return weapon;
    }

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    @Override
    public String toString() {
        return "Hero{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", weapon=" + weapon.getCode() +
                '}';
    }
}
public class DemoTest {
    public static void main(String[] args) {
        Hero hero = new Hero("老赵", 19, new Weapon("杀猪刀"));
        System.out.println(hero.toString());
        Hero hero1 = new Hero("老钱", 20, new Weapon("伤人剑"));
        System.out.println(hero1.toString());
    }
}

列:实现英雄释放技能

//英雄技能
public interface HeroSkill {
    void useSkill();
}
public class Hero {
    private String name; // 英雄的名称
    private HeroSkill heroSkill; // 英雄的技能的接口类
    public void myMethod(){
        System.out.println(name+"释放技能:");
        heroSkill.useSkill();
    }

    public Hero() {
    }

    public Hero(String name, HeroSkill heroSkill) {
        this.name = name;
        this.heroSkill = heroSkill;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public HeroSkill getHeroSkill() {
        return heroSkill;
    }

    public void setHeroSkill(HeroSkill heroSkill) {
        this.heroSkill = heroSkill;
    }

}

接口实现类,实现蛮王英雄技能 

public class HeroSkillImpl implements HeroSkill{


    @Override
    public void useSkill() {
        System.out.println("使用技能--急速快跑");
        System.out.println("使用技能--不死5秒");
    }
}

测试:

public class DemoGame {
    public static void main(String[] args) {
        testMethod01();
        System.out.println("--------------");
        testMethod02();
        System.out.println("--------------");
        testMethod03();

    }
    //3使用实现类实现
    private static void testMethod03() {
        HeroSkill a=new HeroSkillImpl();
        Hero hero=new Hero("蛮王",a);
        hero.myMethod();
    }

    //使用匿名对象的匿名内部类
    private static void testMethod02() {
        Hero hero = new Hero("寒冰", new HeroSkill() {
            @Override
            public void useSkill() {
                System.out.println("使用技能--射箭");
                System.out.println("使用技能--万箭齐发");
            }
        });
        hero.myMethod();
    }

    //1使用匿名内部类
    private static void testMethod01() {
        Hero hero = new Hero();
        hero.setName("德玛--");
        //hero.setHeroSkill(a);写在内部类下边
        HeroSkill a = new HeroSkill() {
            @Override
            public void useSkill() {
                System.out.println("使用技能--旋转刀");
                System.out.println("使用技能--一刀两半");
            }
        };

        hero.setHeroSkill(a);
        hero.myMethod();

    }
}

结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值