Java学习笔记——面向对象核心技术(三)

在这里插入图片描述

访问控制

Java主要通过访问控制符类包final关键字对类、方法或者变量的访问范围进行控制。

访问控制符
在这里插入图片描述

注意:Java语言中,类的权限设定会约束类成员约束的权限

使用访问控制符时,需要遵循以下原则:

1) 大部分顶级类都使用public修饰符

2) 如果某个类主要用作其他类的父类,该类中包含的大部分方法只是希望被其子类重写,而不想被外界直接调用,则应该使用protected修饰

3) 类中绝大部分属性都应该使用private修饰,除非一些static或者类似全局变量的属性,才考虑使用public修饰

4) 当定义的方法只是用于辅助实现该类的其他方法(即工具方法)时,应该使用private修饰

5) 希望允许其他类自由调用的方法应该使用public修饰符

final关键字

final关键字表示“最后的”,被final修饰的类、方法和变量不能被改变

1) final类
被final修饰的类不能被继承
若希望一个类不允许被任何类继承,并且不允许其他人对这个类进行任何的改动,可以将这个类设置为final类
语法:final class 类名{}
当把某个类设置为final类时,类中所有方法都被隐式设置为final形式,但是final类中成员变量既可以被定义为final形式,也可以定义为非final形式

2) final方法
被final修饰的方法不能被重写
将方法定义为final类型可以防止子类修改该方法的定义与实现方式,同时final方法的执行效率要高于非final方法。在访问控制符private实际上就是隐式被指定为final。

3) final变量
final修饰的变量不能再修改变量值。通常将final修饰的变量称为常量。所有在final修饰变量时,必须在声明时对其进行赋值操作。final除了可以修饰基本数据类型常量还可以修饰对象引用,同理,对象一旦被final修饰,它就恒定指向一个对象。一个既是static又是final的字段占据了一段不能改变的存储空间。

例:

package way_of_Class_practice;
public class FinalData { //常量测试类
    final int value1=9; //声明一个常量
    static final int VALUE2 =10; //声明一个静态常量
    final Test obj = new Test();
    public static void main(String[] args)
    {
    	//创建常量测试类对象
        FinalData f = new FinalData(); 
        //编译器报错,因为常量不可以重新赋值
        f.value1=1; 
        //编译报错,因为静态常量可以直接用类名调用,且不可重新赋值
        FinalData.VALUE2 = 1;
        //编译报错,因为常量对象不可以重新赋值
        f.obj=new Test();
        // 常量对象属性可以重新赋值
        f.obj.i=1;
    }
}

内部类

成员内部类
除成员变量、方法和构造器可以作为类的成员外,成员内部类也可作为类的成员。
语法:

public class OuterClass{  //外部类
         private class InnerClass{//内部类
	 //….
  }
}

内部类对象的创建:

OutClass.InnerClass innerclass = OutClass.new InnerClass();

例:

package way_of_Class_practice;
public class Class {
    int num;
    public Class(int num) {
        this.num = num;
    }
    public class Teacher {
        int count; 
        public Teacher(int count) {
            this.count = count;
        } 
        public void show() {
            System.out.println(num + "班有教师" + count + "名");
        }
    } 
    public class Student {
        int count; 
        public Student(int count) {
            this.count = count;
        } 
        public void show() {
            System.out.println(num + "班有学生" + count + "名");
        }
    } 
    public static void main(String[] args) {
    Class c = new Class(123);
        Class.Teacher teacher = c.new Teacher(10);
        teacher.show();
        Class.Student student = c.new Student(60);
        student.show(); 
    }
}

匿名内部类

匿名内部类只需使用一次,即匿名内
部类不能被重复使用,也就是创建匿名内部类的实例后,这个匿名内部类立即消失。匿名类的所有实现代码都需要在大括号之间进行编码。
语法:

new A(){

…//匿名内部类实体

};

其中,A指代的是接口名或抽象类的类名
使用匿名内部类应遵循以下原则:

1) 匿名类没有构造方法

2) 匿名类不能定义静态的成员

3) 匿名内不能用private、public、protected、static、final、abstract等修饰

4) 只可以创建一个匿名类实例

例:

   package way_of_Class_practice;
    public class Fire {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new FireWorks() { // 创建匿名内部Firework的对象
               void boom() { // 重写boom方法
                    System.out.println("嘭,爆竹燃放");
                }
            }.boom();// 匿名内部类Firework的对象调用重写抽象的包装方法
        }
    }
发布了62 篇原创文章 · 获赞 42 · 访问量 3327

猜你喜欢

转载自blog.csdn.net/weixin_45375866/article/details/100364430
今日推荐