当前位置: 代码迷 >> 综合 >> Java基础学习总结3(面向对象之继承,多态.接口,内部类,匿名内部类,选择排序)
  详细解决方案

Java基础学习总结3(面向对象之继承,多态.接口,内部类,匿名内部类,选择排序)

热度:61   发布时间:2024-02-05 02:43:23.0

day10

1.代码块
        在Java中使用{}包裹起来的内容,将这个{}称为代码块!
分类:1)局部代码块: 在方法定义中定义的{} 
作用:限定局部变量的生命周期       
2)构造代码块:在类中的成员位置中定义的{}
作用:在执行构造方法之前先执行构造代码块,然后对当前数据(类中的成员变量)进行初始化
将构造方法中共性内容存储到构造代码块中 (一般情况都是通过构造方法初始化)
3)静态代码块:在类中的成员位置定义的 static{}
作用:随着类的加载加载,在{}里面给数据进行初始化 整个{}优先于对象存在
而且静态代码块执行只执行一次!(因为类就加载一次!)
结论:   优先级:
 静态代码块 > 构造代码块 > 构造方法
      静态代码块的特点:随着了类的加载而加载,因为类的加载一次,静态代码块只执行一次

局部变量不用加权限修饰符的,因为局部变量本身就是一个访问限定!因为跟方法有关系.
static不能修饰局部变量,局部变量随着方法调用而存在,随着方法调用结束而消失(释放掉),而被static修饰的变量有一个特点:可以被共用, 方法调用完毕需要释放掉局部变量,这种情况产生冲突.
但是可以使用final修饰符(状态修饰符),它修饰符的变量在内存中是一个固定的常量(永驻内存的)    

2.继承

继承:  需要定义独立的类,将其他类的共性内容抽取到该独立的类中,让其他类和这个独立类的产生一种关系: "继承"关系
 继承的好处:
1)提供了代码的复用性 (代码结构清晰)
2)提供了了代码的维护性
3)类和类产生的这种"继承关系",是多态的前提条件
继承的关系也是一种弊端,类和类产生,耦合性就增强了
开发的原则:Java很多的开发原则都要遵循下面这个:低耦合,高内聚
耦合:尽量的一个类能完成的事情一个类去完成,不要产生过多的关系. (spring框架的IOC:控制反转)
内聚:执行某件事情的能力!

继承的特点:
1)在Java语言中,类和类之间只支持单继承,不支持多继承
在其他语言中,是支持多继承的,语法格式:子类名 extends 父类名1,父类名2{}
2)虽然不支持多继承,但是类与类之间是可以多层继承的!

继承中的注意事项:
1)子类继承父类,可以继承父类中所有的非私有的成员!
本身私有的成员变量/成员方法只能在本类中访问,外界不能访问的!,但是间接通过公共的访问方法来访问
2)子类继承父类,不继承父类构造方法,但是可以通过一个关键字来访问父类的构造方法(super)
3)不要为了使用部分功能而去使用继承!

继承中的成员关系:成员变量,构造方法,成员方法       
成员变量:
子类继承父类,如果子类中的成员变量名称和父类的成员变量名称不一致的情况:分别访问即可!
子类继承父类,如果子类中的成员变量名称和父类的成员变量名称一致的情况:
执行流程:
1)现在子类的局部位置中找,如果找到了就使用它
2)如果局部位置中没有,在子类的成员位置中找,如果找到了,就使用!
3)如果找不到,就在父类的成员位置中找,如果找到了,就使用
4)如果还找不到,就报错了,说明访问了一个不存在的变量!
遵循一个:"就近原则"

举例:

public class Demo2 {public static void main(String[] args) {Zi z = new Zi();z.getNum();}}
class Fu{public int num = 10;public int num2 = 30;
}
class Zi extends Fu{public int num2 = 20;public void getNum() {System.out.println(num);//10System.out.println(num2);//20}
}

关于继承中构造方法的关系:
 * 
*     子类是不能继承父类的构造方法的,但是通过super()来访问父类的构造方法
*  1)在继承中,
子类中所有的构造方法都默认访问父类的无参构造方法;
 *         相当于子类的所有构造方法的第一句话:隐藏了super();
