成员内部类共享外部类的所有[静态+非静态]成员[属性+方法]
如何创建对象呢?
Outer.Inner in = new Outer().new Inner();
#:成员内部类与外部类的关系 就像蛔虫与牛的关系
*:相当于孙悟空变成苍蝇飞到妖怪的肚子里,妖怪的心肝脾肺肾都能被孙悟空访问到,妖怪就是外部类,孙悟空相当于内部类
------
public class Test01 {
public static void main(String[] args){
Outer.Inner in = new Outer().new Inner();
in.test();
/*
10
20
30
Outer类的show()方法
*/
}
}
class Outer{
int a = 10;
static int b = 20;
public void show(){
System.out.println("Outer类的show()方法");
}
class Inner{
int c = 30;
public void test(){
System.out.println(a);
System.out.println(b);
System.out.println(c);
show();
}
}
}
------
静态内部类
静态内部类共享外部类的静态成员
如何创建对象?
Outer.Inner in = new Outer.Inner();
#:静态内部类与外部类的关系,就像CPU与电脑
#:静态内部类只能访问外部类的静态成员,但这不是目的,因为其他类都可以
通过类名.访问外部类的静态成员。静态内部类不是用来共享数据的,而是表示内部类与
外部类有特定关系的,比如电脑与CPU
------
public class Test02 {
public static void main(String[] args){
Outer.Inner in = new Outer.Inner();
in.test();
}
}
class Outer{
int a = 3;
static int b = 9 ;
static class Inner{
int x = 7;
static int y = 9;
public void test(){
System.out.println(a);//无法从静态上下文中引用非静态 变量 a
System.out.println(b);//true
System.out.println(x);//true
System.out.println(y);//true
}
}
}
------
局部内部类:
局部内部类共享外部类的成员取决于所在方法是不是静态修饰
如果不是静态,则能够共享所有成员
如果是静态,则只能共享静态成员
另外还能访问其所在方法中final修饰的局部变量
*:JDK8开始可以不加final,但是也必须是最终变量(不能修改)
如何创建对象呢?
Inner in = new Inner();
*:注意必须在定义完成后,所在方法结束前![局部]
*:注意局部内部类及局部变量都不能用static修饰
static为什么不能修饰局部变量?
static修饰的变量要求当类第一次被加载的时候 内存空间里面就要有他
但是局部变量是当所在的方法调用的时候 内存空间才会有这个变量
类的加载永远再前面 方法的调用永远再后面 着两个时间点
赶不上一起 于是static不能修饰局部变量
------
public class Test03 {
public static void main(String[] args){
Outer out = new Outer();
out.show(30);
}
}
class Outer{
int a = 10;
static int b = 20;
public void show(int c){
static int d = 40;
class Inner{
int x = 50;
public void test(){
System.out.println(a);//10
System.out.println(b);//20
System.out.println(c);//30
System.out.println(d);//40
System.out.println(x);//50
}
}
Inner in = new Inner();
in.test();
}
}
------
public class Test03 {
public static void main(String[] args){
Outer out = new Outer();
out.show(30);
}
}
class Outer{
int a = 10;
static int b = 20;
public static void show(int c){
int d = 40;
class Inner{
int x = 50;
public void test(){
System.out.println(a);//无法从静态上下文中引用非静态 变量 a
System.out.println(b);//20
System.out.println(c);//30
System.out.println(d);//40
System.out.println(x);//50
}
}
Inner in = new Inner();
in.test();
}
}
------
匿名内部类:
*:假如我们生个孩子就是为了卖钱的,事实上就不用给孩子起名字了
*:在某些时候我们去找父母的朋友办事,此时我们的名字根本就不重要,人家只关心你父母是谁,
你叫什么名字并没有谁在意(匿名内部类当成参数传递)
如何创建匿名内部类对象?
父类类型 对象名字 = new 父类/接口(可能会传参){
完成方法实现或者方法覆盖;
};
匿名内部类能够共享什么取决于定义它的位置,它能够等价于上述三种的任何一种~
------
public class Test04 {
public static void main(String[] args){
Set<Integer> set = new TreeSet<>(new Comparator<Integer>(){
@Override
public int compare(Integer i1,Integer i2){
return i1 - i2;
}
});
Collections.addAll(set,44,33,66,77,55);
System.out.println(set);//[33, 44, 55, 66, 77]
}
}
/*class QQB implements Comparator<Integer>{
@Override
public int compare(Integer i1 , Integer i2){
return i1 = i2;
}
}*/
------
public class Test05 {
public static void main(String[] args){
Teacher tea = new Teacher();
tea.eat();//老师吃食物
Person stu = new Person("陈浩南",20){
@Override
public void eat(){
System.out.println("学生吃扇贝");
}
};
stu.eat();//学生吃扇贝
}
}
abstract class Person{
String name;
int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public abstract void eat();
}
class Teacher extends Person{
public Teacher(){
super("孔子",2000);
}
@Override
public void eat(){
System.out.println("老师吃食物");
}
}
------
共享数据的三种方法:
1.多个类共享一个类的静态成员,即使用静态变量完成数据的共享~
------
public class Test06 {
public static void main(String[] args){
吕布 lxb = new 吕布();
董卓 dxz = new 董卓();
lxb.play();//吕小布play貂蝉
dxz.play();//董小卓play貂蝉
}
}
class 漱芳斋{
static Object 貂蝉 = new Object(){
@Override
public String toString(){
return "貂蝉";
}
};
}
class 吕布{
public void play(){
System.out.println("吕小布play"+漱芳斋.貂蝉);
}
}
class 董卓{
public void play(){
System.out.println("董小卓paly"+漱芳斋.貂蝉);
}
}
------
2.使用参数传递完成共享
------
public class Test07 {
public static void main(String[] args){
Object 貂蝉 = new Object(){
@Override
public String toString(){
return "貂蝉";
}
};
吕布 lxb = new 吕布(貂蝉);
董卓 dxz = new 董卓(貂蝉);
lxb.play();//吕小布play貂蝉
dxz.play();//董小卓play貂蝉
}
}
class 吕布{
Object obj;
public 吕布(Object obj){
this.obj = obj;
}
public void play(){
System.out.println("吕小布play"+obj);
}
}
class 董卓{
Object obj;
public 董卓(Object obj){
this.obj = obj;
}
public void play(){
System.out.println("董小卓play" + obj);
}
}
-----
3.使用内部类完成数据共享
-----
public class Test08 {
public static void main(String[] args){
漱芳斋 sfz = new 漱芳斋();
漱芳斋.吕布 lxb = sfz.new 吕布();
漱芳斋.董卓 dxz = sfz.new 董卓();
lxb.play();//吕小布play貂蝉
dxz.play();//董小卓play貂蝉
}
}
class 漱芳斋{
Object 貂蝉 = new Object(){
@Override
public String toString(){
return "貂蝉";
}
};
class 吕布{
public void play(){
System.out.println("吕小布play"+貂蝉);
}
}
class 董卓{
public void play(){
System.out.println("董小卓play"+貂蝉);
}
}
}
-----
注意:传参完成赋值的职业选手是setter方法,而不是构造方法
-----
public class Test09 {
public static void main(String[] args){
Teacher t = new Teacher(?);
Student s = new Student(?);//这里怎么传参初始化,此时就需要用setter来完成赋值
}
}
class Student{
Teacher tea;
public Student(Teacher tea){
this.tea = tea;
}
}
class Teacher{
Student stu;
public Teacher(Student stu){
this.stu = stu;
}
}
-----
public class Test09 {
public static void main(String[] args){
Student s = new Student();
Teacher t = new Teacher();
s.setTea(t);
t.setStu(s);
}
}
class Student{
Teacher tea;
public void setTea(Teacher tea){
this.tea = tea;
}
}
class Teacher{
Student stu;
public void setStu(Student stu){
this.stu = stu;
}
}
-----