黑马程序员----【javaSE基础】复习--面向对象

------- android培训java培训、期待与您交流! ----------


1:面向对象

(1)面向过程 强调过程,执行者
(2)面向对象 强调对象,指挥者
(3)面向对象思想的特点
A:它是一种更符合人们思考习惯的思想
B:它是复杂的内容简单化
C:它使我们从执行者变成了指挥者
请解释面向对象的思想?
定义一:面向对象方法是一种运用对象、类、封装、继承、多态和消息等概念来构造、测试、重构软件的方法。 
定义二:面向对象方法是以认识论为基础,用对象来理解和分析问题空间,并设计和开发出由对象构成的软件系统
(解空间)的方法。 由于问题空间和解空间都是由对象组成的,这样可以消除由于问题空间和求解空间结构上的不
一致带来的问题。简言之,面向对象就是面向事情本身,面向对象的分析过程就是认识客观世界的过程。 
面向对象方法从对象出发,发展出对象,类,消息,继承等概念。 
面向对象方法的主要优点是:符合人们通常的思维方式;从分析到设计再到编码采用一致的模型表示具有高度连续性;
软件重用性好。
(4)面向对象的特点
A:封装
B:继承
C:多态


2:类和对象
(1)类 对现实世界中事物的描述(属性和方法)Person p = new Person();String name,int age
(2)对象 现实世界中实际存在具体的个体
(3)对象的使用以及内存图 new



3:局部变量和成员变量
(1)作用范围 
局部变量:方法内
成员变量:类中,对整个类有效
(2)存储空间
局部变量:栈内存
成员变量:堆内存
(3)初始化值
局部变量:在使用前必须手动给值
成员变量:jvm默认初始化值。


class Person {
int num;
public void method(){
int age ;
//age = 10;
System.out.println(num);
}
}


4:匿名对象的使用(了解)
(1)当对对象中的功能只执行一次的时候使用。否则,请你使用有名字的对象。
Person p = new Person();
p.show();
p.show();
p.print();


new Person().show();
new Person().show();
new Person().print();
method(new Person());
(2)用于作为实际参数进行传递。
method(Person pp){}//method(p);//地址值
method(new Person());//地址值
method(p);


public static void method(Person p){}
(3)是否可以用匿名对象调用属性,是否有意义?




4:封装
(1)封装的好处:便于重复使用,安全性高。
(2)private权限修饰符
class Demo{
private int age;//把属性私有对外提供公共的访问方法,可控性提高了


public void setAge(int age){//age = -20;
if(age>=0 && age<=200){
this.age = age;
}
else {
System.out.println("请回火星");
}
}


public int getAge(){
return age;
}
}
class DemoTest{
public static void main(String[] args) {
Demo d = new Demo();
d.setAge(-20);
System.out.println(d.getAge());
}
}


5:构造函数
class Person{
int age;
Person(int age){}
}
(1)用途:用于给对象进行初始化。
A:格式类名(){code}Person(){}
B:Person(){}public Person(){}
(2)特点 你不定义空参数的构造函数,系统会自动给一个空参构造,你定义了构造函数无论是有参还空参的,
系统就不再给空参数的了。
(3)重载构造函数,是根据参数列表来区分是哪个构造函数
A:Person(){}//Person p = new Person();
B:Person(int age,String name){}
C:Person(int age){}
D:Person(String name,int age){}


注意:构造还可以用于给属性赋值。
class Person{
int age;
String name;
Person(){}
Person(int age,String name) {//age = 20,name = "zhangsan";
this.age = age;
this.name = name;
}
public void speak(){
System.out.println(age + "....." + name);
}
}
class Demo{
public static void main(String[] args) {
//Person p = new Person(20,"zhangsan");
Person p = new Person();
p.speak();
}
}
6:this关键字
(1)代表当前对象的引用。使用的时候,谁调用方法,this就代表谁。
(2)什么时候使用this呢?
A:当局部变量和成员变量重名的时候,可以用this进行区分。
B:写功能的时候,可能用到this。比如比较两个对象的年龄compare()
C:构造函数中使用this
**this() 必须放在第一行。

同下面的道理:
Person(String name){
this.name = name;
}