*  2)为什么,创建子类对象的时候,先执行父类的无参构造方法?
*         因为可能要用到父类中的数据,所以要先让父类中的数据进行初始化(构造方法),
* 父类初始化完毕了,然后才执行子类的构造方法(子类数据初始化)---->分层初始化!
*     super():如果在子类的构造方法显示给出了,必须写在第一句,否则可能出现父类初始化多次!(可以省略不写.)

 

public class Demo2 {public static void main(String[] args) {//创建子类对象Son s = new Son() ;//无参构造创建对象System.out.println("--------------------------");Son s2 = new Son("Java") ;//有参构造创建对象}}
class Father{public Father() {System.out.println("这是父类的无参构造方法");}public Father(String name) {System.out.println("这是父类的有参构造方法");}
}
//定义一个子类
class Son extends Father{public Son() {super() ;System.out.println("这是子类的无参构造方法");}public Son(String name) {super() ;System.out.println("这是子类的有参构造方法");}
}
这是父类的无参构造方法
这是子类的无参构造方法
--------------------------
这是父类的无参构造方法
这是子类的有参构造方法

如果父类的无参构造方法没有提供,那么子类构造会出现什么情况?
*     子类的所有构造方法默认父类的无参构造方法,父类如果没有提供,就报错了!
* 
*     如何解决呢?
*         1)手动给出父类的无参构造方法 (之前说在写一个标准类的时候,建议永远给出无参构造方法)
*        2)现在手动不提供无参构造方法,如何解决?    
*            2.1)间接的通过super(xx)来访问父类的有参构造初始化!
*            2.2)通过this(),访问本类(子类)的无参构造方法,然后在通过子类的无参构造方法里面super(xx)
*                    间接访问父类的有参;
* 
* 根据上面的总结:
*     子类中的所有构造方法里面某一个构造方法必须让父类初始化,super(xx),this(),
*                                             全都是在构造方法中的第一句!

 

public class Demo2 {public static void main(String[] args) {//创建子类对象Son s = new Son() ;//无参构造创建对象}}
class Father{/*public Father() {System.out.println("这是父类的无参构造方法");}*/public Father(String name) {System.out.println("这是父类的有参构造方法");}
}
//定义一个子类
class Son extends Father{public Son() {super("1") ;System.out.println("这是子类的无参构造方法");}public Son(String name) {this();System.out.println("这是子类的有参构造方法");}
}
这是父类的有参构造方法
这是子类的无参构造方法

 this:代表当前类对象的地址值引用
super:代表父类的空间标识(代表父类的对象空间地址值引用)

  猫狗案例: 

public class Demo3 {/*** 猫狗案例---继承版* 	猫类* 		属性:姓名,年龄* 		行为:吃,睡,特有功能:抓老鼠* 	狗类* 		属性:姓名,年龄* 		行为:吃,睡,特有功能:看门* * 由于存在共性内容,将共性内容抽取到一个独立的类中* 	Animal类   ----> 父类* 		属性:姓名,年龄* 		行为:吃,睡  ,提供公共访问的成员方法* 			构造方法*/public static void main(String[] args) {Cat c = new Cat(3,"咪咪");System.out.println(c.getName() + c.getAge());//咪咪3c.eat();//猫吃小鱼干c.sleep();//猫白天睡觉c.catchMouse();//猫抓老鼠Dog d = new Dog();d.setAge(5);d.setName("小黑");System.out.println(d.getName() + d.getAge());//小黑5d.eat();//狗吃骨头d.sleep();//狗白天睡觉d.lookDoor();//狗看家护院}}
class Animal{private int age;private String name;public Animal() {super();}public Animal(int age, String name) {super();this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat() {}public void sleep() {}}
class Cat extends Animal{public Cat() {super();}public Cat(int age, String name) {super(age, name);}@Overridepublic void eat() {System.out.println("猫吃小鱼干");}@Overridepublic void sleep() {System.out.println("猫白天睡觉");}public void catchMouse() {System.out.println("猫抓老鼠");}}
class Dog extends Animal{public Dog() {super();}public Dog(int age, String name) {super(age, name);}@Overridepublic void eat() {System.out.println("狗吃骨头");}@Overridepublic void sleep() {System.out.println("狗白天睡觉");}public void lookDoor() {System.out.println("狗看家护院");}}

day11多态      

