【Java】对象、类(抽象类与内部类)、接口
博文内容概况
对象和类
对象是对客观事物的抽象,类是对对象的抽象。类是一种数据类型,其外观和行为由用户定义。类中可以设置两种类型的元素:字段(有时被称为数据成员)和方法(有时被称为成员函数)。字段可以是任何类型的对象。如果类的某个成员是基本数据类型,即使没有进行初始化,Java也会给它一个默认值,但用户最好自行对其进行初始化。
| 基本类型 | 默认值 |
| boolean | false |
| char | '\u0000'(null) |
| byte | (byte)0 |
| short | (short)0 |
| int | 0 |
| long | 0L |
| float | 0.0f |
| double | 0.0d |
抽象类
/**
1. 被abstract修饰的类即为抽象类;包含一个或多个抽象方法的即为抽象类
2. 抽象类的权限修饰符为public,缺省(如下)也为public;
3. 抽象类无法创建对象(即不能new);
4. 其余情况与普通类相同。
*/
abstract class animal {
int num;//成员变量可使用任何访问权限修饰词(public、protected、private)
/**
1. 抽象方法必须为public或protected,缺省即为public;
2. 抽象方法没有方法体,即符号{};
3. 子类中必须实现抽象方法,否则子类仍为抽象类。
*/
abstract void run();
}
class lion extends animal{
void run(){}
}
接口
interface提供一个完全抽象的类,没有提供任何具体实现。它允许创建者确定方法名、参数列表和返回类型。
/**
在Java8版本中,接口的功能增强了,接口中允许存在:
1. 变量 - 必须为public static final形式的变量;
2. 抽象方法 - public abstract关键词在接口中可省略;
3. 具体方法 - 以static、default关键词修饰的方法,关键词不可省略(Java8新增的内容)
* 方法默认的权限为public
*/
public interface animal {
public static final int a = 8;
//static方法
static void staticMethod() {
System.out.println("---animal static method---");
}
//default方法
default void defaultMethod() {
System.out.println("---animal default method---");
}
//抽象方法
void run();
}
调用static、default方法如下
class lion implements animal {
public static void main(String[] args) {
//调用接口中的静态方法——接口名.静态方法名(与调用普通类的静态方法一样)
animal.staticMethod();
//调用接口中的default方法 实现接口并实例化该实现类
lion l = new lion();
l.defaultMethod();
}
@Override
public void run() {}
}
总结,抽象类和接口之间的异同
(√表示允许存在,×表示不存在)
| 抽象类 | 接口 | |
| 定义(关键词) | abstract class | interface |
| 类的权限修饰符 | public与缺省相同 | public、缺省 |
| 变量 | 没有任何限制 | 必须以public static final修饰 |
| 抽象方法 | √ | √ |
| 抽象方法权限修饰符 | public、protected、缺省(default)[1.8] | 缺省默认为public |
| 构造方法 | √ | × |
| 普通方法 | √ | √[1.8] |
| 静态方法 | √ | √[1.8] |
| 静态块 | √ | × |
| 继承方式 |
子类只能继承1个抽象类 抽象类可以继承一个类(抽象类、实体类均可)和实现多个接口 (extends、implements)* |
接口可以继承多个接口 子类可以实现多个接口 (implements)** |
| 作用 | 重用 | 降低耦合 |
*子类继承抽象类时需要重写父类所有的抽象方法,可以实例化;若不能完全重写,则该子类仍为抽象类;
**子类实现接口时需要实现全部的抽象方法,否则该子类为抽象类。
内部类
·成员内部类
public class Outer {
private int num = 8;
private int out = 10;
private Inner in = null;
public Outer() {
in = new Inner();
}
//内部类的访问权限-public、protected(外部类的子孙类可访问)、默认(与外部类同包)、private(只能在外部类内部访问)
public class Inner{
private int out;
public void doSomething() {
//内部类可直接访问外部类的成员
System.out.println(num);
//当内部类拥有外部类同名的成员变量和方法,需要通过[外部类.this.成员变量/成员方法] 进行访问
System.out.println(Outer.this.out);
}
}
public static void main(String[] args) {
//成员内部类依靠外部类存在,所以访问内部类时需要一个外部类的对象
Outer.Inner inner = new Outer().new Inner();
inner.doSomething();//访问内部类成员方法
inner.out++;//访问内部类成员变量
}
}
·静态内部类
public class Outer {
int a;
static int b;
static class Inner{
public Inner() {
//System.out.println(a); 编译不通过
System.out.println(b);//只能访问外部的静态变量
}
}
}
·局部内部类
public class Outer {
public int out;
public static int out_s;
public void method() {
int num;
class Inner{
//num++; 编译不通过,无法使用可变的局部变量
public void print() {
System.out.println(out++);//可以使用外部类的成员变量
}
}
}
static void method2() {
class Inner{
public void print() {
System.out.println(out_s++);//static方法中的内部类只能使用静态变量
}
}
}
}
·匿名内部类
/**
1. 匿名内部类是唯一没有构造器的类,用于继承其他类、实现接口;
2. 匿名内部类的好处是使用便捷
3. 通过实例初始化,达到匿名内部类创建一个构造器的效果
如例,Thread()中的部分为Thread的内部类,通过实例(new)Runnable接口达到想要的效果
*/
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<100;i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
});
t.start();
| 成员内部类 | 静态内部类 | 局部内部类 | 匿名内部类 | |
| 权限 |
package,public,protected,
private
|
不允许有public、protected、private、static | 不能有访问修饰符 | |
| 修饰词 | 成员内部类可看作外部类的一个成员,所以可以像成员一样拥有多个权限修饰词 | static(必须) | 可以使用final/abstract | 不能有static |
| 定义位置 |
在另一个类的内部,
与成员方法、属性平级
|
定义在方法、代码块、
作用域({}中)
|
||
| 访问内部 | 通过内部类的实例访问 | |||
| 访问外部 | (内外部成员名字相同时)外部类.this.成员变量 |
只能访问静态成员(
变量/方法)
|
||
| 特点 | 无需依赖外部类 | 只能使用一次 |
参考:
《Java编程思想》
https://www.cnblogs.com/dolphin0520/p/3811445.html(海子:Java内部类详解)
https://www.cnblogs.com/dorothychai/p/6007709.html
【Java】对象、类(抽象类与内部类)、接口的更多相关文章
- 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成
写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...
- 序列化、反序列化(实体类或要序列化的对象类必须实现Serializable接口)
package com.phone.shuyinghengxie; import java.io.Serializable; /* 一个类的对象要想序列化成功,必须满足两个条件: 该类必须实现 jav ...
- Java对象为啥要实现Serializable接口
Serializable接口概述 Serializable是java.io包中定义的.用于实现Java类的序列化操作而提供的一个语义级别的接口.Serializable序列化接口没有任何方法或者字段, ...
- Java ——对象 类 方法重载 构造方法 封装 内部类
本节重点思维导图 快捷键 生成代码:alt+shift+s 提取变量:alt+shift+L 快速复制行:alt+ctrl+向上或向下的箭头 删除行:ctrl+d 类:对同一种事物共同属性和行为的抽象 ...
- WebService:java配置类形式发布WebService接口及遇见的问题总结
配置WebService前需要以下依赖jar包 #版本只供参考,具体看项目 <dependency> <grouId>org.apache.cxf</grouId> ...
- Java基础系列 - 抽象类继承和接口实现
package com.inter; /** * 继承和接口的关系,单继承,多接口 * java不支持多继承,但可通过接口实现多重继承 */ public class test2 { public s ...
- java 对象 类 知识点 概览
第30集 面向对象,核心是对象,以对象来思考
- 关于java中继承抽象类和实现接口的区别
简单来说,继承就是“是不是”,实现就是“有没有”.(一个大神说的,我觉得很生动很形象 海子大神链接http://www.cnblogs.com/dolphin0520/p/3811437.html)
- JVM —— Java 对象占用空间大小计算
零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 须要知道缓存的对象是否会超过 JVM 最大堆限制, 假设会超 ...
- java对象clone
java克隆 为什么需要克隆 我们在很多时候需要使用一个对象去记录另外一个对象的当前状态,对象中可能会有很多属性,如果我们一个一个去设置,不仅不方便,而且效率很低,我们看一个初学者可能遇到的问题 cl ...
随机推荐
- 不要滥用SharedPreference
SharedPreference是Android上一种非常易用的轻量级存储方式,由于其API及其友好,得到了很多很多开发者的青睐.但是,SharedPreference并不是万能的,如果把它用在不合适 ...
- Python + Selenium 基础篇 - 打开和关闭浏览器
1.首先要下载浏览器对应的driver,并放到你的python安装目录 Chrome浏览器(chromedriver): http://npm.taobao.org/mirrors/chromedri ...
- (转)iptables简介
iptables简介 原文:https://www.cnblogs.com/metoy/p/4320813.html netfilter/iptables(简称为iptables)组成Linux平台下 ...
- @enable跟@import注解
参考文章: 讲@import的相关内容:https://blog.csdn.net/u012437781/article/details/78626134 讲为什么registrar没有注入:http ...
- 计算机为什么要区别C盘,D盘,E盘等?
为什么要区分C盘,D盘,E盘,F盘? 1)各盘出现背景 在计算机刚诞生的年代,还没有硬盘,那时数据存储主要靠软盘.软盘驱动器按照顺序占据了A和B盘符的位置,后来随着硬盘的应用,就出现了C盘及以后的 ...
- linux下Python2.7编译安装PyQt5
---作者吴疆,未经允许,严禁转载,违权必究--- ---欢迎指正,需要源码和文件可站内私信联系--- -----------点击此处链接至博客园原文----------- 功能说明:在ubuntu系 ...
- .NET开发人员必知的八个网站
当前全球有数百万的开发人员在使用微软的.NET技术.如果你是其中之一,或者想要成为其中之一的话,我下面将要列出的每一个站点都应该是你的最爱,都应该收藏到书签中去.对于不熟悉.NET技术的朋友,需要说明 ...
- 定时备份oracle数据库脚本文件
@echo off REM ########################################################### REM # Windows Server 2003下 ...
- ArcGIS for Service中JavaScript预览在内网环境无法使用
1.问题说明 在使用ArcGIS for Service时经常会遇到一个问题,那就是我们需要对已经发布的服务进行预览,预览时点击对应服务,选择View in中的ArcGIS JavaScript就可在 ...
- 责任链模式(ChainOfResponsibiliby、Filter)
Request 类: package com.demo; public class Request { private String requestStr; public String getRequ ...