Person(String name,int age){

this("张三");//是找带一个字符串类型参数的构造方法
this.name = name;
this.age = age;
//this("zhangsan");


}
Person p = new Person("lisi",20);
7:代码块
(1)局部代码块 控制变量的生命周期{int x}
(2)构造代码块 每创建一次对象就执行一次。
(3)思考下面的问题
Person p = new Person();
它在内存中做了哪些事情?
A:将Person.class文件加载到内存中。
B:在栈内存中声明Person类型的变量P。
C:在堆内存中创建一个对象Person。分配地址值
D:把Person中的属性进行默认初始化。
E:把Person中的属性进行显示初始化。
F:调用构造代码块(如果没有,不执行这个操作)。
G:调用构造函数进行初始化。
H:把堆内存的地址(引用)赋给了栈内存中P。


public void method() {
{
int x = 10;
System.out.println(x);
}
}
class Person{
{
System.out.println("你好");
}
}


Person p = new Person();


1:static关键字
(1)静态的意思。可以修饰类的成员(成员变量和成员方法);
(2)静态成员的特点:
A:随着类的加载而加载,生命周期最长。
B:优先于对象存在。javac Demo 生成Demo.class java Demo{ Demo d = new Demo();
}
C:被所有的对象所共享。
D:比非静态成员多了一种访问方式。可以通过类名直接调用。
(3)什么时候需要使用static修饰呢?
当类中的成员需要被所有对象共享时,用static修饰。不需要被共享时,就不用static修饰。
简单说:共性用static修饰,特性不用static修饰。
(4)注意事项
A:静态方法只能访问静态成员的。
B:静态方法中不能使用this,super关键字。
C:main是静态的。
**格式如下:
public static void main(String[] args){
 
}


 ***由于它被jvm调用,所以权限要足够大,所以用public权限修饰符。
 ***为了jvm可以不用创建对象直接调用它,所以用static修饰。
 ***void jvm不需要任何返回。但是方法体结尾默认有return;
 ***main jvm只认识这个名字。
 ***String[] 有可能需要传入参数。
 ***args 字符串数组的名字,为了方便使用。
(5)静态代码块
类中加载流程?
静态代码块--构造代码块--构造方法。


2:静态的应用
工具类ArrayTool
因为使用的都是class文件。所以你应该先编译ArrayTool,然后在编译ArrayToolDemo,最后执行ArrayToolDemo。
但是如果引用的工具类特别多的情况下,这样就很麻烦,所以java提供好的方式:只编译ArrayToolDemo即可。
(其实它首先在classpath下找ArrayTool.class,如果没有,接下来在当前类下找ArrayTool.class文件。
如果还没有,它就会找ArrayTool.java文件,并且进行编译。如果都没有,就报错。)


制作工具说明书:代码中有文档注释,用javadoc解析。
javadoc -d myAPI -author -version ArrayTool.java
-d 后面跟目录 
ArrayTool.java 源代码文件


javadoc: 错误 - 找不到可以文档化的公共或受保护的类。
改用public修饰一下即可


3:API(Application programming Interface):应用程序编程接口。
JavaAPI:java的帮助文档。


4:设计模式
java中有23种设计。


单例设计模式:保证类在内存中只有一个对象。

如何保证类在内存中只有一个对象呢?
(1)控制类的创建,不让其他类来创建本类的对象。private
(2)在本类中定义一个本类的对象。Single s;
(3)提供公共的访问方式。  public static Single getInstance(){return s}


单例写法两种:
(1)饿汉式 开发用这种方式。
class Single{
private Single(){
}


static Single s = new Single();


public static Single getInstance(){
return s;
}
}
(2)懒汉式 面试写这种方式。多线程的问题?
class Single {
private Single(){}


private static Single s;


public static Single getInstance(){
if(s==null){
s = new Single();
}
return s;
}
}


class Single{
private int num = 10;
private static Single s = new Single();
private Single(){

}


public static Single getInstance(){
return s;
}
public void setNum(int num){
this.num = num;
}
public int getNum(){
return this.num;
}
}


class SingleDemo {
public static void main(String[] args) {
Single s = Single.getInstance();
Single s1 = Single.getInstance();
//System.out.println(s==s1);
s.setNum(10);
s1.setNum(20);
System.out.println(s.getNum());
System.out.println(s1.getNum());
}
}
1:继承(extends)
(1)继承的体系结构:就是对要描述的事物进行不断的向上抽取,就出现了体系结构。
**要了解这个体系结构中最共性的内容,就看最顶层的类。
**要使用这个体系的功能,就用最底层的类创建对象。
(2)继承的好处:
A:继承的出现,提高了代码的复用性。
B:继承的出现,让类与类之间产生了关系,extends来表示,
  这个关系的出现,为后面我们讲面向对象的第三个特点多态打下了基础。