    多态的概念:一个事物在不同时刻的体现(堆内存中对象形式) 
多态的前提条件:
*     1)必须有继承关系 (继承的好处第三点作为多态的前提条件)
*         如果没有继承关系,谈不上多态!
*     2)方法重写 ,子类继承父类,将父类的功能覆盖掉,使用子类最具体的功能!
*         举例:动物类的吃和睡不一样,具体的猫和狗类才应该有具体的吃和睡的功能!
*  3)父类引用指向子类对象
*          父类名 对象名 = new 子类名() ; (称为"向上转型")
*  多态的成员访问特点:
*  Fu  f = new Zi() ;
*  成员变量:
*          编译看左边,运行看左边!
*  (等号左边编译通过,说明Fu类存在这个变量;运行看左,访问的是Fu类的变量)
*  成员方法:
*          编译看左边,运行看右边!
*  (等号左边编译通过,说明Fu类存在这个方法;运行看右,子类出现了和父类一模一样的方法声明:方法重写)
*  静态的成员方法:    
*          编译看左,运行看左!(静态的算不上方法重写,跟类直接相关,随着类的加载而加载!)
*  构造方法:存在继承关系(还是分层初始化)
*              先让父类初始化,然后在是子类初始化!

举例:

public class Demo4 {public static void main(String[] args) {//创建对象:多态的形式//父类引用指向子类对象Fu f = new Zi() ;System.out.println(f.num);f.show();f.function();}}
class Fu{public int num = 100 ;public void show() {System.out.println("show Fu");}public static void function() {System.out.println("function Fu");}}
//子类
class  Zi extends Fu{public int num2 = 200 ;public int num = 50 ;public void show() {System.out.println("show Zi");}public static void function() {System.out.println("function Zi");}
}
100
show Zi
function Fu

多态的好处:
*  1)提高了代码的复用性(由继承来保证)
*  2)提高了代码的扩展性(由多态的来保证)

多态的弊端:  不能访问子类的特有功能!

 如何解决呢?
*         方案1):创建子类的具体对象来访问子类的特有功能!
*         代码实现角度来说没有任何问题,但是从内存角度考虑:创建一个新的对象,需要在堆内存中
*产生一个空间地址值,耗费空间!
*        方案2):
*    模拟向上转型的方式:  父类引用指向子类对象    Fu f = new Zi() ;向上转型的格式
*        向下转型:    将父类的引用强转为子类的引用!  (前提必须有向上转型)
*        格式:  Zi   z = (Zi)f;    
*  

public class Demo4 {public static void main(String[] args) {Fu f = new Zi();f.show();//大头儿子Zi z = (Zi)f;z.eat();//爱吃西红柿}}
class Fu{public void show() {System.out.println("小头爸爸");}}
//子类
class  Zi extends Fu{@Overridepublic void show() {System.out.println("大头儿子");}public void eat() {System.out.println("爱吃西红柿");}
}

在继承关系中,子类出现了和父类一模一样的方法,这个时候子类会将父类的该功能覆盖掉,将这种现象
称为:方法重写(方法复写/方法覆盖)  

继承中成员方法关系问题:
* 子类继承父类,如果子类的成员方法名称和父类的成员方法名称不一致的情况:
*                     只要通过子类对象分别调用即可!
*     如果子类的成员方法名称和父类的成员方法名称一致的情况:
*             1)先在子类的成员位置中是否存在该方法,存在,就调用
*             2)如果不存在,在父类的成员位置中找,如果存在,就使用
*             3)如果不存在,父类中没有这个方法,就会报错!(都不存在这个方法)         

