面向对象4(匿名对象、内部类、包、修饰符、代码块)

1.匿名对象

指在创建对象的时候,只有创建语句,没将对象地址赋值给某个变量

new Person();

1.1 特点

1、创建时,可直接使用,没有变量名

new Person().eat();

2、匿名对象在未指定其引用变量时,只可使用一次

new Person().eat();

new Person().eat();

再次调用eat(),需重新创建一个Person对象。

3、可作为方法接收的参数,方法返回值使用

return new Person();

Demo.method(new Person());

1.2 应用场景

1、方法只调用一次时;

2、作为参数进行传递时(无法在传参之前进行赋值等操作)。

2. 内部类

可写在其他类(外部类)的成员位置和局部位置。

内部类可访问外部类的成员,包括私有成员。

2.1 成员内部类

定义在外部类的成员位置,可用修饰类成员的修饰符修饰。

  • 若用private,则无法再其他类中被访问
  • 其余限定修饰符都可以。
  • 若由static修饰
    • 可用外部类名直接创建内部类的对象
    • 外部类名.内部类名  变量名=new  外部类名.内部类名();
    • 外部类名.内部类名.方法名();(前提是内部类的此方法也用static修饰)
  • abstract final也可修饰,不多用

可通过外部类的对象进行访问。

class 外部类{

       修饰符   class   内部类{

      }

}

内部类无法被别的类看到,访问时需用全名。

访问:

外部类名.内部类名   变量名=new 外部类名.new 内部类()

要调用内部类的成员,需先创建外部类的对象,再用  .  调用。

 

 

2.2 局部内部类

定义在外部类方法中的局部位置

可通过调用方法进行访问

class   外部类{

      修饰符   返回值   方法名(参数){

                class  内部类{

                }

       }

}

局部内部类在声明之后才可访问。

访问:

在外部类的方法中,创建内部类对象,进行访问:

public class Party{
	public void puffBall() {
		class Ball{
			public void puff() {
				System.out.println("气球涨了");
			}
		}
		new Ball().puff();
	}
	public static void main(String[] args) {
		Party p=new Party();
		p.puffBall();
	}
}

运行结果:

2.3匿名内部类

无名字的局部内部类,是局部内部类的一种。

意义:

临时兴义某一指定类型的子类;

定以后即刻创建此类的对象

作用:

1、是创建某个类子类对象的快捷方式

new 父类或接口(){
          //方法重写(子类 或者接口的实现类)
};

public abstract class Person{
	public abstract void eat(); 
}

Person p=new Person() {
	public void eat() {
		System.out.println("吃饭了");
	}
};
p.eat();

2、匿名内部类的对象,赋值给它的父类(向上转型)

使用匿名对象,将定义子类与创建子类对象两个步骤有一个格式一次性完成。

匿名内部类若不定义变量引用,则也是匿名对象

new Person() {
	public void eat() {
		System.out.println("吃饭了");
	}
}.eat();

2.4 总结

内部类让然是一个独立的类,编译后会被编译成独立的.class文件,但前面会加上外部类的类名和$符号。

内部类不能用普通的方式访问,它是外部类的一个成员,它可自由访问外部类的任何成员。

成员内部类可以以导入形式访问:import  ...外部类名.内部类名。或外部类名.内部类名。

3. 包

宗旨:把.java文件(java源文件)、.class文件(编译后的文件)以及其他resource文件(例如,.xml文件,.avi文件、.mp3文件、.txt文件等)有条理地进行一个组织,以供使用。

两个作用:

  1. 提供多层命名空间,解决命名冲突;
  2. 对类按功能进行分类,是项目的组织更清晰。

项目的分工也是以包为边界

类中声明的包必须与实际的class文件所在的文件夹情况相一致,否则程序运行时会找不到类

包名全部采用小写,多层包之间用 . 连接

类中包的声明格式为:package  包名.包名...包名;

声明包的句子必须放在有效代码的第一行

在访问类的时候,为了能够找到该类,必须使用含有包名的类全名(包名.类名):java.util.Scanner;

若在java.lang包中,可省略包名

同一个包下,访问时可省略包名

不同包,只可访问public修饰的类

导入包:import 包名.类名;

*:代表的是通配符,import java.util.*代表导入util下的所有类,但是未导入util子包中的类

不同包之间的类相互访问:

  • 使用类的全名
  • 使用关键字import导入包

4. 修饰符

4.1 哪些修饰符可修饰哪些部分

是否可修饰成员变量成员方法构造方法
public
default
protected无意义
private别类不可用,无意义√(不可创建象)
abstract√(无方法体)要初始化对象
static(成员)  创建对象时调用,不用类名调用
final√(不可被继承)√(常量)√(不可重写) 

常见规则:

  • 用public 修饰类
  • 用private修饰成员变量,有get、set方法
  • 用public 修饰方法
  • 用public修饰构造方法(单例模式的构造方法为私有)

4.2 访问修饰符

 同一类中同一包中(子类与无关类)不同包的子类不同包中的无关类
public
protected 
default  
private   
  • 仅在本类中访问,用private
  • 本包中的类,default
  • 本包中的类和其他包中的子类,protected
  • 所有包中的所有类,public

若类用public修饰,则类名必须与文件名相同。

一个文件中只能有一个用public修饰的类。

可以对类或类中的成员(字段以及方法) 加上访问修饰符。

  • 类可见表示其它类可以用这个类创建实例对象。
  • 成员可见表示其它类可以用这个类的实例对象访问到该成员;

如果子类的方法重写了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。

  • 这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里氏替换原则。 

5. 代码块

局部代码块定义在方法或语句中

只需关注作用域

5.1 构造代码块

定义在类中成员位置

特点:

1、优先于构造方法执行

构造代码块用于执行所有度一向均需要的初始化动作

2、每创建一个对象均会执行一次构造代码块

5.2 静态代码块

定义在成员位置,使用static修饰的

特点:

1、优先于主方法执行

优先于构造代码块执行

当以任意形式第一次执行该类的时候执行

2、该类不管创建爱你多少个对象,静态代码块只执行一次

3、可用于给静态变量赋值,用来给类进行初始化、

5.3 类

用到时再加载

加载时,会执行静态代码块(一次)

再执行main()方法

再在构建对象new时,执行构造代码块以及构造方法

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值