举例:
学生:增加,删除,修改,查询
老师:增加,删除,修改,查询
…
方案1:按照功能分
com.heima.add
AddStudent
AddTeacher
com.heima.delete
DeleteStudent
DeleteTeacher
com.heima.update
UpdateStudent
UpdateTeacher
com.heima.find
FindStudent
FindTeacher
方案2:按照模块分
com.heima.teacher
AddTeacher
DeleteTeacher
UpdateTeacher
FindTeacher
com.heima.student
AddStudent
DeleteStudent
UpdateStudent
FindStudent
*封装:隐藏实现细节,对外提供公共的访问方式
本类 同一个包下(子类和无关类) 不同包下(子类) 不同包下(无关类)
private Y
默认 Y Y
protected Y Y Y
public Y Y Y Y
案例:
package com.heima;
import com.baidu.Person;
import com.xxx.Student;
//import java.util.Scanner; //在开发中我们用的都是导入具体的类
import java.util.; //代表通配符,他会到该包下挨个匹配,匹配上就导入
class Demo1_Package {
public static void main(String[] args) {
Person p = new Person("张三",23);
System.out.println(p.getName() + "…" + p.getAge());
//p.print(); //在不同包下的无关类,不允许访问,因为是protected修饰的
/Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
System.out.println(x);/
Student s = new Student("李四",24);
System.out.println(s.getName() + "..." + s.getAge());
s.method();
}
}
package com.baidu;
public class Person {
private String name;
private int age;
public Person(){}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
protected void print() {
System.out.println("print");
}
}
package com.xxx;
import com.baidu.Person;
public class Student extends Person {
public Student(){}
public Student(String name,int age) {
super(name,age);
}
public void method() {
print();
}
}
B:类:
抽象修饰符:abstract
用的最多的就是:public
C:成员变量:
状态修饰符:static,final
用的最多的就是:private
D:构造方法:
权限修饰符:private,默认的,protected,public
用的最多的就是:public
E:成员方法:
抽象修饰符:abstract
用的最多的就是:public
F:除此以外的组合规则:
要求:使用已知的变量,在控制台输出30,20,10。
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(???);//Outer.this.num,内部类之所以能够访问外部类成员,因为它能获取外部类的引用Outer.this,outer下面的this的num
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
A:案例演示
局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
但是jdk1.8取消了这个事情,所以我认为这是个bug
案例:
class Demo1_InnerClass {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
//局部内部类
class Outer {
public void method() {
final int num = 10;
class Inner {//局部内部类和局部变量一样,只在方法中有效,出了方法就无效了
public void print() {
System.out.println(num);
}
}
Inner i = new Inner();
i.print();
}
/public void run() {
Inner i = new Inner(); //局部内部类,只能在其所在的方法中访问
i.print();
}/
}
new 类名或者接口名(){
重写抽象类或者接口的方法;
} //只能用一次
E:案例演示
按照要求来一个匿名内部类
案例:
class Demo1_NoNameInnerClass {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
interface Inter {
public void print();
}
class Outer {
class Inner implements Inter {
public void print() {
System.out.println("print");
}
}
public void method(){
//Inner i = new Inner();
//i.print();
//new Inner().print();
//Inter i = new Inner(); //父类引用指向子类对象
new Inter() { //实现Inter接口
public void print() { //重写抽象方法
System.out.println("print");
}
}.print();
}
}
//这里写抽象类,接口都行
abstract class Person {
public abstract void show();
}
class PersonDemo {
public void method(Person p) {
p.show();
}
}
class PersonTest {
public static void main(String[] args) {
//如何调用PersonDemo中的method方法呢?
PersonDemo pd = new PersonDemo ();
//请在此处补充代码
}
}
答案:
class Test1_NoNameInnerClass {
public static void main(String[] args) {
//如何调用PersonDemo中的method方法呢?
PersonDemo pd = new PersonDemo ();
//pd.method(new Student());
pd.method(new Person() {
public void show() {
System.out.println("show");//匿名对象类作为参数传递
}
});
}
}
//这里写抽象类,接口都行
abstract class Person {
public abstract void show();
}
class PersonDemo {
//public void method(Person p) { //Person p = new Student(); //父类引用指向子类对象
/*
Person p = new Person(){
public void show() {
System.out.println("show");
}
};
*/
public void method(Person p) {
p.show();
}
}
class Student extends Person {
public void show() {
System.out.println("show");
}
}
按照要求,补齐代码
interface Inter { void show(); }
class Outer { //补齐代码
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
/*分析:outer中必须有method方法,并且这个方法返回值一定是Iter的实现类对象
*/
}
}
}
要求在控制台输出”HelloWorld”
答案:
class Test2_NoNameInnerClass {
public static void main(String[] args) {
//Outer.method().show(); //链式编程,每次调用方法后还能继续调用方法,证明调用方法返回的是对象,.show说明调用了这份方法,那么这份方法必须被重写
// Inter i = Outer.method();
// i.show();
}
}
interface Inter {
void show(); //这是接口,要调用这个方法必须进行重写
}
class Outer {
//补齐代码
public static Inter method() {//返回值必须是Inter对象,要调用show,必须对show重写
return new Inter() {//匿名类对象格式:
public void show() {
System.out.println("HelloWorld");
}
};
}
}
//要求在控制台输出”HelloWorld”//按照要求,补齐代码
原文:http://www.cnblogs.com/itlyh/p/6024679.html