在有的时候,不能将父类的功能覆盖掉,那么这个时候Java提供了一个关键字:final (状态修饰符)
final:最终的,无法更改的(状态修饰符)  被final修饰的成员方法:该方法不能被子类重写!
final,finally,finalize()的区别? 
final特点: 可以修饰类:该类不能被继承!
可以修饰符成员变量:此时变量就是常量!  (该变量无论局部变量还是成员变量,只能赋值一次!)
如果该变量是一个基本类型修饰的变量:变量的值不能再改变! 
如果该变量是一个引用类型的(Student s = new Student();) 被final修饰了
那么该s对象不能再重新开辟堆内存空间了!(堆内存地址值不能改变了)
修饰成员方法:   该方法被重写

  final修饰的变量如果是基本类型,它的值不能再改变!
final修饰的变量如果是引用类型,它的堆内存地址值不能该改变!

java.lang.ClassCastException ,向下转型使用不当,会造成一个运行时期异常-->类转换异常!在向下转型的时候,堆内存的数据类型跟栈内存变量类型不一致!(必须是继承关系才可以)

day12抽象类和接口

 

1.抽象类
概念: 
*         在一个类中,如果该类中存在一个功能,仅仅方法声明,没有方法体(抽象方法),需要将该类定义抽象类.
* 举例:
*          动物--->本身不是具体的(抽象的动物类)
*              动物的吃或者睡应该定义为抽象功能---->必须强制子类必须重写抽象功能!
*                    具体的动物:猫,狗等等
*特点:
*    1) 如果一个类中有抽象方法,那么该类一定是抽象类;
*             如果一个类是抽象类,那么该类中不一定存在抽象方法;
*     2)抽象类不能实例化(不能创建对象)
*     3)抽象类不能实例化,如何实例化呢?
*         抽象类需要通过子类进行实例化,父类引用指向子类对象(父类是抽象类):抽象类多态!
*         抽象的父类是通过子类进行实例化,那么如果子类也是一个抽象类,子类也就不能实例化,一定会存在具体的子类             
*    4)抽象方法的格式:没有方法体的方法
*        权限修饰符 abstract 返回值类型 方法名(形式参数) ;
*        abstract:表示抽象
*        可以修饰类,可以修饰成员方法
* 抽象类 必须强制子类完成的事情!(将抽象类中所有的抽象方法重写)

抽象类的成员特点:
*  1)成员变量:  即可定义一个常量,也可以定义为变量          
*  2)成员方法: 既可以定义抽象方法,也可以定义非抽象方法     
*  3)构造方法:存在构造方法,既可以有参构造也可以是无参构造方法(作用:对数据进行初始化)
*  抽象类成员方法特点:
*          成员方法如果是抽象方法,必须强制类完成的事情
*          成员方法如果是非抽象方法,子类继承父类--来提高代码的复用性!

如果一个类中没有抽象方法,那么这个类可不可以定义为抽象类呢?有什么意义?
*     1)可以定义.
*     2)意义就是不能直接创建对象!
*         该抽象类中的一些功能的返回值可能就是该类本身!
* 例如(日历类:Calendar它就是抽象类,里面的功能getInstance()非抽象方法,返回值就是该类本身)

abstract关键字不能和哪些关键字共用 (定义成员方法的时候)

和final关键字冲突:final修饰成员方法,不能被重写,冲突了
和private关键字冲突:私有的方法本身不能被继承,冲突了
和static关键字冲突:static修饰的成员方法跟类相关,随着类的加载而加载,show方法是一个抽象方法,没有方体,加载进内存没有意义!

举例:

