想了解更多请查看java学习(idea版)
目录
final关键字
为了避免子类继承父类,使用final关键字
final
: 不可改变。可以用于修饰类、方法和变量。
- 类:被修饰的类,不能被继承。
- 方法:被修饰的方法,不能被重写。
- 变量:被修饰的变量,不能被重新赋值。
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修饰成员变量之后必须手动赋值,不会再给默认值了。
权限修饰符
可用范围 | public | protected | 默认(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();
}
}
结果: