java面向对象super,final,static,匿名对象,内部类学习


1、super();

//调用本类中的构造方法
this(实参列表);
//调用父类中的空参数构造方法
super();
//调用父类中的有参数构造方法
super(实参列表);

①构造方法默认第一行都是super();
②默认的隐式super()语句在父类中没有对应的构造方法,必须在构造方法中通过this或者super明确要调用的构造方法。
③第一行写了this调用了本类其他构造方法,super调用父类的语句就没有了。

2.final(太监类)

可以修饰类,类的成员,以及局部变量,不能修饰构造方法
特点:
①final修饰类不能被继承,但是可以继承其他类

class Yy {}
final class Fu extends Yy{} //可以继承Yy类
class Zi extends Fu{} //不能继承Fu类

②final修饰的方法不能被子类重写,但父类中没有被final修饰方法,子类重写后可以加final

class Fu {    
    // final修饰的方法,不可以被覆盖,但可以继承使用
    public final void method1(){}
    public void method2(){}
}
class Zi extends Fu {
    //重写method2方法
    public final void method2(){}
}

③final修饰的变量称为常量,只能赋值一次

final int i = 20;
i = 30; //赋值报错,final修饰的变量只能赋值一次

④引用类型的变量值为对象地址值不能更改,地址内的对象属性值可以修改

final Person p = new Person();
Person p2 = new Person();
p = p2; //final修饰的变量p,所记录的地址值不能改变
p.name = "小明";//可以更改p对象中name属性值

⑤修饰成员变量,需要在创建对象前赋值

class Demo {
    //直接赋值
    final int m = 100;
    
    //final修饰的成员变量,需要在创建对象前赋值,否则报错。
    final int n; 
    public Demo(){
        //可以在创建对象时所调用的构造方法中,为变量n赋值
        n = 2016;
    }
}

3.static 静态修饰符
特点:
①被static修饰的成员变量属于类

class Demo {
    public static int num = 100;
}

class Test {
    public static void main(String[] args) {
        Demo d1 = new Demo();
        Demo d2 = new Demo();
        d1.num = 200;
        System.out.println(d1.num); //结果为200
        System.out.println(d2.num); //结果为200
    }
}

②被static修饰的成员可以通过类名直接访问(建议这么做 类名.静态成员变量名;类名.静态成员方法名(参数))

class Demo {
    //静态成员变量
    public static int num = 100;
    //静态方法
    public static void method(){
        System.out.println("静态方法");
    }
}
class Test {
    public static void main(String[] args) {
        System.out.println(Demo.num);
        Demo.method();
    }
}

注意事项:
①静态内容优先于对象存在,只能访问静态,不能使用this和super。静态修饰的内容存于静态区。

class Demo {
    //成员变量
    public int num = 100;
    //静态方法
    public static void method(){
        //this.num; 不能使用this/super。
        System.out.println(this.num);
    }
}

②同一个类中,静态成员只能访问静态成员。

class Demo {
    //成员变量
    public int num = 100;
    //静态成员变量
    public static int count = 200;
    //静态方法
    public static void method(){
        //System.out.println(num); 静态方法中,只能访问静态成员变量或静态成员方法
        System.out.println(count);
    }
}

③main方法为静态方法为程序执行入口,不属于任何一个对象,可以定义在任意类中
④多态调用方法,编译看等号左边。静态方法,运行父类中的静态方法,非静态方法,运行子类的重写方法。成员变量,编译运行全是父类


定义静态常量:public static final 数据类型 变量名 = 值; 变量名用全部大写,多个单词使用下划线连接
接口中的每个成员变量都默认使用public static final修饰,必须显示赋值。可以直接用接口名访问

interface Inter {
    public static final int COUNT = 100;
}
//访问接口中的静态变量
Inter.COUNT

4.匿名对象

创建对象时,只有创建对象的语句,例如:new Person();

new Person();

特点:
①创建匿名对象直接使用,没有变量名

new Person().eat()  //eat方法被一个没有名字的Person对象调用了。

②匿名对象在没有指定其引用变量时,只能使用一次

new Person().eat(); //创建一个匿名对象,调用eat方法
new Person().eat(); //想再次调用eat方法,重新创建了一个匿名对象

③匿名对象可以作为方法接收的参数、方法返回值使用

class Demo {
    public static Person getPerson(){
        //普通方式
        //Person p = new Person();    
        //return p;
        
        //匿名对象作为方法返回值
        return new Person(); 
    }
    
    public static void method(Person p){}
}

class Test {
    public static void main(String[] args) {
        //调用getPerson方法,得到一个Person对象
        Person person = Demo.getPerson();
        
        //调用method方法
        Demo.method(person);
        //匿名对象作为方法接收的参数
        Demo.method(new Person());
    }
}

5.内部类
在内部类中可以直接访问外部类的所有成员
①成员内部类(定义在外部类中的成员位置):外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

class Body {//外部类,身体
    private boolean life= true; //生命状态
    public class Heart { //内部类,心脏
     public void jump() {
         System.out.println("心脏噗通噗通的跳")
            System.out.println("生命状态" + life);
      }
   }
}
//访问内部类
public static void main(String[] args) {
    //创建内部类对象
    Body.Heart bh = new Body().new Heart();
    //调用内部类中的方法
    bh.jump();
}

②局部内部类(定义在外部类方法中的局部位置):在外部类方法中,创建内部类对象,进行访问

class Party {//外部类,聚会
    public void puffBall(){// 吹气球方法
        class Ball {// 内部类,气球
              public void puff(){
     System.out.println("气球膨胀了");
}
}
//创建内部类对象,调用puff方法
new Ball().puff();
}
}
//访问内部类
public static void main(String[] args) {
    //创建外部类对象
    Party p = new Party();
    //调用外部类中的puffBall方法
    p.puffBall();
}

猜你喜欢

转载自www.cnblogs.com/akiyama/p/10059308.html