1.外部类与内部类
1) 外部类是不能直接使用内部类的成员和方法滴
2) 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字 外部类类名.this.
例:this.HelloWorld.name
3)如果内部类和外部类不具有相同的成员变量或方法,可以直接声明使用。
2.包
一.包的作用:管理Java文件,解决同名文件冲突
二.定义包:package 包名
//必须放在Java源程序的第一行
包名间可以使用“.”隔开
三.系统中的包:
java.(功能).(类)
java.lang.(类) 包含Java语言基础的类
java.util.(类) 包含Java语言中各种工具类
java.io.(类) 包含输入,输出相关功能的类
四.包的使用:
1.可以通过使用import关键字,在某个文件使用其他文件中的类
2.Java中,包的命名规范是全小写字母拼写
3.使用的时候不但可以加载某个包下的所有文件 eg:com.imooc.*
也可以加载某个具体子包下的所有文件
3.成员内部类
//外部类HelloWorld
public class HelloWorld{
//外部类的私有属性name
private String name = "imooc";
//外部类的成员属性
int age = 20;
//成员内部类Inner
public class Inner {
String name = "爱慕课";
//内部类中的方法
public void show() {
System.out.println("外部类中的name:" + HelloWorld.this.name); //在内部类中使用与内部类重复的外部类变量
System.out.println("内部类中的name:" + name);
System.out.println("外部类中的age:" + age);
}
}
//测试成员内部类
public static void main(String[] args) {
//创建外部类的对象
HelloWorld o = new HelloWorld ();
//注意创建内部类的对象 是利用外部类的对象进行声明
Inner inn = o.new Inner();
//调用内部类对象的show方法
inn.show();
}
}
4.静态内部类:
相比于成员内部类,此类可以直接定义
如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
//外部类
public class HelloWorld {
// 外部类中的静态变量score
private static int score = 84;
// 创建静态内部类
public static class SInner {
// 内部类中的变量score
int score = 91;
public void show() {
System.out.println("访问外部类中的score:" + HelloWorld.score);
System.out.println("访问内部类中的score:" + score);
}
}
// 测试静态内部类
public static void main(String[] args) {
// 直接创建内部类的对象
SInner si = new SInner();
// 调用show方法
si.show();
}
}
5.继承:
方法的重写,构造的先后顺序为先父类后子类
final一经使用,对于变量则不可改变,对于方法和类不可以继承
package com;//包名 com
public class inital {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal = new Animal();
System.out.println(animal.age);
Dog dog = new Dog();//构造的时候先父类再子类
//dog.age=10;//继承
dog.name="xiaotian";
//dog.eat();//重写
//dog.method();
}
}
package com;
public class Animal { //final
public int age=20;
public String name;
/*public Animal()//final public Animal() 定义成final后不可被子类继承 也要注意构造方法的格式 如果变为了public void Animal则不为构造方法
{
System.out.println("Animal执行了");
age=10;
}*/
/*public Animal(int a) //有参的构造函数
{
System.out.println("Animal执行了");
age=10;
}*/
public void eat() {
//final int a=20;
//a=10;
System.out.println(name+"动物具有吃东西的能力");
}
}
package com;
public class Dog extends Animal {
public int age=200;
public Dog(){
//super(); super相当于显示的调用父类的构造方法,系统一般默认的调用已经存在的构造方法
System.out.println("Dog执行了");
}
public void eat() { //方法的重写
System.out.println(name+"狗具有吃东西的能力");
}
public void method(){
//System.out.println(age);
System.out.println(super.age);
}
}
6.重写方法(调用Source)
toString方法如果没有重写,直接输出的是它的地址
重写后输出的是它的属性值
equal方法如果没有重写,比较的是2个变量的地址
重写后比较的是它的属性值
7.类型转换
强制转换与instanceof(判断2个是否属于同一类型)
package project3;
public class Animal {
public void eat()
{
System.out.println("111Animal");
}
}
package project3;
public class Cat extends Animal {
}
package project3;
public class Dog extends Animal {
public void eat()
{
System.out.println("222Dog");
}
}
package project3;
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
/* Animal a1 = new Animal();
Animal a2 = new Dog(); //父类的引用是可以指向子类的
Animal a3 = new Cat();
a1.eat();
a2.eat();
a3.eat();
//错误 Dog a3 = new Animal();
*/
Dog dog = new Dog();
Animal animal = new Dog();//把父类看成基层,所以为向上类型转换
// Cat cat = (Cat) animal; //1 编译时 Cat类型 2运行时 Dog类型
if(animal instanceof Dog) {
Dog dog2 = (Dog)animal; //强制向下类型转换
}
else {
System.out.println("无法进行类型转换Dog");
}
if(animal instanceof Cat) {
Cat cat = (Cat)animal; //强制向下类型转换
}
else {
System.out.println("无法进行类型转换Cat");
}
}
}
8.抽象 :父类用来约束子类必须有那些类,只进行约束,不关心子类怎么实现
abstract定义抽象类
abstract定义抽象方法,只用声明,不用实现(实现了也无实际输出结果的影响)
包含抽象方法的类一定是抽象类
抽象类中可以有普通的方法,也可以不包换抽象方法
package project4;
public abstract class Telephone {
public abstract void message();
}
package project4;
public class Smartphone extends Telephone {
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("Smartphone message");
}
}
package project4;
public class phone extends Telephone {
public void message() {
System.out.println("Telephone message");
}
}
package project4;
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
phone p1 = new phone();
Smartphone p2 = new Smartphone();
p1.message();
p2.message();
}
}
9.接口
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类,他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
[修饰符] class 类名 extends 父类 implentments 接口1 接口2
当一个类继承了抽象类,则需要实现继承的抽象方法,如果是接口,则实现接口中的方法
package project7;
public abstract class Telephone {
public abstract void message(); //抽象类
}
package project7;
public interface Iplaygame { //接口
public void play();
}
package project7;
public class Psp implements Iplaygame {//只实现了接口
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("PSP play");
}
}
package project7;
public class Smartphone extends Telephone implements Iplaygame {
//实现了接口和都继承了抽象类
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("Smart play");
}
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("Smart message");
}
}
package project7;
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Iplaygame ip1 = new Psp();
ip1.play();
Iplaygame ip2 = new Smartphone();
ip2.play();
//ip2.message(); 错误 因为数据类型为Iplaygame所以没有message方法
Smartphone ip3 = new Smartphone();
ip3.play();
ip3.message();//正确的
}
}