Loading

第五章 –– 类的修饰符和内部类

1:形式参数和返回值的问题(理解)

(1)形式参数:

类名:需要该类的对象

抽象类名:需要该类的子类对象

接口名:需要该接口的实现类对象

(2)返回值类型:

类名:返回的是该类的对象

抽象类名:返回的是该类的子类对象

接口名:返回的是该接口的实现类的对象

(3)链式编程

对象.方法1().方法2().......方法n();

这种用法:其实在方法1()调用完毕后,应该一个对象;

      方法2()调用完毕后,应该返回一个对象。

  方法n()调用完毕后,可能是对象,也可以不是对象。

 

2:(理解)

(1)其实就是文件夹

(2)作用:

A:区分同名的类

B:对类进行分类管理

a:按照功能分

b:按照模块分

(3)包的定义(掌握)

package 包名;

多级包用.分开。

(4)注意事项:(掌握)

A:package语句必须在文件中的第一条有效语句

B:在一个java文件中,只能有一个package

C:如果没有package,默认就是无包名

(5)带包的编译和运行

A:手动式

B:自动式(掌握)

javac -d . HelloWorld.java

3:导包(掌握)

(1)我们多次使用一个带包的类,非常的麻烦,这个时候,Java就提供了一个关键字import

(2)格式:

import 包名...类名;

另一种:

import 包名...*;(不建议)

(3)package,import,class的顺序

package > import > class

4:权限修饰符(掌握)

(1)

权限修饰符
本类
同一个包下
不同包下的子类
不同包下的无关类
private
Y


默认
YY

Protected
YYY
public
YYYY

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

public class Demo {}

 

例子:

--------------------------------------------------------------------------------

/*

    修饰符:
        权限修饰符: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

        

*/

//此处不允许使用修饰符private
//此处不允许使用修饰符protected
//此处不允许使用修饰符static
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(){}
}


6:内部类(理解)

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

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

(2)内部类的访问规则

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

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

(3)内部类的分类

A:成员内部类

B:局部内部类

(4)成员内部类的访问方式

A:private 为了数据的安全性

--------------------------------------------------------------------------------

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

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();

--------------------------------------------------------------------------------

 

B:static 为了访问的方便性

--------------------------------------------------------------------------------

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();
    }
}

--------------------------------------------------------------------------------

成员内部类不是静态的:

外部类名.内部类名 对象名 = 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);
			// System.out.println(new Output.num);
		}
	}
}

 

--------------------------------------------------------------------------------

(6)局部内部类  面试题


A:局部内部类访问局部变量必须加final修饰。
 
B:为什么呢?
    因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。所以,堆内存还是用该变量,而改变量已经没有了。
    为了让该值还存在,就加final修饰。
    通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
    局部内部类也是在堆中的, 声明周期长, 所以访问外部变量需要将外部的变量修饰成final 常量

 

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

 

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

B:前提

存在一个类或者接口

C:格式:

new 类名或者接口名() {

重写方法;

}

D:本质:

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

 

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

 

我们在开发的时候,会看到抽象类,或者接口作为参数。

而这个时候,我们知道实际需要的是一个子类对象。

如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。

--------------------------------------------------------------------------------

 

interface Person {
	public abstract void study();
}

class PersonDemo {
	public void method(Person p) {
		p.study();
	}
}

class PersonTest {
	public static void main(String[] args) {
		PersonDemo pd = new PersonDemo();
		pd.method(new Person() {
			public void study() {
				System.out.println("好好学习,天天向上");
			}
		});
	}
}

--------------------------------------------------------------------------------

(9)匿名内部类的面试题(补齐代码)

--------------------------------------------------------------------------------

interface Inter {
	void show();
}

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(); // "HelloWorld"
	}
}

--------------------------------------------------------------------------------

/*

Test类,测试

 

导包:

格式:import 包名;

这种方式导入是到类的名称。

注意:我们用谁就导谁。

面试题:

package,import,class有没有顺序关系?

有。

package > import > class

Package:只能有一个

import:可以有多个

class:可以有多个,以后建议是一个

*/

 

 





posted @ 2018-08-20 21:27  bangiao  阅读(252)  评论(0编辑  收藏  举报