匿名类、包、权限修饰符_DAY10
1:内部类(理解)
(1)把类定义在一个类的内部。
(2)特点:
A:内部类可以直接使用外部类的成员,包括私有。
B:外部类要使用内部类成员,必须创建对象使用。
例子:
public class InnerClassTest {public static void main(String[] args) {OuterClass.InnerClass inner=new OuterClass().new InnerClass();//创建内部类对象inner.innerMethod(); //外部类要使用内部类成员,必须创建对象使用 } }class OuterClass{//成员变量private int age=10;//构造方法public OuterClass(){}//成员内部类class InnerClass{public void innerMethod(){System.out.println("我是成员内部类,访问外部类的私有属性age:"+age);//内部类可以直接使用外部类的成员,包括私有。 }} }
View Code
(3)内部类的分类:
局部内部类:定义在方法中的内部类
成员内部类:定义在类中方法外的内部类
(4)成员内部类
class Outer {
class Inner { //成员内部类
}
}
普通的修饰的时候:
外部类名.内部类名 变量 = 外部类对象.内部类对象;
Outer.Inner oi = new Outer().new Inner();
class Outer {
static class Inner {
void method(){}
}
}
用静态修饰内部类时:
外部类名.内部类名 变量 = 外部类名.内部类对象
Outer.Inner oi = new Outer.Inner();
Outer.Inner oi = Outer.new Inner(); //错误
用静态修饰内部类和方法时:
Outer.Inner.method()
成员内部类:
private:为了数据的安全。可以加数据校验
static:为了方便调用。
例子:
/*成员内部类:内部类定义在成员位置内部类对象创建:Outer.Inner x = new Outer().new Inner(); */ class Demo8 {public static void main(String[] args) {//Inner inner = new Inner(); //内部类对象不可以直接这样创建//System.out.println(new Outer().age); //调用错误 Outer out = new Outer();Outer.Inner inner = out.new Inner(); //创建内部类对象的方式1Outer.Inner inner2 = new Outer().new Inner();//创建内部类的对象的方式2 inner.innerMethod();inner2.innerMethod();} }class Outer {//成员属性private int age;//成员内部类class Inner{public void innerMethod(){System.out.println("我是内部类的方法,外部类age的值为"+age); //可以直接访问外部私有属性 }}//成员方法public void outerMethod(){Inner inner = new Inner(); //创建成员内部类对象,调用成员内部类方法 inner.innerMethod();} }
View Code
/*private与static修饰符的成员内部类private:外界无法直接创建内部类对象,外部类可以创建内部类对象,在此之前可以加入校验。static: 修饰内部类,不需要使用外部类对象,外部类名直接调用,修饰内部类成员,不需要内部类对象,使用内部类名直接调用。 */ class Demo9 {public static void main(String[] args) {/*private-----------------------------------------------------------------------//当使用private修饰成员内部类,则不能使用以下两种方法创建对象//Outer out = new Outer();//Outer.Inner2 inner = out.new Inner2(); //方式1//Outer.Inner2 inner = new Outer().new Inner2();//方式2//可以在外部类的方法中创建内部类对象,可以增加数据校验,保证安全性out.outerMethod();*///static---------------------------------------------------------------------//当使用static修饰成员内部类,可以直接使用外部类名new Outer.innerMethod()的形式创建内部类对象Outer.Inner inner= new Outer.Inner();inner.innerMethod();//当使用static修饰成员内部类,同时成员内部类的方法也用static修饰时,可以直接使用外部类.内部类.方法的形式,调用内部类的方法! Outer.Inner.innerStaticMethod();} }class Outer {private static int age;static class Inner{public void innerMethod(){System.out.println("我是内部类的方法,外部类age的值为"+age);}public static void innerStaticMethod(){System.out.println("我是内部类的方法,外部类age的值为"+age);}}public void outerMethod(){//数据校验Inner inner = new Inner();inner.innerMethod();} }class Outer2 {private int age2;private class Inner2{public void innerMethod2(){System.out.println("我是内部类的方法,外部类age的值为"+age2);}}public void outerMethod2(){//数据校验Inner inner2 = new Inner2();inner2.innerMethod2();} }
View Code
(5)局部内部类
A:带名字的局部内部类
class Outer { //外部类
public void method() { //成员方法
final int a = 10;
class Inner { //成员内部类
public void show() { //成员内部类的方法
System.out.println("show");
System.out.println(a);
}
}
Inner i = new Inner(); //在成员内部类里面创建对象并使用!
i.show();
}
}
B:匿名内部类(掌握)
a:没有名字的内部类。其本质是一个对象。是通过多态来实现的。
b:前提:存在一个抽象类或者接口。
c:格式:
new 抽象类或者接口() {
重写父类方法;
};
本质:是一个继承了类或者实现了接口的子类匿名对象。
例子:
/*匿名内部类:在通过简写形式定义一个没有类名的类。匿名内部类即将匿名定义类与创建对象的动作一起完成。 必须要有实现或者继承关系。格式:new 类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)}; //注意使用的是父类或者接口*/ class Demo11 {public static void main(String[] args) {Demo12 demo12 = new Demo12();demo12.outerMethod();}}abstract class Animal {public abstract void eat(); }interface MyInterface {public abstract void method();public abstract void method2(); }class Demo12 {public void outerMethod(){class Cat extends Animal //内部类 {public void eat(){System.out.println("舔着吃!");}}Animal cat = new Cat();cat.eat();System.out.println("============================");Animal anyAnimal = new Animal(){ //没有类名,有对象名public void eat(){System.out.println("舔着吃!");}public void method(){System.out.println("我是匿名内部类对象的方法");}};anyAnimal.eat();//anyAnimal.method();new Animal(){public void eat(){System.out.println("舔着吃!");}}.eat();//===============================以上为抽象类的内部类,以下为接口的内部类System.out.println("============================");class MyClass implements MyInterface{public void method() {System.out.println("我是内部类方法1");}public void method2() {System.out.println("我是内部类方法2");}}MyInterface mi = new MyClass();//有类名MyClass,有对象名mi mi.method();mi.method2();MyInterface mi2 = new MyInterface(){//没有类名,有对象名mi2public void method() {System.out.println("我是匿名内部类方法1");}public void method2() {System.out.println("我是匿名内部类方法2");}};mi2.method();mi2.method2();new MyInterface(){ //没有类名,没有对象名,即匿名对象public void method() {System.out.println("我是匿名内部类方法1");}public void method2() {System.out.println("我是匿名内部类方法2");}}.method();new MyInterface(){ //没有类名,没有对象名,即匿名对象public void method() {System.out.println("我是匿名内部类方法1");}public void method2() {System.out.println("我是匿名内部类方法2");}}.method2();} }
View Code
d.匿名内部类的使用场景 :
:内部类效率更高。
:通常在使用接口类型参数的方法上,并该接口中的方法不超过三个时,可以将匿名内部类作为参数传递。
:增强阅读性。
例子:
package package3;/*使用匿名内部类的场景:1:提高效率2:当参数类型,返回值类型,成员变量类型为抽象类或者接口时,可以使用匿名内部类。3:增强阅读性*/ class Demo13 {public static void main(String[] args){//-----------------普通方式调用 ---------------------Demo13 demo13 = new Demo13();MyClass mc = new MyClass();demo13.method(mc);//-----------------创建匿名内部类---------------------demo13.method(new MyInerface(){public void method() {System.out.println("匿名对象匿名内部类方法一");}public void method2() {System.out.println("匿名对象匿名内部类方法二");}});MyAbsClass mac = demo13.method2();mac.eat();mac.sleep();mac.hitBeanBean();}//参数类型为接口的方法public void method(MyInerface mi) {mi.method();mi.method2();}//返回值类型为抽象类的方法public MyAbsClass method2() {// 方式1:有类名MyClass2、有对象名mac/* MyAbsClass mac = new MyClass2();return mac;*///方式2:没有类名,有对象名mac/*MyAbsClass mac = new MyAbsClass(){public void eat() {System.out.println("匿名内部类中:学完匿名内部类,就吃不下去了!");}public void sleep(){System.out.println("匿名内部类中:学完匿名内部类,就睡不着了!");}};return mac;*///方式3:没有类名,没有对象名return new MyAbsClass(){ //匿名内部类public void eat() {System.out.println("匿名内部类中:学完匿名内部类,就吃不下去了!");}public void sleep(){System.out.println("匿名内部类中:学完匿名内部类,就睡不着了!");}};} }//---------------------------接口-------------------------------------- interface MyInerface {public abstract void method();public abstract void method2(); }class MyClass implements MyInerface {public void method() {System.out.println("方法一");}public void method2() {System.out.println("方法二");} }//---------------------------抽象类--------------------------------------abstract class MyAbsClass {public abstract void eat();public abstract void sleep();public void hitBeanBean(){System.out.println("学完匿名内部类,就开始打豆豆!");} }//---------------------------非抽象类-------------------------------------- class MyClass2 extends MyAbsClass {public void eat() {System.out.println("学完匿名内部类,就吃不下去了!");}public void sleep(){System.out.println("学完匿名内部类,就睡不着了!");} }
View Code
(6)例子:定义并使用内部类。要求包含局部内部类,成员内部类,匿名内部类。
/*** 定义并使用内部类。要求包含局部内部类,成员内部类,匿名内部类。*/ public class Main {public static void main(String[] args) {//调用成员内部类Fu.Zi zi= new Fu().new Zi();zi.sleep();//调用局部内部类Fu fu=new Fu();fu.eat();//调用匿名内部类 fu.method().eatType();} }
View Code
/*** 定义并使用内部类。要求包含局部内部类,成员内部类,匿名内部类。*/ public class Fu {//成员变量String string = "巴马";//成员内部类public class Zi {public void sleep() {System.out.println("睡觉");}}//局部内部类public void eat() {class EatMeat extends EatType { //局部内部类,必须要继承抽像类或者继承接口public void eatType() {System.out.println("吃肉");}}EatMeat eatMeat = new EatMeat();eatMeat.eatType();}//匿名内部类public EatType method() { //返回值类型或者参数类型为抽象类或者接口/*EatType type= new EatType(){public void eatType(){System.out.println("吃鱼");}};return type;*/return new EatType(){public void eatType(){System.out.println("吃鱼");}};}}
View Code
public abstract class EatType {public abstract void eatType(); }
View Code
(7)匿名内部类面试题
/*匿名内部类练习:Outer.method.show(); 意思为Outer类的静态成员变量method可以调用一个show方法,可以调用show方法的一定是Inter接口的子类实例Outer.method().show(); 意思为Outer类的静态成员方法method()的返回值可以调用一个show方法,可以调用show方法的一定是Inter接口的子类实例 */interface Inter{void show(); }//题目1: class Outer{//补齐代码public static Inter method() {//方式1/* Inter inter = new Inter(){public void show(){System.out.println("hello world");}};return inter;*///方式2return new Inter(){public void show(){System.out.println("hello world");}};} }class innerClassTest{public static void main(String[] args){Outer.method().show();} }//题目2: /* class Outer{//补齐代码public static Inter method = new Inter(){public void show(){System.out.println("hello world");}}; } class innerClassTest{public static void main(String[] args){Outer.method.show();} } */
View Code
2:包(掌握)
(1)包就是永远区分相同类在不同文件夹下。其本质就是一个文件夹。
(2)包的作用:让相同类名的类可以存在。为了组织代码。cn.itcast.action cn.itcast.service cn.itcast.db
(3)定义包:
package 包名.包名...;
(4)带包的编译和运行(理解)
A:方式一
手动式
a:javac编译代码
b:手动建立包,把class扔进去
c:java执行,带全路径
B:方式二
自动式
a:通过javac编译自动生成包
javac -d . 文件名
b:通过java运行class文件
java 包名.包名.class文件名不带扩展名
(5)不同包下的类之间的访问。
权限够大才行。
以后,我们所有定义的类都用public修饰。
(6)面试题:
在同一个java文件中,可不可以有多个类?可以。
而我们知道类是可以用public修饰的,那么,可不可以多个类都用public修饰?不可以。
并且,一般的时候,如果有main方法也存在的时候,都是public修饰带main那个类。
文件名必须和该public修饰的类名一致。
(7)实际运行的时候,是要求Class文件在一个文件加下,可以直接调用,如果不在一个文件夹下,导包也是为了导入Class文件。
3:导包(掌握)
(1)如果多次使用一个多级包的类,每次带全路径太麻烦,我们就考虑使用导包。
(2)导包的格式:
import 包名.包名...;
注意:
在同一个包下如果有多个类被使用,可以使用通配符*来导入,但是不建议。
推荐:使用谁导入谁。
(3)面试题:
package,import,class出现的位置?
package > import > class
4:权限修饰符(掌握)
(1)用于保证在不同的情况下可以使用
(2)使用如下
本类 同一个包下 不同包下的子类 不同包下的无关类
private Y
默认 Y Y
protected Y Y Y
public Y Y Y Y
常见的组合规则:
权限修饰符+abstract/final/static+...
我们到底怎么用(开发的时候一般都这么做):
类:
public class Demo { }
成员变量:
变量:private String name; 加上相应的getter和setter
常量:public static final int X = 10;
构造方法:
不让外界创建:private Demo(){}
大部分:public Demo(){}
成员方法:
不让外界用:private void show(){}
大部分:public void method(){}
抽象方法:public abstract void function();
转载于:https://www.cnblogs.com/hezhiyao/p/7504464.html
匿名类、包、权限修饰符_DAY10相关推荐
- 包 权限修饰符 final 常量 枚举 抽象类 接口 多态 内部类 常用API 正则表达式 Lambda
包 什么是包? 包是用来分门别类的管理各种不同类的,类似于文件夹.建包利于程序的管理和维护. 建包的语法格式:package 公司域名倒写.技术名称.报名建议全部英文小写,且具备意义. package ...
- 学习Java的第五天 | 定义方法 | 引用数据类型——类 | 访问权限-修饰符 | 全局变量与局部变量 | toString | 构造方法 | 方法重载
前面提到的,冒泡排序,二分查找,我们有时候写代码可能不止要查到一种数组的数据,这时候我们就很需要想循环那样的结构,来帮我们解决代码冗余的情况. 我们前面使用的main方法,是一个java程序的入口,我 ...
- 包package,权限修饰符
定义包的格式 package 包名; 多级包用.分开即可 注意事项: package语句必须是程序的第一条可执行的代码 package语句在一个java文件中只能有一个 如果没有packa ...
- day12、面向对象进阶(包、权限修饰符、final、常量、枚举、抽象类、接口)
面向对象进阶(包.权限修饰符.final.常量.枚举.抽象类.接口) 包 权限修饰符 final 常量 常量概述和基本作用 常量做信息标志和分类 枚举 枚举的概述 枚举的使用场景演示 抽象类 抽象类概 ...
- 绝密101:import,java,packag的顺序、权限修饰符、类及其组成可用的修饰符
import,java,packag他们三个直接有没有顺序呢? packag:到达的路径,所在文件的路径,他最终以包的形式结束(他在最前面) import:导入外界你想要使用的类,它最终以你想要结束的 ...
- 封装、权限修饰符、javaBean规范、继承中封装、多态、关于上溯造型的解释。
一.封装 类 .方法.属性这些java中编程所涉及到的元素的访问权限控制 二.权限修饰符 修饰成员 public protected default private 本类中 ...
- 面向对象编程(OOP) 权限修饰符
类的权限修饰符 Java语言中的权限修饰符主要包括private.public和protected,这些修饰符控制着对类和类的成员变量以及成员方法的访问.如果一个类的成员变量或成员方法被修饰为priv ...
- java复习第3天---3.1---final关键字、权限修饰符
java复习第3天---3.1---final关键字.权限修饰符 目录 文章目录 1.final 关键字 1.1.修饰类 1.2.修饰成员方法 1.3.修饰成员变量 1.4.修饰局部变量 2.权限修饰 ...
- java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...
1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的 ...
最新文章
- python找最大值的函数_Python 获取最大值函数
- WorkFlow For Net ! NET 平台工作流 或 BPM
- 使用SSL和Spring Security保护Tomcat应用程序的安全
- 指向函数的指针 - C语言
- AC_Dream 1224 Robbers(贪心)
- 关于比较器Comparator排序时间的问题
- 通用职责分配软件原则之7-纯虚构原则
- oracle 精度异常01438,序列值超过字段精度导致ORA-01438
- weblogic11g 密码忘记肿么办?
- 190713每日一句
- AWVS14.7破解版免费获取
- MATLAB求导函数diff(a,b,c)
- 微信 服务器参数错误 请重新填写,微信上登录验证出现参数错误怎么解决
- 实名认证失败_身份证在国政通进行实名认证失败怎么办?
- php 微信小程序签到打卡,微信小程序实现打卡日历功能
- jdk9、jdk10、jdk11、jdk12、jdk13新特性
- 主线程异常会导致 JVM 退出?
- Linux 心路历程
- python爬取帅啊网的帅哥美男图片
- Facebook多账号运营怎么防关联?
热门文章
- crontab/ntpdate——时间同步
- 普通卷积armv7-neon指令集实现—XNNPACK
- 将 app 打包成 deb 发布安装
- 可以在没有main()的情况下编写C程序吗?
- muduo学习笔记 日志类
- c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
- python 判断等于0_Python 条件语句介绍
- C++之vector容器初学(二)——插入和删除
- mysql cluster 读写分离_mysql数据库集群实现高可用读写分离_一点课堂(多岸学院)...
- [转]ROS2 源码解析与实践 - Node