final、权限、内部类、引用类型

学习目标:

  • final、权限、内部类、引用类型

学习内容:

final关键字

不可改变。可以用于修饰类、方法、变量。
类:被修饰的类,不可有子类,不能被继承
方法:被修饰的方法、不能被重写
变量:被修饰的变量、不可被重新赋值

//修饰类
final class ClassName{

}
//修饰方法
public final void MethodName(){
	//方法体
}
//修饰变量
public final String name = "张三";
局部变量----引用类型

被final修饰,只能指向一个对象,地址不能再修改,但不影响成员变量setter方法修改值

final User u = new User();
u = new User();	 //编译失败,地址值无法改变	
u.setName("张三");//编译成功
成员变量

成员变量被final修饰,只能通过2个方法赋值

定义成员变量赋初值
构造方法初始化,必须保证每个构造方法都要有给final修饰变量赋初值的语句,同时setter方法将不再起作用,并报错,需要删除

public class ClassName{
	final String name = "张三";//final修饰的变量不能再被更改值
}
public class ClassName{
	final String name;
	public ClassName(){
		this.name = name;
	}
	public ClassName(String name){
		this.name = name;
	}
}

权限修饰符

使用不同的权限修饰符,能够修改访问权限

  • public 公共的
  • protected 受保护的
  • default 默认的
  • private 私有的

不同权限的访问能力

在这里插入图片描述

内部类

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

成员内部类

定义在类当中,方法外

class ClassName{
	class InnerClassName{
	}
	public void method(){
	//方法体
	}
}
访问特点

内部类可以随意访问外部类的所有变量和方法
外部类访问内部类需要new创建内部类对象

外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

Animal.Cat obj = new Animal().new Cat();

匿名内部类

当接口/父类只需要声明一次,后续不会再次用得到,可以使用匿名内部类,可以避免创建新的接口实现类/子类,也不需要实现类名
匿名内部类必须继承一个父类或者实现一个父接口

public interface InterfaceDemo {
    public abstract void method1();
}
public class InterfaceClass {
    public static void main(String[] args) {
        //密名内部类,避免不得不创建一个实现类
        InterfaceDemo inter = new InterfaceDemo() {
            @Override
            public void method1() {
                System.out.println("重写方法一");
            }
        };
        inter.method1();
    }
}

class作为成员变量

String 其实也是一个类,成员变量可以是Java自带包的类,也可以是自定义的类

public class Weapon {
    private String name;//武器

    public String getName() {
        return name;
    }

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

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

    public Weapon() {
    }
}
public class Hero {
    private String name;
    private int age;
    private Weapon weapon;

    public void attack() {
        System.out.println("英雄" + this.name + "使用" + this.weapon.getName()+"攻击");
    }

    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;
    }

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

    public Hero() {
    }
}
public class GameStart {
    public static void main(String[] args) {
        Hero hero = new Hero();
        Weapon weapon = new Weapon("无敌大鲨鱼");
        hero.setName("鲁班");
        hero.setWeapon(weapon);
        hero.attack();
    }
}
interface作为成员变量
package April.Apr8thpm;

public interface InterfaceAttack {
    public abstract void BBB();
}

package April.Apr8thpm;

public class InterfaceDemo {
    private String name;
    private InterfaceAttack interfaceAttack;

    public void attack(){
        System.out.println("英雄"+this.name);
        //实现接口类调用主要方法
        interfaceAttack.BBB();
    }
    public String getName() {
        return name;
    }

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

    public InterfaceAttack getAaa() {
        return interfaceAttack;
    }
	//此方法Aaa()仅为传入一个接口的实现类
    public void setAaa(InterfaceAttack interfaceAttack) {
        this.interfaceAttack = interfaceAttack;
    }

    public InterfaceDemo() {
    }

    public InterfaceDemo(String name, InterfaceAttack interfaceAttack) {
        this.name = name;
        this.interfaceAttack = interfaceAttack;
    }
}

package April.Apr8thpm;

public class InterfaceStart {
    public static void main(String[] args) {
        InterfaceDemo interfaceDemo = new InterfaceDemo();
        interfaceDemo.setName("鲁班");
        InterfaceAttack interfaceAttack = new InterfaceAttack() {
            @Override
            //此方法为重写接口,以便传入接口实现类能够调用执行功能
            public void BBB() {
                System.out.println("Biu biu biu");
            }
        };
        //此方法Aaa()仅为传入一个接口的实现类
        interfaceDemo.setAaa(interfaceAttack);
        interfaceDemo.attack();
    }
}

接口类型也可以作为方法的返回类型和返回值,Arraylist <泛型> 其实是接口List<泛型>的实现类,由于Java中有多态的概念,实现类Arraylist可以当作返回值或返回类型,则其接口/父类List<泛型>,也可以当作返回值类型/返回值


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值