Java学习笔记之---内部类

(一)成员内部类
  1. 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化
  2. 内部类的访问修饰符可以任意,但是访问范围会受到影响
  3. 内部类可以直接访问外部类的成员,如果出现重名属性,优先访问内部类中定义的
  4. 可以使用外部类.this.成员的方法,访问外部类中同名的信息
  5. 外部类访问内部类信息,需要通过内部类实例,无法直接访问
  6. 内部类编译后.class文件命名:外部类$内部类.class

实例

public class People {
private String name;
private int age;
public Heart getHeart(){
//外部类访问内部类信息,需要通过内部类实例,无法直接访问
new Heart().temp=12;
return new Heart();
} 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 void eat(){
System.out.println("人会吃东西");
}
//内部类的访问修饰符可以任意,但是访问范围会受到影响
public class Heart{
int temp=10;
int age=12; public void beat(){
//内部类可以直接访问外部类的成员,如果出现重名属性,优先访问内部类中定义的
// System.out.println(name+"的"+age+"心脏在跳动");
//可以使用外部类.this.成员的方法,访问外部类中同名的信息
System.out.println(name+"的"+People.this.getAge()+"心脏在跳动");
}
} }
class PeopleTest{
public static void main(String[] args){ People a=new People();
a.setName("zhang");
a.setAge(10);
//获取内部类对象实例 方法1:new 外部类.new 内部类
// People.Heart aa=new People().new Heart();
// aa.beat();
//获取内部类对象实例 方法2:外部对象.内部类
// People.Heart aa=a.new Heart();
// aa.beat();
//获取内部类对象实例 方法3:外部类对象.获取方法
People.Heart aa=a.getHeart();
aa.beat();
}
}
(二)静态内部类
  1. 静态内部类中只能访问外部类中的静态成员,如果要访问非静态的成员,需要通过对象实例
  2. 静态内部类实例时,可以不依赖于外部类对象
  3. 可以通过
    外部类.内部类.成员
    的方式,访问内部类中的静态成员
  4. 当内部类属性于外部类属性同名时,默认直接调用内部类的成员
  5. 如果要访问外部类中的静态属性,可以通过
    外部类.属性
    的方式
  6. 如果要访问外部类中的非静态属性,可以通过 new 外部类().属性
    的方式

实例

public class People {

    private String name;

    private static int age;

    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 void eat(){

       Heart c= new Heart();

       c.temp=12;

        System.out.println(c.temp+"人会吃东西");

    }

    //内部类的访问修饰符可以任意,但是访问范围会受到影响

    public static class Heart{

        int temp=10;

        int age=12;

        //静态内部类中只能访问外部类中的静态成员,如果要访问非静态的成员,需要通过对象实例

        public static void say(){

            String ll=new People().getName();

            //如果要访问外部类中的静态属性,可以通过 外部类.属性 的方式

            //如果要访问外部类中的非静态属性,可以通过 new 外部类().属性 的方式

            System.out.println(ll+People.age+new People().getName());

        }

    }

}

class PeopleTest{

    public static void main(String[] args){

        People a=new People();

        a.setName("zhang");

        a.setAge(10);

        //静态内部类实例时,可以不依赖于外部类对象

       People.Heart aa=new People.Heart();

       //当内部类属性于外部类属性同名时,默认直接调用内部类的成员

       People.Heart.say();

    }

}
(三)方法内部类
  1. 定义在方法内部,作用范围也在方法内
  2. 和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static
  3. 类中不能包含静态成员
  4. 类中可以包含final,abstract修饰的成员

实例

public class People {

    private String name;