public class Demo5 {/***  假如我们在开发一个系统时需要对员工类进行设计,(Employee)(抽象类)* * 	程序员类包含3个属性:姓名、工号以及工资。 * 	项目经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。(bonus) * * 请使用继承的思想(使用抽象类多态进行测试)设计出程序员类和经理类。要求类中提供必要的方法进行属性访问。* * 分析:* 		员工类:Employee   ---抽象类* 			成员变量:姓名(empName),工号(empId),工资(empSalary)* 			构造方法: 无参构造/有参构造方法* 			成员方法:setXXX(形式参数)/getXXX()方法* 					其他成员方法* 							work();* * 		程序类:Programmer类 继承自  Employee* 			无参/有参构造* 			重写work方法 --- "程序员没日没夜敲代码"* 			* 			特有功能:* 					追求完美* * 		项目经理类:Manager 继承 Employee* 			特有属性:奖金bonus* 			提供针对奖金属性的setXXX(形参)/getXXX()公共访问方法* 			无参/有参构造* 			重写work方法 --- "吃饭,喝酒,谈项目!"* 			特有功能:自己分析* */public static void main(String[] args) {Employee e = new Programmer("张三", "001", 7500);System.out.println(e.getName() + e.getId() + e.getSalary());//张三0017500e.work();//敲代码Programmer p = (Programmer)e;p.play();//玩dotaManager m = new Manager();m.setBonus(2000);m.setId("002");m.setName("李四");m.setSalary(10000);System.out.println(m.getName() + m.getId() + m.getSalary() + m.getBonus());//李四002100002000m.work();//控制项目进度m.play();//玩英雄联盟}}
abstract class Employee{private String name;private String id;private int salary;public Employee() {super();}public Employee(String name, String id, int salary) {super();this.name = name;this.id = id;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public abstract void work();
}
class Programmer extends Employee{public Programmer() {super();}public Programmer(String name, String id, int salary) {super(name, id, salary);}@Overridepublic void work() {System.out.println("敲代码");}public void play() {System.out.println("玩dota");}}
class Manager extends Employee{private int bonus;public Manager() {super();}public Manager(String name, String id, int salary,int bonus) {super(name, id, salary);this.bonus = bonus;}public int getBonus() {return bonus;}public void setBonus(int bonus) {this.bonus = bonus;}@Overridepublic void work() {System.out.println("控制项目进度");}public void play() {System.out.println("玩英雄联盟");}}

2.接口

接口:体现的是事物的一种扩展性功能.(本身不具备的,经过一些学习才能具备的功能!)
*   举例:猫和狗本身不具备的跳高的功能,经过特殊的训练--->具备这个功能!  
* 接口如何表示:interface

接口中的注意事项:
*         1)接口中只能定义抽象方法
*         2)接口不能实例化
*         3)接口如何实例化呢?
*             通过接口的子实现类来进行实例化!
*             格式:接口名  对象名  =new 子实现类名();    接口多态!
*             接口和子实现类之间的关系:实现关系(implements)
*         一般开发定义接口的子实现类的时候 , 类名: 接口名 + Impl
*         4)接口的子实现类 
*             4.1)子实现类不是具体类(抽象类)---->抽象类不能实例化---存在具体的子类
*             4.2)子实现类研究的都是具体类! 因为具体的子实现类可以实例化(创建对象!)

抽象类和接口之间的区别?

成员的区别:
成员变量
抽象类:可以是常量也可是变量
接口:只能是常量: 存在默认修饰符 public static final...
成员方法:
抽象类:可以抽象方法(没有方法体),也可以非抽象方法
接口:只能是抽象方法,存在默认修饰符:public abstract
构造方法:
抽象类:存在构造方法,有参/无参,对数据进行初始化
接口:没有构造方法的!


关系的区别:
类与类:继承extends,支持单继承,不支持多继承,可以多层继承
类接口:实现implements,支持一个类继承另一个类的同时可以实现多个接口
接口与接口:继承extends,支持单继承,也可以支持多继承!

继承:存在一种局限性  ----> 面向接口编程!

设计理念的区别:
抽象类---->继承关系--->体现的是一种"is a"的关系!
接口------>实现关系--->体现的是一种"like a"的关系!
猫狗案例

