java 内部类的修饰符_java基础之修饰符和内部类

1、java修饰符

/*

修饰符:

权限修饰符:private,默认的,protected,public

状态修饰符:static,final

抽象修饰符:abstract

类:

权限修饰符:默认修饰符,public

状态修饰符:final

抽象修饰符:abstract

用的最多的就是:public

成员变量:

权限修饰符:private,默认的,protected,public

状态修饰符:static,final

用的最多的就是:private

构造方法:

权限修饰符:private,默认的,protected,public

用的最多的就是:public

成员方法:

权限修饰符:private,默认的,protected,public

状态修饰符:static,final

抽象修饰符:abstract

用的最多的就是:public

除此以外的组合规则:

成员变量:public static final

成员方法:public static

public abstract

public final

a8ea201f6d25834b210dccb126aa377c.png

public class Demo {

//成员变量

private int x = 10;

int y = 20;

protected int z = 30;

public int a = 40;

public final int b = 50;

public static int c = 60;

public static final int d = 70;

//此处不允许使用修饰符abstract

//abstract int e = 80;

//构造方法

private Demo(){}

Demo(String name){}

protected Demo(String name,int age) {}

public Demo(String name,int age,String address) {}

//此处不允许使用修饰符static

//public static Demo(){}

//此处不允许使用修饰符final

//public final Demo() {}

//此处不允许使用修饰符abstract

//public abstract Demo(){}

//成员方法

//static void show() {}

//abstract void show();

//final void show(){}

}

/*

权限修饰符:

本类 同一个包下(子类和无关类) 不同包下(子类) 不同包下(无关类)

private Y

默认 Y Y

protected Y Y Y

public Y Y Y Y

*/

package com.liuyi;

public class Father {

private void show() {

System.out.println("show");

}

void show2() {

System.out.println("show2");

}

protected void show3() {

System.out.println("show3");

}

public void show4() {

System.out.println("show4");

}

public static void main(String[] args) {

Father f = new Father();

f.show();

f.show2();

f.show3();

f.show4();

}

}

package com.liuyi;

public class Son extends Father {

public static void main(String[] args) {

Father f = new Father();

//f.show();

f.show2();

f.show3();

f.show4();

System.out.println("--------------");

Son s = new Son();

//s.show();

s.show2();

s.show3();

s.show4();

}

}

package cn.qx;

import com.liuyi.Father;

public class Son2 extends Father {

public static void main(String[] args) {

Father f = new Father();

//f.show();

//f.show2();

//f.show3();

f.show4();

System.out.println("--------------");

Son2 s = new Son2();

//s.show();

//s.show2();

s.show3();

s.show4();

}

}

package com.liuyi;

public class Test {

public static void main(String[] args) {

Father f = new Father();

//f.show();

f.show2();

f.show3();

f.show4();

}

}

package cn.qx;

import com.liuyi.Father;

class Test2 {

public static void main(String[] args) {

Father f = new Father();

//f.show();

//f.show2();

//f.show3();

f.show4();

}

}

2、内部类

/*

成员内部类的修饰符:

private 为了保证数据的安全性

static 为了方便访问数据

注意:静态内部类访问的外部类数据必须用静态修饰。

案例:我有一个人(人有身体,身体内有心脏。)

class Body {

private class Heart {

public void operator() {

System.out.println("心脏搭桥");

}

}

public void method() {

if(如果你是外科医生) {

Heart h = new Heart();

h.operator();

}

}

}

按照我们刚才的讲解,来使用一下

Body.Heart bh = new Body().new Heart();

bh.operator();

//加了private后,就不能被访问了,那么,怎么玩呢?

Body b = new Body();

b.method();

*/

class Outer {

private int num = 10;

private static int num2 = 100;

//内部类用静态修饰是因为内部类可以看出是外部类的成员

public static class Inner {

public void show() {

//System.out.println(num);

System.out.println(num2);

}

public static void show2() {

//System.out.println(num);

System.out.println(num2);

}

}

}

class InnerClassDemo4 {

public static void main(String[] args) {

//使用内部类

// 限定的新静态类

//Outer.Inner oi = new Outer().new Inner();

//oi.show();

//oi.show2();

//成员内部类被静态修饰后的访问方式是:

//格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();

Outer.Inner oi = new Outer.Inner();

oi.show();

oi.show2();

//show2()的另一种调用方式

Outer.Inner.show2();

}

}

/*

成员内部类:

如何直接访问内部类的成员。

外部类名.内部类名 对象名 = 外部类对象.内部类对象;

*/

class Outer {

private int num = 10;

class Inner {

public void show() {

System.out.println(num);

}

}

}