(3)特点
A:java只支持单继承(其实确切的说是java对多继承进行了优化,避免了安全问题)。
B:java支持多重(层)继承。
(4)注意:
A:子类可以直接访问父类中的非私有的属性和行为。
B:不要仅为了获取其他类中部分功能而去继承。
C:类与类之间要有所属( " is a " )关系,xx1是xx2的一种。
**如何判断A和B是否有继承关系?
**A如果继承B,那么就可以说A是B的一种。


2:继承后子父类之间成员的关系
(1)成员变量
class Fu{
int num1 = 5;
}


class Zi extends Fu{
int num1 = 20;


public void show() {
int num1 = 30;
System.out.println("num1:"+num1);
//当局部变量和成员变量重名的时候用this来区分
System.out.println("this num1:"+this.num1);
//当子类和父类出现了同名变量,用super来区分
System.out.println("father num1:"+super.num1);
}
}
总结:在一个类中如果方法中的局部变量和方法外的成员变量重名,那么如果在方法内输出这变量,就是方法
    自己的变量里的值,想要区分要用this,加上this.就是输出成员变量的值
在子父类中如果出现成员变量重名的时候,在子类输出会输出自己的变量里的值,想要区分要用super,
加上super.就是输出父类里变量的值


     this和super的区分:
     **this代表本类对象的引用
super本类对象父类的引用。
     **this可以用于区分局部变量和成员变量同名的情况。
super可以用于区分子类和父类成员变量同名的情况。
     **一般,子类中不会出现和父类同名的成员变量。面试可能问到。


(2)成员方法
class Fu {
public void show() {
System.out.println("fu show");
}
}


class Zi extends Fu{
/*public void show(){
System.out.println("zi show");
}*/


public void show(){
System.out.println("zi show1");
}
}
子类中存在和父类成员方法同名的这种现象,叫做重写,复写,覆盖。
重写(override)和重载(overload)的区别:
重载的特点:
**在同一类中。
**方法名相同,参数列表不同。
重写的特点:
**要有继承关系。在子父类中
**方法的声明相同。(方法名和参数列表都相同)
***覆盖时,子类方法权限一定要大于等于父类方法权限
***静态只能覆盖静态。
(3)构造方法
class Fu{

//Fu(){}

Fu(int age){//age = 30
System.out.println("father age:"+age);
}
}


class Zi extends Fu{
Zi(){
//this(20);
System.out.println("son");
}


Zi(int age){//age =30
super(age);
System.out.println("son age:"+age);//30
}
}


Zi z = new Zi();  


Zi z = new Zi(30);


总结:子类中所有的构造方法默认都会访问父类中空参数的构造方法。
**因为每一个构造方法的第一行都有一条默认的语句super();


     当父类中没有空参数的构造方法时,子类的构造函数必须通过this
     或者super语句指定要访问的构造方法。或者手动提供无参构造方法。


     this(...):调用本类中的构造方法
     super(...):调用父类中的构造方法


构造方法用于创建对象,并进行初始化.建议如果你写了有参的构造函数,也要把空参的构造函数再手动加上
否则你定义了有参的构造函数,空参的系统就不会再给了
你这样创建对象的时候就会报错Person p = new Person();//这句话是会去找空参的构造函数

class Person{
Person(){}


Person(int age){
this.age = age;
}


Person(int age,String name){
this(age);
//this.age = age;
this.name = name;
}
}


     //Person p =new Person();  //系统默认给出无参构造


     //当你手动给出构造方法后,系统就不会再给出默认的空的构造方法。



     手动无参数,如果你想给属性赋值或者做一些初始化,无参你别删不就行了吗。
class Demo{
private String name;
Demo(){}


public void setName(String name){
this.name = name;
}


public String getName(){
return name;
}
}


3:final可以用来修饰什么呢?
(1)final可以用来修饰类:被fainl修饰的类不能被继承。
(2)final可以用来修饰成员方法:被final修饰的成员方法不能被重写。
(3)final可以用来修饰变量:被final修饰的变量为常量,值不能被修改。
  常量的命名规范:要求大写。
  final int PI = 3.14;


  final难道必须声明的时候就赋值。
  一般来说,是这样的。但是特殊情况:在构造方法可以给final修饰的变量赋值。