public class Demo3 {/*** 猫狗案例,加入接口(跳高)* 分析:从具体到抽象* 	猫* 		属性:姓名,年龄,颜色* 		行为:吃,睡,特有功能*  狗:* 		属性:姓名,年龄,颜色* 		行为:吃,睡,特有功能* 由于存在共性内容--->抽取出来 放在动物类Animal (抽象类)* 		属性:姓名,年龄,颜色* 		行为:吃,睡(抽象方法)* 猫和狗都继承自动物类* 部分猫和部分狗它能够跳高----->实现接口:跳高 的接口!* 使用面向对象编程方式:代码体现出来,测试对应的猫和狗(底层最具体的类功能实最多!)* 代码实现:从抽象具体* 		定义接口--->抽象类--->子类 /子实现类*/public static void main(String[] args) {Cat c = new Cat(3,"咪咪");System.out.println(c.getName() + c.getAge());//咪咪3c.eat();//猫吃小鱼干c.sleep();//猫白天睡觉c.catchMouse();//猫抓老鼠c.jump();//猫上树Dog d = new Dog();d.setAge(5);d.setName("小黑");System.out.println(d.getName() + d.getAge());//小黑5d.eat();//狗吃骨头d.sleep();//狗白天睡觉d.lookDoor();//狗看家护院d.jump();//狗钻火圈}}
interface Jump{public abstract void jump();
}
class Animal{private int age;private String name;public Animal() {super();}public Animal(int age, String name) {super();this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat() {}public void sleep() {}}
class Cat extends Animal implements Jump{public Cat() {super();}public Cat(int age, String name) {super(age, name);}@Overridepublic void eat() {System.out.println("猫吃小鱼干");}@Overridepublic void sleep() {System.out.println("猫白天睡觉");}public void catchMouse() {System.out.println("猫抓老鼠");}@Overridepublic void jump() {System.out.println("猫上树");}}
class Dog extends Animal implements Jump{public Dog() {super();}public Dog(int age, String name) {super(age, name);}@Overridepublic void eat() {System.out.println("狗吃骨头");}@Overridepublic void sleep() {System.out.println("狗白天睡觉");}public void lookDoor() {System.out.println("狗看家护院");}@Overridepublic void jump() {System.out.println("狗钻火圈");}}

关于形式参数问题的研究(引用类型!)
方法形式参数两种类型:
基本数据类型:形式参数的改变对实际参数没有影响!
引用数据类型:形式参数的改变对实际参数有直接的影响!
具体类:调用该方法,实际参数需要传递该具体类的对象!
抽象类:那么调用该方法,实际参数需要传递该抽象类的子类对象!(其次)
接口:那么调用该方法,实际参数需要传递该接口的子实现类对象!(使用居多)

返回值如果是 引用数据类型
具体类:需要返回该具体类的对象!
抽象类:需要返回该抽象类的子类对象!(其次)
接口:需要返回该接口的子实现类对象!(常见的)

day13内部类以及匿名内部类

1.内部类