class InnerClassDemo3 {

public static void main(String[] args) {

//需求:我要访问Inner类的show()方法

//Inner i = new Inner();

//i.show();

//格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;

Outer.Inner oi = new Outer().new Inner();

oi.show();

}

}

/*

内部类概述:

把类定义在其他类的内部,这个类就被称为内部类。

举例:在类A中定义了一个类B,类B就是内部类。

内部的访问特点:

A:内部类可以直接访问外部类的成员,包括私有。

B:外部类要访问内部类的成员,必须创建对象。

*/

class Outer {

private int num = 10;

class Inner {

public void show() {

System.out.println(num);

}

}

public void method() {

//找不到符号

//show();

Inner i = new Inner();

i.show();

}

}

class InnerClassDemo {

public static void main(String[] args) {

}

}

/*

内部类位置

成员位置:在成员位置定义的类,被称为成员内部类。

局部位置:在局部位置定义的类,被称为局部内部类。

成员位置:在成员位置定义的类,被称为成员内部类。

*/

class Outer {

private int num = 10;

//成员位置

/*

class Inner {

}

*/

public void method() {

//局部位置

class Inner {

}

}

}

class InnerClassDemo2 {

public static void main(String[] args) {

}

}

/*

局部内部类

A:可以直接访问外部类的成员

B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

面试题:

局部内部类访问局部变量的注意事项?

A:局部内部类访问局部变量必须用final修饰

B:为什么呢?

局部变量是随着方法的调用而调用,随着调用完毕而消失。

而堆内存的内容并不会立即消失。所以,我们加final修饰。

加入final修饰后,这个变量就成了常量。既然是常量。你消失了。

我在内存中存储的是数据20,所以,我还是有数据在使用。

*/

class Outer {

private int num = 10;

public void method() {

//int num2 = 20;

//final int num2 = 20;

class Inner {

public void show() {

System.out.println(num);

//从内部类中访问本地变量num2; 需要被声明为最终类型

System.out.println(num2);//20

}

}

//System.out.println(num2);

Inner i = new Inner();

i.show();

}

}

class InnerClassDemo5 {

public static void main(String[] args) {

Outer o = new Outer();

o.method();

}

}

/*

匿名内部类

就是内部类的简化写法。

前提:存在一个类或者接口

这里的类可以是具体类也可以是抽象类。

格式:

new 类名或者接口名(){

重写方法;

}

本质是什么呢?

是一个继承了该类或者实现了该接口的子类匿名对象。

*/

interface Inter {

public abstract void show();

public abstract void show2();

}

class Outer {

public void method() {

//一个方法的时候

/*

new Inter() {

public void show() {

System.out.println("show");

}

}.show();

*/

//二个方法的时候

/*

new Inter() {

public void show() {

System.out.println("show");

}

public void show2() {

System.out.println("show2");

}

}.show();

new Inter() {

public void show() {

System.out.println("show");

}

public void show2() {

System.out.println("show2");

}

}.show2();

*/

//如果我是很多个方法,就很麻烦了

//那么,我们有没有改进的方案呢?

Inter i = new Inter() { //多态

public void show() {

System.out.println("show");

}

public void show2() {

System.out.println("show2");

}

};

i.show();

i.show2();

}

}

class InnerClassDemo6 {

public static void main(String[] args) {

Outer o = new Outer();

o.method();

}

}

/*

面试题:

要求请填空分别输出30,20,10。

注意:

1:内部类和外部类没有继承关系。

2:通过外部类名限定this对象

Outer.this

*/

class Outer {

public int num = 10;

class Inner {

public int num = 20;

public void show() {

int num = 30;

System.out.println(num);

System.out.println(this.num);

//System.out.println(new Outer().num);

System.out.println(Outer.this.num);

}

}

}

class InnerClassTest {

public static void main(String[] args) {

Outer.Inner oi = new Outer().new Inner();

oi.show();

}

}

/*

匿名内部类在开发中的使用

*/

interface Person {

public abstract void study();

}

class PersonDemo {

//接口名作为形式参数

//其实这里需要的不是接口,而是该接口的实现类的对象

public void method(Person p) {

p.study();

}

}

//实现类

class Student implements Person {

public void study() {

System.out.println("好好学习,天天向上");

}

}

class InnerClassTest2 {

public static void main(String[] args) {

//测试

PersonDemo pd = new PersonDemo();

Person p = new Student();

pd.method(p);

System.out.println("--------------------");

//匿名内部类在开发中的使用

//匿名内部类的本质是继承类或者实现了接口的子类匿名对象

pd.method(new Person(){

public void study() {

System.out.println("好好学习,天天向上");

}

});

}

}

