面向对象之抽象类内部类
Posted scanner小霸王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象之抽象类内部类相关的知识,希望对你有一定的参考价值。
1.抽象类(抽象类的本质还是类)
2抽象类和接口的区别
a)两者都不能直接实例化,对于抽象类:如果抽象类要实例化,那么抽象类定义的变量必须指向一个子类对象,子类需要继承抽象类的所有抽象方法;对于接口,定义的变量要指向一个子类对象,这个子类必须实现了这个接口所有的方法。
b)接口只能方法声明,抽象类可以方法的声明或者实现。
c)抽象类需要被子类继承,接口需要被子类实现
d)抽象类所有抽象方法都需要被实现,如果不能全部实现,子类也需要是抽象类;
e)抽象类里面可以没有抽象方法
f)类中有抽象方法,那么这个类一定是抽象类
g)抽象类方法都要被实现,所以抽象类是不能是静态的static,也不能是私有的private
h)接口可以实现接口,或者继承实现多个接口,而类只能继承一个抽象类。
3.内部类(4种)
a)局部内部类
ii)局部内部类是定义在外部类的局部位置,
可以直接访问外部类的所有成员,包括私有;
ii)不能添加访问修饰符(相当与局部变量),但可以加final修饰符
ii)作用域仅仅在当前方法内或者代码块内
ii)内部类可以直接访问外部类的成员
ii)外部类可以创建内部类的实例,在进行访问进行
//局部内部类
public void OutTest(){
class InClass{
public InClass(){
System.out.println("内部类的构造方法");
}
public void InTest(){
System.out.println("内部类");
}
}
new InClass();
}
b)匿名内部类
ii)本质是类
ii)内部类
ii)没有名字
ii)还是一个对象
ii)不能添加修饰符,因为相当是个局部变量
ii)内部类访问的时候,遵循就近原则,
ii)内部类访问外部类的成员变量
外部类的名字.this.变量
例子:
//匿名内部类
public void niMingTest(){
person p = new person(){
@Override
public void eat() {
System.out.println("person--eat");
System.out.println(OutClass.this.outName);
OutClass outClass = new OutClass();
System.out.println(outClass.outName);
}
};
p.eat();
}
c)成员内部类(相当于类的某个成员)
ii)可以访问类的所有成员
例子:
ii)可以有修饰符
ii)外部类访问内部类
内部类 a = new 内部类(),直接创建对象调用
ii)外部其他类访问成员内部类
第一种:
主方法
public class OutOtherClass {
public static void main(String[] args) {
OutClass outClass = new OutClass();
OutClass.ChengYuanClass chengYuanClass = outClass.new ChengYuanClass();
}
}
第二种方式:
外部类中有访问内部类的方法
d)静态内部类
说明:定义在外部类的成员位置,并且static 修饰
ii)可以直接访问外部的静态成员
ii)外部类访问静态内部类(和成员内部类相同)
(StaticClass 静态内部类,OutClass外部类)
StaticClass staticClass =
new OutClass.StaticClass();
ii)外部其他类访问静态内部类(两种方式)
地位相当于类的成员(静态类不能通过new获取,static修饰的只能加载一次,而new 代表可以多次创建)
静态内部类 vs 成员内部类
1)静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中静态变量、静态方法;但可以通过创建对象来访问
2)静态内部类如果要访问的话,必须要new一个外部类的对象,使用new出来的对象来访问。但是可以直接访问静态的变量、调用静态的方法;
普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。
4枚举
a)构造私有话,目的防止 直接 new
b)去掉setXXX方法,防止被修改
c)在类内部, 直接创建固定对象
d)优化:可以加上 final
e)如果将class 改为enum,上述代码中的
public static final Season SPRING = new Season(“春天”,”温暖“);
改为 SPRING (“春天”,”温暖“);
ii)如果使用enum来实现枚举,要求常量对象要写在前面
ii)如果使用无参构造器,可以直接****,例如
BOY,GIRL都是调用Gender的无参构造器
public enum Season {
BOY,
GIRL("mary");
Season(){
}
String name;
Season(String name){
this.name = name;
}
public void turn(){
System.out.println("季节变化");
}
}
class TestClass{
public static void main(String[] args) {
System.out.println(Season.BOY.name);
Season.BOY.turn();
System.out.println("---");
Season.GIRL.turn();
}
}
5基本的注解说明
6.元注解:修饰注解的注解
以上是关于面向对象之抽象类内部类的主要内容,如果未能解决你的问题,请参考以下文章
JAVA07 面向对象(高级)类变量类方法代码块final抽象类接口内部类
JAVA07 面向对象(高级)类变量类方法代码块final抽象类接口内部类
JAVA07 面向对象(高级)类变量类方法代码块final抽象类接口内部类