 Java中访问权限修饰符
*                 在本类中       在同一个包下(子类,无关类)  不同包下(子类)   不同包下(无关类)
* private            Y            
* 默认修饰符      Y                Y                                
* protected       Y                 Y                        
*     
* public             Y                 Y                                            Y                                 Y
* 
* public权限最大:其次是 protect和默认修饰符 
* 最低的访问权限就是:private
* 
* 我们开发中,使用最多:public 和private(封装时候用到!)

内部类:
*         就是在一个类中定义另外一个类!(以后看源码:比如:集合中的迭代器)
*         在A类中定义一个B类,
*                         那么将B类就称为A类的内部类,A类就是B类的外部类!
*         内部类是可以访问外部类的成员,包括私有!

内部类的分类:
*         成员内部类
*                 在外部类的成员位置定义的类
*         局部内部类
*                 在局部位置(外部类的成员方法中)定义的一个类

在测试类中
*         要访问内部类的成员:
*访问方式:
*        外部类名.内部类名 对象名 = 外部类对象().内部类对象();

举例:

public class Demo6 {public static void main(String[] args) {Outer.Inner oi = new Outer().new Inner();oi.show();//20System.out.println(oi.num2);//30}}
class Outer{private int num = 20;class Inner{int num2 = 30;public void show() {System.out.println(num);}}
}

成员内部类它的一些修饰符
*             private :能够保证内部类的数据的安全性
*             static  : 静态的成员内部类 
*                     被static修饰的成员内部类:
*                         它里面的成员方法(可以静态/非静态)只能访问外部类中静态的成员!(必须使用static修饰)
*              在测试类中,访问静态成员内部类的成员方法的时候,访问方式如下:
*                      外部类名.内部类名 对象名 = new 外部类名.内部类名() ;

 

举例:

public class Demo6 {public static void main(String[] args) {Outer.Inner oi = new Outer.Inner();oi.show();//20 30}}
class Outer{private static int num = 20;static class Inner{int num2 = 30;public void show() {System.out.println(num);System.out.println(num2);}}
}

局部内部类:
*         在局部位置定义的类,
*     特点:
*         1)可以直接访问外部类的成员,包括私有!
*         2)在外部类的成员方法中,可以通过创建局部内部类对象来访问局部内部类的成员
* JDK7以前(包含JDK7),局部内部类访问局部变量,局部变量必须加入final修饰,否则报错!
* JDK7以后,局部变量会自动加上final,开发者不需要定义final关键字,为什么要加final?    
*       原因:      局部变量的生命周期,随着方法调用而存在,随着方法调用完毕而消失,
*而当前这个局部变量被局部内部类在进行访问(局部内部类对象进行访问),在堆内存中对象不会被立即回收,它还在继续使用这个局部变量,需要将这个变量定义为常量,常驻内存---->以便局部内部类对象对该局部变量的访问!

匿名内部类:它是内部类一种简化方式!     
*     格式:
*         new 类(可以是具体类,也可抽象类)名/接口名(){
*                 重写方法;
* 
*         };
* 
* 匿名内部类的好处:
*         省去了繁杂的代码,不需要定义类里面的子类或者接口的子实现类,写法比较简单!
* 
* 匿名内部类的本质就是:继承该类或者是实现了该接口的子类对象!

举例:

public class Demo6 {public static void main(String[] args) {Person p = new Person();p.function(new Student1() {@Overridepublic void study() {System.out.println("学习英语");}});}}
interface Student1{public abstract void study();
}
class StudentDemo implements Student1{@Overridepublic void study() {System.out.println("学习java");}}
class Person{public void function(Student1 s) {s.study();}
}
//学习英语

Object

使用API文档学习相关的类,接口等 这里面常用的方法有哪些?
* (Application Programming Interface:应用程序接口)
*     类:
*         Object,Scanner,String,StringBuffer,Integer,Character,BigDecimal
* Date日期类(JDK8: LocalDate),Calendar:日历类 ,Math:数学运算
* Random(随机数生产器),System
*  接口:
*      集合:Collection 单例集合
*          List   Set
*  
*          Map 集合
*          
*  
*  java.lang.Object类:
*          Object类是所有类的根类,每一个类都继承自Object类
*  
*  public int hashCode() :
*          了解: 获取该对象的一个哈希码值(理解为地址值)它是通过哈希算法算出来的,不是实际意义地址值;
*          每一个对象的哈希码值一般是不同的!
*  
*  
*  //跟反射有关!
*  public final Class getClass() 返回该object运行时类(获取字节码文件对象) 跟Java中反射!
*              
*      返回值:Class类 :表示字节码文件对象
*          public String getName()
*          通过这个类中静态功能:直接可以获取当前类的"全限定名称"(包名.类名)

day14

Object类:

可通过getClass()方法,获取对象的真实类的名称 输出包名.类名

Object类中的toString方法,一般建议重写toString方法;toString方法的作用,可以更方便的显示属性值

Object中的equal方法,在开发中我们需要比较的是属性值,多以需要重写equal方法.equal只能比较引用数据类型的属性值.

String类:

hasnextXxx:如果扫描仪输入中的下一个标记可以使用

nextXxx()方法:返回Xxx类型的值

nextXxx 将输入的下一个标记扫描为Xxx类型

选择排序算法:

选择排序:
*         使用0索引的元素依次和后面索引的元素比较,小的往前放
*         第一次比较完毕,最小值出现在最小索引处!

举例:

public class Demo7 {public static void main(String[] args) {int[] arr = {11,98,34,27,19,88};paixu(arr);getArr(arr);}public static void paixu(int[] arr){int n = arr.length;for(int i = 0; i < n - 1; i++) {int min = i;for(int j = i + 1; j < n - 1  ; j++) {if(arr[j] < arr[min]) {min = j;}}if(min != i) {int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}}public static void getArr(int[] arr) {System.out.print("遍历后为[");for(int i = 0; i < arr.length; i++) {if(i == arr.length - 1) {System.out.print(arr[i] + "]");}else {System.out.print(arr[i] + ", ");}}}}//遍历后为[11, 19, 27, 34, 98, 88]