0125 匿名对象 内部类 包 代码块
1、匿名对象
概念:是指只有创建对象语句,但是没有把对象赋值给某个变量
例:创建一个匿名对象
new Person();
特点:
(1)、创建对象可以直接用,没有变量名
(2)、匿名对象没有指定变量名的时候,只能使用一次
(3)、匿名对象可以作为方法接受参数、方法返回值使用
例:创建一个Person类
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { super(); } }
创建一个测试类
public class Demo01 { public static void main(String[] args) { new Person().getName(); get(new Person()); } public static Person get(Person P){ return new Person(); } }
2、内部类
概念:写在其他类的内部,写在类内部的类叫做内部类,其他的可以叫做外部类。可以写在其他类的成员位置和局部位置,这些局部位置叫局部内部类,成员位置叫成员内部类(其实就是一个正常定义类的过程,包括修饰符继承实现的关系等,在内部类中可以直接访问外部类所有成员)
(1)成员内部类
类似类中的成员变量。
创建格式:
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
访问格式:
外部类.内部类 变量名=new 外部类().new 内部类();
例:创建一个Outer类,内写一个内部类Inner
//外部类 public class Outer { int a=1; //内部类 class Inner{ int a=2; public void in(){ int a=3; System.out.println(a);//3局部变量 System.out.println(this.a);//2内部类变量 System.out.println(Outer.this.a);//1外部类成员变量 } } }
创建一个测试类
public class Demo02 { public static void main(String[] args) { Outer.Inner oi=new Outer().new Inner(); oi.in(); } }
(2)局部内部类
局部内部类定义在类中的方法中的类,类似方法中的局部变量
定义格式:
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
例:创建一个outer类写一个局部内部类
public class Outer { public void out(){ class Inner{ public void in(){ System.out.println("这是内部类方法"); } } Inner i=new Inner(); i.in(); } }
注:上述中的Inner写在了out方法内,所以是个局部内部类,此时只能在这个方法中才能够访问到这个局部内部类,测试时,可以通过创建Outer对象来调用这个out方法 达到访问的目的
3、内部类的实际应用--匿名内部类
概念:定义某一指定类型的子类,定义后即可创建这一子类对象
作用:匿名内部类是创建某个子类对象的快捷方式
格式:
new 父类或接口{
重写的方法
};
例:创建一个接口
public interface Smoking { public abstract void smoke(); }
创建一个测试类,创建这个接口的子类对象,并且调用方法
public class Demo02 { public static void main(String[] args) { new Smoking(){ public void smoke() { System.out.println("学生抽烟"); } }.smoke(); } }
注:既然他是个子类对象,就可以通过.方法名来调用这个方法。
如果这个smoking接口中有两个方法,那我创建子类的时候重写两个方法,怎样实现这两个方法 的调用呢
代码演示
public interface Smoking { public abstract void smoke(); public abstract void drink(); }
注:此刻这个接口中我创建了两个方法
public class Demo02 { public static void main(String[] args) { //多态 Smoking s=new Smoking(){ public void smoke() { System.out.println("学生抽烟"); } public void drink() { System.out.println("学生喝酒"); } }; s.smoke(); s.drink(); } }
注:我创建的是一个子类对象,我将这个子类对象赋值给父类引用的变量名s,(即,父类引用变量,指向子类对象)这就是运动了多态
4、包
概念,包其实就是文件夹,包里存放的是类文件夹
类中包的声明格式:
package 包名.包名.包名;例:package com.orcale.demo02;
包的反问格式
包名.包名...类名 例:java.util.Scanner;
导包格式:
import 包名.包名..类名 例:import java.util.Scanner;
5、访问修饰符
java中右四大访问修饰符:public protected default(这个是默认的不写)private;
public :在同一类中,同一包中(包含子类,无关类),不同包的子类,不同包的无关类 都可以访问到
protected:在同一类中,同一包中(包含子类,无关类),不同包的子类。可以访问
default:这个是不写的修饰符。只能在同一类中,在同一包中(包含子类,无关类)可以访问
private :只能在本类中才能访问
例:创建一个A类
public class A { private int a=1; protected int b=2; int c=3; public int d=4; public void a(){ System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); } }
注:这四种类型,在本类中都可以被访问到
创建一个B类与A在同一个包下,继承A类,再分别访问一下这四个类型
public class B extends A { public void get(){ //System.out.println(a);a是私有权限 只能在本类中访问 System.out.println(b); System.out.println(c); System.out.println(d); } }
注:只有a被private修饰,所以在同一包中(包含子类,无关类)除了私有权限不能被访问外,其他都能访问到
创建一个C类,与A,B 不同包,再来访问一下这四个类型
import com.orcale.demo03.A; public class C extends A { public void get(){ //System.out.println(a);a是私有权限 只能在本类中访问 System.out.println(b); //System.out.println(c);默认权限只能在本包中访问 System.out.println(d); } }
注:首先a有私有权限不能被访问,c是默认的default权限,其不能被不同包访问
创建一个D类与C同包,但与C,A B都没有关系
import com.orcale.demo03.A; public class D { public void get(){ //System.out.println(a);a是私有权限 只能在本类中访问 //System.out.println(new A().b);//受保护权限 //System.out.println(c);默认权限只能在本包中访问 System.out.println(new A().d); } }
注:首先a有私有权限不能被访问,b,是受保护权限,不能被不同包的无关类访问c是默认的default权限,其不能被不同包访问
6、代码块
(1)局部代码块
局部代码块时定义在方法或者语句中的,以{}划定的代码区域,只需要关注作用域不同即可,方法和类都是利用代码块来划分界限的
例:
public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub int a=1; { int b=2; System.out.println(a); System.out.println(b); } System.out.println(a); //访问不到里边的System.out.println(b); } }
注:在大括号外边访问不到大括号内部的b变量
(2)构造代码块
构造代码块定义在类的成员变量位置的代码块
优先于构造方法执行,用于执行所有对象均需要初始化的操作,每创建一个对象就会执行一次构造代码块
例:
public class Person { //构造代码块 { System.out.println("这是构造代码块"); } public Person(){ System.out.println("这是构造方法"); } }
public class Demo02 { public static void main(String[] args) { // TODO Auto-generated method stub Person p=new Person(); Person p2=new Person(); } }
运行结果为:
这是构造代码块
这是构造方法
这是构造代码块
这是构造方法
(3)静态代码块
写在类中成员变量的位置,用static关键字修饰
优先于构造方法试行,当以任意形式使用到该类时使用,无论创建多少个类对象,静态代码块只执行一次
例
public class Person { //构造代码块 { System.out.println("这是构造代码块"); } public Person(){ System.out.println("这是构造方法"); } //静态代码块 优先于构造代码块,以任意形式第一次使用到该类的时候执行 static{ System.out.println("这是静态代码块"); } }
还是上方的测试类运行
这是静态代码块
这是构造代码块
这是构造方法
这是构造代码块
这是构造方法