4:抽象类(abstract)
(1)只抽取了很多类的方法的声明,为了保证不出问题,方法声明用abstract修饰。
(2)抽象类的特点
A:一个类如果有了抽象方法,那么这个类必须是抽象类。抽象类里边可以没有抽象方法。
B:抽象类是不能够被实例化的。不能够创建对象的。
C:如果一个类继承抽象类,那么,它要么实现抽象类中的所有抽象方法,
  要么本身也是抽象类。
(3)抽象类的成员特点:
A:成员变量:子类可以直接继承抽象类中的成员变量。(抽象类中的成员变量可以和以前是一样的)
B:成员方法:抽象类中分为两种方法,一种是抽象方法,这种方法在子类中必须要被实现。
            一种是普通的方法。可以被子类直接继承使用。
C:构造方法:抽象类不能被实例化,那么它有构造方法吗?抽象类是class,那么它就有构造方法。
    它的构造方法有用吗?有,为了让子类实例化的时候使用。
(4)举例:教师举例,学生举例,员工举例
(5)抽象类的相关问题:
A:抽象类中是否有构造函数?参照(3)里面的C。
B:抽象关键字abstract不可以和哪些关键字共存?
**private
***私有的,外部直接无法访问。
**static
***那么这个时候抽象方法就可以可以通过类名调用,但是这样是没有意义的。
**final
***final修饰的方法不能被重写。所以它和abstract冲突。
C:抽象类中可不可以没有抽象方法?
**可以。如果这么做只有一个目的不让你创建这个类的对象
面向对象
 1:解释面向对象思想
 2:封装 private 
 3:局部变量和成员变量
 4:构造 this
 5:继承 extends, super
 6:抽象类 abstract




***类,抽象类,还是接口。
***构造方法
***学习里面的功能。
奉劝大家:学习程序要结合着生活中的例子去理解,不要就在程序中死扣,这样反而让你越来越越晕,比如理解
继承有父亲有儿子,儿子从父亲那里继承非私有的东西很正常







1:接口(interface)
(1)接口的由来:当一个类中所有的方法都是抽象的时候,你没必要定义为抽象类,
              定义为接口就可以了。
(2)解决了java中只能单继承的问题。(对多继承进行了优化)
A:类与类:只能是单继承。 extends
B:接口与接口:可以是单继承,也可以是多继承。 extends
C:类与接口:可以是单实现,也可以是多实现。 implements
(3)成员特点:
A:只有成员变量和成员方法。
B:成员变量 默认修饰符 public static final
**int X = 20;
**其实是这样的 public static final int X = 20;
C:成员方法 默认修饰符 public abstract
**void show();
**其实是这样的 public abstract void show();
建议:为了便于阅读,自己手动加上修饰符。
(4)接口特点:
A:接口是对外暴露的规则
B:接口是功能的扩展
C:接口降低了程序的耦合性。
**内聚(自己实现功能的能力) 
**高内聚,低耦合。
举例:主板和CPU,USB接口,电源插座。
D:扩展说了下接口的理解
**狭义的理解就是java中的接口。
**广义的理解就是:任何定义的规范都是接口。
(5)接口和抽象类的区别:
A:抽象类只能被单继承;接口可以被多实现。
B:抽象类中的成员:成员变量:可以是常量,也可以是变量。
  成员方法:可以是抽象的,也可以是非抽象的。
  构造方法:虽然不可以创建对象,但是可以给子类实例化用。
  接口中的成员:成员变量:只能是常量。默认修饰符 public static final
成员方法:只能是抽象的。默认修饰符 public abstract
C:抽象类中定义的是体系结构中的共性的内容。
  接口中定义的是对象的扩展功能。
D:抽象类被继承表示的是:"is a"的关系。xx是yy中的一种。
  接口被实现表示的是: "like a"的关系。xx像yy中的一种。
(6)学生:Student
A:属性:学号,姓名,年龄 
B:方法:学习(study),吃饭(抽象eat),抽烟(是不是所有的学员都抽烟呢?),
  篮球(是不是所有的人都会打篮球呢?)


分析:学员都具备学习的行为和吃饭的行为,但是并不是所有的学员都抽烟,也不是所有的学员都打篮球
    interface Smoking {
public abstract void smoking();
}
interface Sport{
public abstract void playBasketBall();
}

  描述的是即会抽烟又会打篮球的学生:SmokeStudent extends Student implements Smoking,Sport
一个类只能继承一个类,但是可以实现多个接口,每实现一个接口,功能就扩展了一部分
SmokeStudent ss = new SmokeStudent();
ss.eat();
ss.study();
ss.smoking();
ss.playBasketBall();
 
