Java学习笔记之---内部类
Java学习笔记之---内部类
(一)成员内部类
- 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化
- 内部类的访问修饰符可以任意,但是访问范围会受到影响
- 内部类可以直接访问外部类的成员,如果出现重名属性,优先访问内部类中定义的
- 可以使用外部类.this.成员的方法,访问外部类中同名的信息
- 外部类访问内部类信息,需要通过内部类实例,无法直接访问
- 内部类编译后.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();
}
}
(二)静态内部类
- 静态内部类中只能访问外部类中的静态成员,如果要访问非静态的成员,需要通过对象实例
- 静态内部类实例时,可以不依赖于外部类对象
- 可以通过
外部类.内部类.成员
的方式,访问内部类中的静态成员 - 当内部类属性于外部类属性同名时,默认直接调用内部类的成员
- 如果要访问外部类中的静态属性,可以通过
外部类.属性
的方式 - 如果要访问外部类中的非静态属性,可以通过 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();
}
}
(三)方法内部类
- 定义在方法内部,作用范围也在方法内
- 和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static
- 类中不能包含静态成员
- 类中可以包含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());
}
}
(四)匿名内部类
- 匿名内部类没有类型名称,实例对象名称
- 编译后的文件名:外部类$数字.class
- 无法使用private,public,protected,abstract,static修饰
- 无法编写构造方法,可以添加构造代码块
- 不能出现静态成员
- 匿名内部类可以实现接口,也可以继承父类,但不可兼得
实例
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学习笔记之---内部类的更多相关文章
- Java学习笔记:内部类/匿名内部类的全面介绍
编写java程序时,一般一个类(或者接口)都是放在一个独立的java文件中,并且类名同文件名(如果类是public的,类名必须与文件名一致:非public得,无强制要求).如果想把多个java类放在一 ...
- Java学习笔记之——内部类
内部类 形式:把一个类定义在一个类的内部. 分为:成员内部类和匿名内部类重点掌握 a) 成员内部类 b) 静态成员内部类 c) 匿名内部类 d) 局部内部类 (1)成员内部类: Java的语言是面向对 ...
- 3)Java学习笔记:内部类
什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和 ...
- 【原】Java学习笔记025 - 内部类
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 内部类(嵌套类): ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
随机推荐
- Windows证书的生成导出以及使用证书验证文件是否被修改
本文介绍了如何使用Windows自带的证书生成器生成,导出,使用证书.并以验证文件是否被修改举例 1.证书相关辅助类 public sealed class DataCertificate { #re ...
- Win8 Metro(C#)数字图像处理--3.1图像均值计算
原文:Win8 Metro(C#)数字图像处理--3.1图像均值计算 /// <summary> /// Mean value computing. /// </summary> ...
- win10 uwp 萤火虫效果
原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...
- ARTS 1.21 - 1.25
每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 题目:3Sum Closest 解题过 ...
- C# 如何使用 Sql Server Compact 数据库
Sql Server Compact Edition(简称SqlCE)是一个轻量级的数据库,对于放在客户机上的程序而有需要存储数据这样的环境,使用SqlCE再合适不过了.SqlCE可以通过在VS(Vi ...
- MySql5.7.11 for Windows 安装(二)
原文:MySql5.7.11 for Windows 安装(二) 安装之后,首先创建data文件夹(旧版本本来就有),管理员打开cmd,cd到bin文件夹,输入 mysqld –initialize- ...
- 中国2017 Google 开发者大会第二天简单回顾
昨天早晨发布了第一天的开发者大会回顾文章后,就匆匆忙忙赶去会场继续享受高科技的盛宴,接下来简单回顾一下第二天的大会参与情况. 昨天早晨下着小雨,并带着微风,在外面还是挺冷的,这里不得不给工作人员点个赞 ...
- uwp汉堡菜单的实现
---恢复内容开始--- 现在uwp上面的汉堡菜单(就是那个三道杠,点击之后会出现菜单)使用的越来越普遍,比如微软自己家的Cortana.现在我使用的实现方法是使用SplitView实现.首先Spli ...
- VC++的Unicode编程
本文来自:http://tech.ddvip.com/2007-03/117395585321221.html 一.什么是Unicode 先从ASCII说起,ASCII是用来表示英文字符的一种编码规范 ...
- 再谈Delphi关机消息拦截 -- 之控制台程序 SetConsoleCtrlHandler(控制台使用回调函数拦截,比较有意思)
这里补充一下第一篇文章中提到的拦截关机消息 Delphi消息拦截:http://blog.csdn.net/cwpoint/archive/2011/04/05/6302314.aspx 下面我再介绍 ...