Day10

第十六章 final关键字

/*finaL关键字代表最终、不可改变的。
常见四种用法:
1. 可以用来修饰一个类
2. 可以用来修饰一个方法
3.还可以用来修饰一个局部变量
4. 还可以用来修饰一个成员变量*//*
当final关键字用来修饰一个类的时候,格式:
public final class 类名称{//……
}含义:当前这个类不能有任何的子类。(太监类)
注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写(因为没有儿子)。*/
public final class MyClass /*extends Object*/{public void method (){System.out.println("方法执行!");}
}/*
当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。
格式:
修饰符 final 返回值类型 方法名称(参数列表){//方法体
}注意事项:
对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。*/
public class Fu {public final void method(){System.out.println("父类方法执行!");}
}public class Zi extends Fu {/*错误写法!不能覆盖重写父类当中final的方法@Overridepublic void method() {super.method();}*/
}//修饰局部变量
public class Demo01Final {public static void main(String[] args) {int num1 = 10;System.out.println(num1);num1 = 20;System.out.println(num1);//一旦使用final用来修饰局部变量,那么这个变量不能进行更改//“一次赋值,终生不变”final int num2 = 200;System.out.println(num2);//200//num2 = 250;错误写法!不能改变//num2 = 200;错误写法//正确写法!只要保证有唯一一次赋值即可final int num3;num3 = 30;//对于基本类型来说,不可变说的是变量当中的数据不可改变//对于引用类型来说,不可变说的是变量当中地址值不可改变Student stu1 = new Student ("赵丽颖");System.out.println(stu1);System.out.println(stu1.getName());stu1 = new Student("霍建华");System.out.println(stu1);System.out.println(stu1.getName());System.out.println("===============");final Student stu2 = new Student("高圆圆");//错误写法!final的引用类型变量,其中的地址不可改变//stu2 = new Student("赵又廷");System.out.println(stu2.getName());//高圆圆stu2.setName("高圆圆圆");System.out.println(stu2.getName());//高圆圆圆}
}/*
对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可变。1. 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了。
2.对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一。
3.必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。*/
public class Person {private final String name /*= "鹿晗" */;public Person() {name = "关晓彤";}public Person(String name) {this.name = name;}public String getName() {return name;}//    public void setName(String name) {//        this.name = name;
//    }
}

第十七章 四种修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
  • public : 对所有类可见。使用对象:类、接口、变量、方法
  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

我们可以通过以下表来说明访问权限

修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包
public Y Y Y Y Y
protected Y Y Y N N
default Y Y Y N N
private Y N N N N

默认访问修饰符-不使用任何关键字

使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为public static final,而接口里的方法默认情况下访问权限为 public

第十八章 内部类

18.1 成员内部类

/*
如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。
例如:身体和心脏的关系。又如:汽车和发动机的关系。分类:
1.成员内部类
2.局部内部类(包含匿名内部类)成员内部类的定义格式:
修饰符 class 外部类名称{修饰符 class 内部类名称{// ...}// ...
}注意:内用外,随意访问;外用内,需要内部类对象。==========================
如何使用成员内部类?有两种方式:
1. 间接方式:在外部类的方法当中,使用内部类;然后main只调用外部类的方法。
2. 直接方式,公式:
类名称 对象名 = new 类名称();
【外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();】*/
public class Body {//外部类private String name;public Body(String name) {this.name = name;}public Body() {}public String getName() {return name;}public void setName(String name) {this.name = name;}//成员内部类public class Heart{//内部类的方法public void beat(){System.out.println("心脏跳动,蹦蹦蹦!");System.out.println("我叫:" + name);//正确写法}}//外部类的方法public void methodBody(){Heart heart = new Heart();heart.beat();}
}public class Demo01InnerClass {public static void main(String[] args) {Body body = new Body();//通过外部类的对象,调用外部类的方法,里面间接在使用内部类Heartbody.methodBody();System.out.println("=====================");//按照公式写:Body.Heart heart = new Body().new Heart();heart.beat();}
}
//如果出现了重名现象,那么格式是,外部类名称.this.外部类成员变量名
public class Outer {int num = 10;//外部类的成员变量public class Inner{int num = 20;//内部类的成员变量public void methodInner(){int num = 30;//内部类方法的局部变量System.out.println(num);//内部类方法的局部变量System.out.println(this.num);//内部类的成员变量System.out.println(Outer.this.num);//外部类的成员变量}}
}public class Demo02InnerClass {public static void main(String[] args) {Outer.Inner inner = new Outer().new Inner();inner.methodInner();}
}

18.2 局部内部类

/*
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。
“局部”。只有当前所属的方法才能使用它,出了这个方法外面就不能用了.定义格式:
修饰符 class 外部类名称{修饰符 返回值类型 外部类方法名称(参数列表){class 局部内部类名称{// ...}}
}
小结一下类的权限修饰符
public > protected > (default) > private
定义一个类的时候,权限修饰符规则:
1. 外部类:public/(default)
2. 成员内部类:public/protected/(default)/private
3. 局部内部类:什么都不能写*/
public class Outer {public void methodOuter(){class Inner {//局部内部类int num = 10;public void methodInner(){System.out.println(num);//10}}Inner inner = new Inner();inner .methodInner();}
}public class DemoMain {public static void main(String[] args) {Outer outer = new Outer();outer.methodOuter();}
}
/*
局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效】final的。
备注:从Java 8+开始,只要局部变量事实不变,那么final关键字可以省略。原因:
1. new出来的对象在堆内存当中。
2. 局部变量是跟着方法走的,在栈内存当中。
3. 方法运行结束之后,立刻出核,局部变量就会立刻消失。
4. 但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。*/
public class MyOuter {public void methodOuter(){int num = 10;class MyInner{public void methodInner(){System.out.println(num);}}}
}

18.3 匿名内部类

/*
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,
那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】。匿名内部类的定义格式:
接口名称 对象名 = new 接口名称(){//覆盖重写所有抽象方法
};对格式“new接口名称() {...}”进行解析:
1. new代表创建对象的动作
2.接口名称就是匿名内部类需要实现哪个接口
3. {...}这才是匿名内部类的内容另外还要注意几点问题:
1.匿名内部类,在【创建对象】的时候,只能使用唯一一次。
如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类了。2. 匿名对象,在【调用方法】的时候,只能调用唯一一次。
如果希望同一个对象,调用多次方法,那么必须给对象起个名字。3. 匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名称】
强调:匿名内部类和匿名对象不是一回事!!!*/public interface MyInterface {public abstract void method();
}public class DemoMain {public static void main(String[] args) {//        MyInterfaceImpl imp = new MyInterfaceImpl();
//        imp.method();MyInterface obj = new MyInterfaceImpl();obj.method();//实现类覆盖重写了方法!MyInterface obj1 = new MyInterface() {@Overridepublic void method() {System.out.println("匿名内部类实现了方法!");}};obj1.method();//匿名内部类实现了方法!}
}

Java小农养成记第十天相关推荐

  1. Java小农养成记第十四天

    Day14 第一章 Map集合 1.1 概述 Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象.其中,键对象不允许重复,而值对象可以重复,并且值 ...

  2. Java小农养成记第三十天

    day30 今日内容 web概念概述 HTML web概念概述 JavaWeb: 使用Java语言开发基于互联网的项目 软件架构: C/S:Client/Server客户端/服务器端 在用户本地有一个 ...

  3. Java小农养成记第四十天

    day40 今日内容 JSP: 指令 注释 内置对象 MVC开发模式 EL表达式 JSTL标签 三层架构 JSP: 指令 作用:用于配置JSP页面,导入资源文件 格式: <%@ 指令名称 属性名 ...

  4. java小农养成记第三十五天

    day35 今日内容 XML 概念 语法 解析 XML 1. 概念:可扩展标记语言(Extensible Markup Language)* 可扩展:标签都是自定义的.\<user>\&l ...

  5. Java小农养成记第二十三天

    day23 第一章 Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"I0流"呢?在Java8中,得益于Lambd ...

  6. Java小农养成记第九天

    Day09 第十四章 接口 14.1 概述 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来 ...

  7. Java小农养成记第八天

    Day08 第十二章 继承 12.1概述 面向对象的三大特征:封装性.继承性.多态性. 继承是多态的前提,如果没有继承,就没有多态. 继承主要解决的问题就是:共性抽取. 父类也可以叫基类,超类 子类也 ...

  8. Java小农养成记第二十天

    day20 第一章 缓冲流 1.1 概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流:BufferedInputStream, Buffe ...

  9. Java小农养成记第一天

    Day01 第一章 开发前言 1.1 java语言概述 Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级编程语言.在2009年Oracle ...

最新文章

  1. Linux 环境 搭建Git 服务器,并且修改SSH端口使用
  2. Linux单网卡多个IP(或者多个网卡多个IP)设置
  3. superset可视化-Bar Chart
  4. vs官方使用教程中文版与英文版
  5. 工作分析文献综述_北大教授分析了124 篇不合格硕士学位论文,发现了6个典型问题!...
  6. [Alamofire] 错误总结
  7. java11新特性_Java11 发布前抓紧掌握这些新特性
  8. Spring Boot 2.x(十四):整合Redis,看这一篇就够了
  9. 学习EXT第八天:EXT的布局(Layout)Part 1
  10. mysql 主从切换_mysql主从切换步骤
  11. R语言大作业(三):新乡市、郑州市不同学历毕业生信息统计
  12. 【冷启动】快手《POSO: Personalized Cold Start Modules for Large-scale Recommender Systems》
  13. G1D5-Intriguing properties of neural networks
  14. Hadoop技术博文祝大家新年快乐
  15. 前端工程师必备的几个实用网站
  16. windows下安装与使用pix2tex(mathpix免费替代版)
  17. Opencv教程-图像二值化
  18. Storm学习(一) Storm介绍
  19. 【poj 1182】食物链 并查集应用
  20. dns劫持,启动chrome就打开垃圾网站

热门文章

  1. 成人学位英语和计算机考试时间,学位英语考试时间是什么时候?学位英语相当于英语几级?...
  2. Apple Watch卡住在苹果标志界面,该怎么解决?
  3. 【机器学习】聚类算法 kmeans
  4. 苏州大学文正学院计算机组成期末,苏州大学文正学院操作系统复习题
  5. 计算机专业十六字口号,16字口号大全
  6. 程序员的数学思维修炼
  7. Windows Server 2003 R2 简体中文企业版(32位)
  8. oracle数据库锁表查询,解锁,kill缩表进程
  9. freemarker 字符串格式化
  10. java基于ssm+vue+elementui的水果生鲜销售购物商城