Java——static、final、内部类

6 篇文章 0 订阅

Static

其实知识点就那么些
但是涉及类加载、初始化、变量的
具体见PPT,不再总结
static修饰内容有 :
属性、方法、初始化块、内部类

与static 相关的设计模式 单例设计模式

final修饰符

final修饰的变量

final修饰的变量就是不可变的量(并不等于常量)
final修饰的变量值不可以改变,如果修饰的简单变量(int 、double),那么就是常量
final修饰的属性不一定是常量 ,只是final不可二次赋值而已
final修饰的对象引用,将固定指向该对象,不可改变,但是该对象的内容可变 。
被修饰的是引用,引用不可变,但是对象可变。

p a=new p("a");
final p b=new p("b");
b.num++;         //可以改变对象的内容
b=a;        //此处会报错

一般常量要搭配 static final
static final
影响类加载机制:如果常量值在编译的时候就可以确定的话,访问时不会引起类加载。
直接在编译时给出了 。

final修饰方法

final方法可以被子类继承使用
但是无法被覆盖(覆盖意味着修改)

另外非final的方法,子类要覆盖父类的方法的话,访问权限要比父类宽,不能更严格

final修饰类

类就成为了不可继承类,拒绝了继承
类内部方法都是final方法,但是属性不是,final类的属性没有加final的话还是正常属性

 final class p
 {
  int age=1;
 }
 
 .....main(String []args)
 {
 p ap=new p();
 ap.age++;                 //是没问题的
 }
注意特殊的final类String

String的+连接运算符;
每次的连接都不会销毁原本的值,而是保留原本的,新建一个空间分配给新的串
如果连接符太多,造成内存浪费
建议在连接操作比较多的地方用StringBuffer类

abstract

修饰范围:方法、类
抽象类、抽象方法
两者之间的必然联系是:抽象方法所在的类必须是抽象类
抽象方法就是没有实现的、等待子类具体实现的。

抽象类不能有对象、也就是不能new一个抽象类的对象
但是抽象类的静态方法一样是可以使用的

static不与abstract
final不与abstract
private不与abstract

接口

实际上接口就是特殊的抽象类
接口中所有属性是公有静态变量
接口所有方法为公有方法
接口没有构造器
接口中可以声明方法(实现接口就必须实现方法 )

(关键字interface、implements)
接口和抽象方法是实现多态的一种重要方式
关于接口,明天挑时间再多说一点

内部类

定义在某个类或者方法内部(局部内部类)
分为:
成员内部类(分static和非static)
局部内部类
匿名内部类

内部类能够使用外部类的所有属性和方法
本身就是外部类的一个成员
注意通过外部类对象实例化内部类

class out
{
    int num=0;
    
    class inner
    {
    int innernum=1;
    }
 }
 
 public class
 { .....main(String []args)
 {
        out o=new out();
        out.inner i=o.new inner();          //必须拿着外部类的实例进行初始化内部类
        
 }
  }

内部类要使用外部类属性时要用上外部类的类名

class out
{
   int num=0;
   
   class inner
   {
   int innernum=1;
   void getOutNum()
   {
   return out.num;   //要访问外部类时,必须这么做
   }
   
   }
}

public class
{ .....main(String []args)
{
       out o=new out();
       out.inner i=o.new inner();          //必须拿着外部类的实例进行初始化内部类
       
}
 }

成员内部类

1.可以是final类
2.可以是static类,但是此时就不能使用外部类的非static数据
3.可以是abstract类,由其他内部类继承实现
4.内部类可以访问外部类的所有数据,使用 外部类名.成员名
5.内部类的初始化必须拿着外部类的实例初始化
静态内部类直接使用外部类名.内部类初始化

//设out是外部类 ,inner是static内部类  ,pin是一般内部类
  out t=new out();
  pin p=t.new pin();       //非static内部类初始化
  out.inner i=new out.inner();      //static内部类初始化

局部内部类

放在方法内部的内部类,可以使用方法的局部变量
ppt没讲到,简单提一下
它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内
另外 局部内部类就是一个局部变量一样,是不可以有访问权限修饰符的

匿名内部类

在Java8之前,没有lambda表达式的时候
Java通过匿名内部类实现各种接口监听
是用的最多的一个功能
eg :ActionListener

scan_bt.setOnClickListener(  
     new OnClickListener() {       //这里是一个经典的匿名内部类,只是用一次,没有名字
             
            @Override
            public void onClick(View v) {      //匿名内部类声明自己实现了OnClickListener接口 ,故要实现接口内容
                // TODO Auto-generated method stub
                 
            }
        }
        );                       //上面一大串不够简洁,只是一句话,后来有了lambda取代了
         
        history_bt.setOnClickListener(new OnClickListener() {
             
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 
            }
        }
        );
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值