/*

匿名内部类面试题:

按照要求,补齐代码

interface Inter { void show(); }

class Outer { //补齐代码 }

class OuterDemo {

public static void main(String[] args) {

Outer.method().show();

}

}

要求在控制台输出”HelloWorld”

*/

interface Inter {

void show();

//public abstract

}

class Outer {

//补齐代码

public static Inter method() {

//子类对象 -- 子类匿名对象

return new Inter() {

public void show() {

System.out.println("HelloWorld");

}

};

}

}

class OuterDemo {

public static void main(String[] args) {

Outer.method().show();

/*

1:Outer.method()可以看出method()应该是Outer中的一个静态方法。

2:Outer.method().show()可以看出method()方法的返回值是一个对象。

又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。

*/

}

}

3、总结

4:权限修饰符(掌握)

(1)权限修饰符

本类 同一个包下 不同包下的子类 不同包下的无关类

private Y

默认 Y Y

protected Y Y Y

public Y Y Y Y

(2)这四种权限修饰符在任意时刻只能出现一种。

public class Demo {}

5:常见的修饰符(理解)

(1)分类:

权限修饰符:private,默认,protected,public

状态修饰符:static,final

抽象修饰符:abstract

(2)常见的类及其组成的修饰

类:

默认,public,final,abstract

常用的:public

成员变量:

private,默认,protected,public,static,final

常用的:private

构造方法:

private,默认,protected,public

常用的:public

成员方法:

private,默认,protected,public,static,final,abstract

常用的:public

(3)另外比较常见的:

public static final int X = 10;

public static void show() {}

public final void show() {}

public abstract void show();

6:内部类(理解)

(1)把类定义在另一个类的内部,该类就被称为内部类。

举例:把类B定义在类A中,类B就被称为内部类。

(2)内部类的访问规则

A:可以直接访问外部类的成员,包括私有

B:外部类要想访问内部类成员,必须创建对象

(3)内部类的分类

A:成员内部类

B:局部内部类

(4)成员内部类

A:private 为了数据的安全性

B:static 为了访问的方便性

成员内部类不是静态的:

外部类名.内部类名 对象名 = new 外部类名.new 内部类名();

成员内部类是静态的:

外部类名.内部类名 对象名 = new 外部类名.内部类名();

(5)成员内部类的面试题(填空)

30,20,10

class Outer {

public int num = 10;

class Inner {

public int num = 20;

public viod show() {

int num = 30;

System.out.println(num);

System.out.println(this.num);

System.out.println(Outer.this.num);

}

}

}

(6)局部内部类

A:局部内部类访问局部变量必须加final修饰。

B:为什么呢?

因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。

所以,堆内存还是用该变量,而改变量已经没有了。

为了让该值还存在,就加final修饰。

通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。

(7)匿名内部类(掌握)

A:是局部内部类的简化形式

B:前提

存在一个类或者接口

C:格式:

new 类名或者接口名() {

重写方法;

}

D:本质:

其实是继承该类或者实现接口的子类匿名对象

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中类的修饰符主要分为两类:访问修饰符和非访问修饰符。 1. 访问修饰符 访问修饰符用于控制类、变量、方法的访问级别,Java中有四种访问修饰符: - public:公共的,可以被任何类访问。 - protected:受保护的,可以被同一包内的类及其子类访问。 - default(即不写任何修饰符):默认的,可以被同一包内的类访问。 - private:私有的,只能被本类访问。 2. 非访问修饰符 非访问修饰符用于定义类、方法或变量的特性,Java中有以下几种非访问修饰符: - final:最终的,用于修饰类、方法、变量,分别表示类不能被继承、方法不能被重写、变量只能被赋值一次。 - abstract:抽象的,用于修饰类、方法,分别表示类不能被实例化、方法只有声明没有实现。 - static:静态的,用于修饰方法、变量,分别表示方法不需要实例化即可调用、变量属于类而不是实例。 - synchronized:同步的,用于修饰方法、代码块,表示在多线程环境下保证方法或代码块的同步性。 - volatile:易失性的,用于修饰变量,表示变量在多线程环境下保证可见性和有序性。 下面是一个示例代码,演示了Java中类的修饰符的使用: ```java public final class MyClass { // 最终类 private static int count; // 静态变量 protected String name; // 受保护的实例变量 int age; // 默认访问修饰符的实例变量 public MyClass(String name, int age) { // 公共的构造方法 this.name = name; this.age = age; } public static void increaseCount() { // 公共的静态方法 count++; } synchronized void printInfo() { // 同步的实例方法 System.out.println("Name: " + name + ", Age: " + age); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值