2:多态
(1)某一类事物的多种存在形态。
**方法重载(静态多态)
**方法重写(动态多态,对象多态)
(2)对象多态的前提
A:类与类(或接口)要有继承(或实现)关系。
B:一定要有方法的重写。
C:一定要有父类或者接口的引用指向子类的对象。Person p = new SuperMan();
SuperMan sm = (SuperMan)p;
(3)多态思想:可以指挥同一类型的一批对象做事情。多态的出现让我们复杂的问题简单化了。
A:Animal Cat Dog
**method(Animal a){a.eat();}//Animal a = new Cat();
(4)多态中成员的特点:(我们只研究特殊的,就是说名字一样的东西)
Fu f = new Zi();
A:成员变量:编译和运行都看Fu。
B:非静态方法:编译看Fu,运行看Zi。
C:静态方法:编译和运行都看Fu。

举例: 动物的例子:
向上转型
Animal a = new Cat();
a.eat();
//a.catchMouse();


向下转型
Cat c = (Cat)a;
c.eat();
c.catchMouse();


//向上转型
Animal a = new Dog();
//向下转型 转换异常
//Cat c = (Cat)a;
Dog d = (Dog)a;


超人的例子:
person :谈生意();
SuperMan:谈生意();fly();


Person p = new SuperMan();//超人没变身之前就是普通人一个,只能调用Person里的方法
//在运行的时候发现有SuperMan这个子类继承了他,会去看里面是否有和你调用Person里相同的方法
//如果有运行就执行子类重写的方法(成员函数的特性,覆盖)
p.谈生意();


SuperMan sm= (SuperMan)p;//内裤外穿,变身超人
sm.谈生意();
sm.fly();
总结:无论是向上转型还是向下转型,变化的都是子类对象,绝对不能把父类对象强转为子类类型


1:内部类
内部类分别有:1,成员内部类2,静态内部类3,局部内部类4,匿名内部类
(1)成员内部类
A:定义,:在一个外部类中有成员变量和成员方法,那么成员内部类就是把整个一个类当成了外部类的成员对待了
B: 访问方式:内部类访问外部类,内部类可以直接访问外部类,包括私有成员,因为内部类拥有外部类的引用是类名.this
   外部类访问内部类,外部类访问外部类的成员,必须要建立内部类的对象
   格式:外部类名.内部类名 = 外部类对象.内部类对象;
Outer.Inner oi = new Outer().new Inner();//outer代表外部类,Inner代表内部类
C:存放位置:在外部类里,在外部类的成员方法外.
D:修饰符:final、abstract、public、private、protected和static等,那么被static修饰的就是下面所说的
静态内部类.
(2)静态内部类
A:定义,就是在成员内部类的基础上加上static
B:格式:外部类名.内部类名 = 外部类名.内部类对象;
       Outer.Inner oi = new Outer.Inner();
        C:存放位置:和成员内部类一样,就是多了个static
(3)局部内部类
A:定义,在外部类成员方法中定义的内部类,他更像局部变量
B: 注意:
  第一:方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
  第二:方法内部类对象不能使用该内部类所在方法的非final局部变量。因为方法的局部变量位于栈上,
       只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。
       但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!
       例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。
       正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
  第三:方法内部类的修饰符。与成员内部类不同,方法内部类更像一个局部变量。可以用于修饰方法内部类
       的只有final和abstract。
           第四:静态方法内的方法内部类。静态方法是没有this引用的,因此在静态方法内的内部类遭受同样的待遇,
       即:只能访问外部类的静态成员。
(4)匿名内部类:没有名字的内部类。它是内部类的简化写法。
A:前提:内部类可以继承或实现一个外部类或者接口。
B:格式为:new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)}
C:简单理解:就是建立一个带内容的外部类或者接口的子类匿名对象。
D: a,继承式的匿名内部类
  b,接口式(也可以叫实现式的,名字无所谓)的匿名内部类
  c,参数式的匿名内部类
多加一句:我的理解,其实与其说是匿名内部类,我个人认为说是匿名对象更确切一点(个人理解,仅供参考);


interface Inter {
public abstract void show1();
public abstract void show2();
}

//有名字的内部类
class Outer {
public void method(){
class Inner implements Inter {
public void show1(){
System.out.println("show1");
}


public void show2(){
System.out.println("show1");
}
}
}
public void show() {
Inter in = new Inner();//父类引用指向子类对象
in.show1();
in.show2();


}
}


