Lecture:波哥
Java
是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java
虚拟机,Java
仍是企业和开发人员的首选开发平台。
将类定义在类的内部,那么该类就称为内部类
注意:内部类是一个相对的概念,如果Outter类中有一个类Inner类,那么Otter类相对于Inner类来说就外部类,而Inner相对于Outter来说就是内部类
Java中不能被实例化的类型有哪些?
为什么要使用内部类?
提高类的安全性
Inner.class
我们在外部类中定义一个成员内部类,这个内部类和成员变量成员方法是同级的
内部类非私有
因为内部类非私有,所以我们可以通过如下的格式直接获取内部类的对象
外部类.内部类 变量名称 = 外部类对象.内部类对象;
内部类私有
内部类作为外部类的成员,那么是可以用 private 来修饰的,既然用 private修饰那也就意味着外界是没办法直接获取该对象的,同时我们也没法通过相关的类型来接收,但是我们可以在外部类中提供相关的getter/setter方法来处理。
package com.bobo.oop12;
public class OOPDemo01 {
public static void main(String[] args) {
// 我们在外部如何获取内部类的对象
/*Outter.Inner in = new Outter().new Inner();
in.show();*/
Outter out = new Outter();
System.out.println(out.getName());
out.setInner();
System.out.println(out.getInner());
// 可以获取内部类对象 但是没法用变量来接收,没法访问相关的属性和方法
out.getInner();
}
}
class Outter{
private String name = "张三";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 这个内部类是外部类的一个成员
* @author dpb
*
*/
private class Inner{
public void show(){
System.out.println("show ... " + name);
}
}
public void setInner(){
Inner in = new Inner();
in.show();
}
public Inner getInner(){
Inner in = new Inner();
return in;
}
void info(){
}
}
当外部类成员变量和内部类成员变量及内部类方法中的局部变量同名的情况下怎么处理
在这种情况下获取外部类中的成员变量的方式
外部类名.this.变量名
成员内部类我可以理解为和成员变量同级,那么局部内部类我们也可以理解为和局部变量同级的内部类
package com.bobo.oop13;
public class OOPDemo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Outter02 out = new Outter02();
out.show();
}
}
class Outter02{
int num1 = 20;
/**
* 在JDK1.8之后 把局部内部类中使用的外部方法的局部变量默认的提升为 final
* 在JDK1.8之前 这里会强制要求我们将 局部变量声明为final类型
*/
public void show(){
int num = 30;
// 定义一个局部内部类
class Inner{
public void info(){
System.out.println("inner info ..." + num);
}
}
// 我们要使用内部类对象 调用其中的方法才会执行
Inner in = new Inner();
// num = 50;
in.info();
System.out.println(num);
}
}
被static修饰的成员内部类我们称为静态内部类。
获取内部类实例的语法格式:
外部类.内部类 变量名称 = new 外部类.内部类();
package com.bobo.oop14;
public class OOPDemo01 {
public static void main(String[] args) {
// 1.获取外部内对象
Outter out = new Outter();
//out.show();
// 2.获取静态内部类对象
// Outter.Inner in = new Outter().new Inner();
// Outter.Inner in = Outter.(new Inner());
Outter.Inner in = new Outter.Inner();
Outter.name = "";
Outter.show();
}
}
class Outter{
public static String name = "张三";
public static void show(){
System.out.println(name);
}
/**
* 定义的一个静态内部类
* @author dpb
*
*/
static class Inner{
public static String name="李四";
public int age = 20;
public void info1(){
System.out.println(age);
}
public static void info2(){
System.out.println("内部类:" + name);
}
}
}
静态内部类相比于成员内部类来说简化了方法方式,好处同样的提高了类型的安全性。
静态内部类的特点:
如果要获取静态内部类中的静态方法或者属性的话可以通过如下方式获取
外部类名称.内部类名称.静态方法();
外部类名称.内部类名称.静态变量;
没有名称的内部类我们称为匿名内部类。如果一个内部类在整个操作中只使用了一次的话,那就可以定义为匿名内部类。
没有使用匿名内部类的情况
package com.bobo.oop15;
public class OOPDemo01 {
public static void main(String[] args) {
new X().fun2();
}
}
interface Person{
void sleep();
}
class User implements Person{
@Override
public void sleep() {
System.out.println("睡觉真舒服啊....");
}
}
class X {
void fun1(Person p){
p.sleep();
}
void fun2(){
this.fun1(new User());
}
}
使用匿名内部类的情况
package com.bobo.oop16;
public class OOPDemo01 {
public static void main(String[] args) {
new X().fun2();
}
}
interface Person{
void sleep();
}
/*class User implements Person{
@Override
public void sleep() {
System.out.println("睡觉真舒服啊....");
}
}*/
class X {
void fun1(Person p){
p.sleep();
}
void fun2(){
this.fun1(new Person(){
@Override
public void sleep() {
System.out.println("AAAAAA....");
}
});
}
}
匿名内部是Java为了方便我们编写程序而设计的一种机制,因为有时候有的内部类之需要创建一个对象就可以了,这时候匿名内部类就比较合适好,匿名内部类一般都是和接口及抽象类关联的