    private static int age;

    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 Object getHeart(){ //和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static class Heart{ //类中可以包含final,abstract修饰的成员 final int temp=10; int age=12; public String beat(){ System.out.println("心在跳动"); return "心在跳动"; }
} return new Heart().beat();
}
}
class PeopleTest{ public static void main(String[] args){
People a=new People();
a.setName("zhang");
a.setAge(10);
System.out.println(a.getHeart()); }
}
(四)匿名内部类
  1. 匿名内部类没有类型名称,实例对象名称
  2. 编译后的文件名:外部类$数字.class
  3. 无法使用private,public,protected,abstract,static修饰
  4. 无法编写构造方法,可以添加构造代码块
  5. 不能出现静态成员
  6. 匿名内部类可以实现接口,也可以继承父类,但不可兼得
 实例
 public abstract class Person {

    public abstract void read();

}
class PersonTest{ public void getRead(Person a){ a.read(); } public static void main(String[] args){ PersonTest test=new PersonTest(); //匿名内部类没有类型名称,实例对象名称 //无法使用private,public,protected,abstract,static修饰 //匿名内部类可以实现接口,也可以继承父类,但不可兼得 test.getRead(new Person() { //无法编写构造方法,可以添加构造代码块 { //构造代码块 } @Override public void read() { System.out.println("男生"); } }); test.getRead(new Person() { @Override public void read() { System.out.println("女生"); } });
} }

Java学习笔记之---内部类的更多相关文章

  1. Java学习笔记:内部类/匿名内部类的全面介绍

    编写java程序时,一般一个类(或者接口)都是放在一个独立的java文件中,并且类名同文件名(如果类是public的,类名必须与文件名一致:非public得,无强制要求).如果想把多个java类放在一 ...

  2. Java学习笔记之——内部类

    内部类 形式:把一个类定义在一个类的内部. 分为:成员内部类和匿名内部类重点掌握 a) 成员内部类 b) 静态成员内部类 c) 匿名内部类 d) 局部内部类 (1)成员内部类: Java的语言是面向对 ...

  3. 3)Java学习笔记:内部类

    什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和 ...

  4. 【原】Java学习笔记025 - 内部类

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 内部类(嵌套类): ...

  5. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  6. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  7. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  8. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  9. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

随机推荐

  1. Mysql事务,并发问题,锁机制-- 幻读、不可重复读--专题

    1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...

  2. jquery hover()的使用

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  3. Java Socket 爬虫

    # 地址 https://github.com/mofadeyunduo/crawler # 前言 1.代码不断优化更新. 2.有建议请留言. # 介绍 1.多线程,基于 ExcutorServcie ...

  4. 树莓派3B 无显示器,无键盘,无Linux系统,无网线 配置WIFI连接

    #1.基本需求#2.烧写镜像#3.用有线网(网线)连接PC,实现远程操作树莓派#4.接入无线网,通过其它电脑远程控制树莓派#5.使用PC共享的热点Wifi远程控制树莓派 #1.基本需求 树莓派 USB ...

  5. ubuntu 16.04 安装 openjdk 1.7

    由于编译Android源码需要openjdk1.7.X版本.ubuntu 16.04自带openjdk为1.8.X版本. sudo apt-get install openjdk-7-jre 或者su ...

  6. 【Git】文件暂存与提交

    git工作目录文件的两种状态:已跟踪.未跟踪. 文件状态的变化周期: 查看当前文件状态: git status 跟踪新文件/暂存已修改文件 git add newfile 状态简览 git statu ...

  7. HTML特殊编码转换

    var encoded = ""'&<>¡¢£¤" + "¥¦§¨©ª«¬­®" + "¯°±²³´µ¶·" ...

  8. LINQ查询表达式---------join子句

    LINQ查询表达式---------join子句 join 子句接受两个源序列作为输入. 每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性. join子句使用 ...

  9. 使用PyQt5编写一个简单的GUI程序(pyside 有 pyside-uic 把ui文件转成py文件,pyside-rcc 把qrc文件转成 py文件导入就行了)

    我做Python窗口界面编程时,经常使用PyQt进行设计.这里简单叙述一下使用PyQt5制作一个简单的图形界面的流程 PyQt的简介以及开发环境的搭建在此不多赘述. 1.       打开Qt Des ...

  10. 专访Rust——由Mozilla开发的系统编程语言(目标人群就是那些纠结的C++程序员,甚至也是他们自己)

    Rust是由Mozilla开发的专门用来编写高性能应用程序的系统编程语言.以下是对Rust的创始人——Graydon Hoare的采访. Graydon Hoare,自称为职业编程语言工程师,从200 ...