//匿名内部类(重点,android里面用的多,awt的监听器用的多)
class Outer {
public void method() {
//匿名内部类对象调用方法
new Inter() {
public void show1() {
System.out.println("show1");
}


public void show2() {
System.out.println("show1");
}
}.show1();


new Inter() {
public void show1() {
System.out.println("show1");
}


public void show2(){
System.out.println("show1");
}
}.show2();
//匿名内部类对象的另一种调用方式,父类引用指向子类对象
Inter in = new Inter() {
public void show1() {
System.out.println("show1");
}


public void show2() {
System.out.println("show1");
}
};
in.show1();
in.show2();
}
}


(5)什么时候使用匿名内部类呢?
A:通常在使用方法是接口类型参数,并该接口中的方法不超过三个时,
  可以将匿名内部类作为参数传递。


2:异常
(1)就是程序运行过程中,遇到了问题,这就叫异常。
(2)异常的体系
Throwable 其实应该分三种
Error
通常出现重大问题如:运行的类不存在或者内存溢出等。
   不编写针对代码对其处理。
Exception 
除了 RuntimeException 和其所有子类,其他所有的异常类都是在编译的时候必须要处理的
要么try,要么抛
RuntimeException
RuntimeException 和其所有的子类,都不会在编译的时候报异常,而是在运行时报异常,这时候我们
就需要回头看看我们的代码是否有问题,比如角标越界,空指针等


(3)Throwable
A:getMessage() :返回此 throwable 的详细消息字符串。
class Throwable {
String detailMessage;
Throwable(){}


Throwable(String message) {
this.detailMessage = message;
}


public String getMessage() {
return detailMessage;
}
}
B:toString():获取异常类名和异常信息,返回字符串。
C:printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
(4)处理异常处理方式:
A:try...catch...finally
格式:
try {
需要检测的代码;
}
catch(异常类  变量) {
异常处理代码;
}
...
finally {
一定会执行的代码;
}
可以有下面三种搭配形式:
**try...catch(...)
**try...finally
**try...catch(...)...finally


B:抛出 throws throw
throws:用于标识函数暴露出的异常。thorws用在函数上,后面跟异常类名(可以由多个,用,隔开)。


throw:用于抛出异常对象。throw用在函数内,后面跟异常对象。new Exception();


C:到底用谁?
**你能处理,建议处理。try...catch...finally
**你处理不了,抛出。


D:自定义异常
自定义类继承Exception或者其子类(RuntimeException)


class MyException extends Exception{
MyException(){}


MyException(Stirng message){
super(message); //将信息传递给父类,调用父类封装好的构造方法
}
}


class Student {
public void giveAge(int age) throws MyException {
if(age>40 || age<0) {
//throw new MyExcetpion("建议不学了");
MyExcepiont my = new MyExcetpion("建议不学了");
throw my;
}
else {
System.out.println("可以学习Java");
}
}
}
E:RuntimeException和Exception
区别:RuntimeException就是要你改代码的。你可以不处理。


1:包
(1)包:package
A:对类文件进行分类管理
B:给类提供多层命名空间
C:放在程序代码的第一行(注释除外)


(2)访问:先得有包,然后:包.类名
如何解决手动创建包的问题呢?
javac -d xxx PackageDemo.java


-d 后面跟的是:目录
当前目录:.
(3)不同包之间类的访问
类一定要用全路径名称:包名.类名


2:protected
包之间的继承关系。


3:import
简化类名。
一个程序文件中只有一个package,可以有多个import。
用来导包中的类,不导入包中的包。

通常写import  mypack.Demo;
而不写import mypack.*;为什么?


4:权限修饰符
同一个类中     同一个包中 不同包中子类中    不同包中,不存在继承关系
private OK
默认 OK Ok
protected Ok Ok Ok
public OK Ok OK OK






特殊:private和static可以修饰内部类。
      static可以代码块。静态代码块。


A:四种访问权限修饰符任意时刻只能使用一种。
B:static,private,final 不能和abstract并用。


6:jar
(1)打包:
jar -cf haha.jar packa
(2)查看jar包
jar -xvf haha.jar
(3)如果内容特别多,好几个屏幕都放不下,
我们能够通过dos命令,讲这些目录写入到一个记事本中。数据重定向。dos的命令
jar -tf haha.jar > c:\a.txt

------- android培训java培训、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值