今天所诉的是类里面的代码块、内部类、继承以及多态。
目的:了解Java的类中所包含的代码块,内部类在类中的作用及它们的使用方法。继承和多态是Java语言中重要的特性。也是需要初学者们去掌握和熟悉的。
技术:
*类里面的代码块
*内部类
*继承
*多态
技术实际使用:
类里面的代码块:
代码块:java中用大括号{}将多行代码括起来,并形成一个独立的代码区间的代码形式称为代码块,它是java中常见的代码形式。
如下面所示:
class Person {
int age;//int 前面不加东西,就会默认为
{
age = 20;
System.out.println("代码块 age=" + age);
}
}
代码块可以分为普通代码块和初始化代码块
其中普通代码块仅出现于方法中,起到分隔不同功能代码的作用,其运行顺序依据代码块出现的先后。如下图:
public static void main(String[] args){
{
int x=3;
System.out.println("1,普通代码块内的变量x="+x);
}
{
int x=1;
System.out.println("主方法内的变量x="+x);
}
{
int y=7;
System.out.println("2,普通代码块内的变量y="+y);
}
}
}
初始化代码块:初始化代码块有分为静态代码块和非静态代码块
类里面可以有多个代码块,当在创建类的实例时,就会执行类里面的代码块
静态代码块:如果使用 static 修饰初始化块,就称为静态代码块
//静态代码块
static {
// age=20;静态代码块里面不能调用成员变量和实例方法
System.out.println("这是静态代码块");
}
非静态代码块:非静态代码块在类每次调用构造方法之前调用一次
注意
1. 代码块的执行顺序和出现的先后顺序相同
2.尽量不要在类里面写多个代码块
3.在对象创建之前就会被优先调用
4.代码块的基本样式:
修饰符{
* 预先执行的内容
* }
内部类
- 定义一个类 可以在多个地方定义
- 1.单独创建一个文件管理一个类
- 2.直接在文件里面 类A的上面和下面创建
-
3.直接在某个类A内部创建一个类, 一个类依附在另一个类B
class RelativeLayout {
String view;
//在显示一个视图前 必须告诉系统这个视图的具体位置
public void show(LayoutParams Layout) {
System.out.println("视图" + view + "显示出来了");
System.out.println("left:" + Layout.leftMergin + "top:" + Layout.topMergin + "right:" + Layout.rightMergin
+ "bottom:" + Layout.bottomMergin);
}
//定义一个内部类 用于管理相对布局的具体布局属性
public static class LayoutParams {
float leftMergin;
float topMergin;
float rightMergin;
float bottomMergin;
public LayoutParams(float leftMergin, float topMergin, float rightMergin,
float bottomMergin) {
this.leftMergin = leftMergin;
this.topMergin = topMergin;
this.rightMergin = rightMergin;
this.bottomMergin = bottomMergin;
}
}
}
静态内部类:静态内部类只能访问外部类的[静态成员],用static来定义。
生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别
class testLayout {
public static void main(String[] args){
//创建一个相对布局 容器视图
RelativeLayout rl = new RelativeLayout();
rl.view = "分享按钮";
//显示这个视图
//就需准备好这个视图的布局属性
//第一种方法:
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(20,
20, 20, 20);
rl.show(params);
//第二种方法:使用匿名对象,只需使用一次
rl.show(new RelativeLayout.LayoutParams(20,
20, 20, 20));
TestInner ti=new TestInner();
ti.test();
}
}
继承
继承:A extends B
获得父类的方法和属性并且需要添加自己的属性和方法。
例如:兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。动物类是父类,食草动物和食肉动物是 子类,所以继承需要符合的关系是:父类更广泛,子类要具体。虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
- Java里面只能单继承,变向多继承
继承的基本格式:
class 父类 {
}
class 子类 extends 父类 {
}
其中extends是关键字,可以声明一个类是由另一个类继承来的。
class Person1{
String name;
int age;
public Person1(String name,int age){
this.name=name;
this.age=age;
}
public void walk(){
System.out.println(name+":人走路");
}
public void eat(){
System.out.println(name+"人吃饭");
}
}
class Students extends Person1{
int id;
String school;
public Students(String name,int age,int id,String school){
super(name,age);
this.id=id;
this.school=school;
}
public void show(){
System.out.println("name:"+name);
}
//方法的重写
@Override
public void walk(){
System.out.println("学生优雅的走路");
}
@Override
public void eat() {
System.out.println("学生大口吃饭");
}
@Override
public String toString() {
return "Students{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
", school='" + school + '\'' +
'}';
}
}
里面的Students是由Person1继承而来的。
其中方法的重写:如果子类里面需要重新实现父类的方法,就需要重写
- @Override
如果在子类里面需要调用父类的方法或者显示调用父类的属性 - 使用super
- 上面情况下需要在一个方法里面调用super的对应方法?
@Override
public void walk(){
super.walk();
}
- 如果一个 方法需要完成一个功能,又不能单独完成,必须要父类
- 做相应的工作:
1.父类做完事之后,子类在操作
2.子类做点事情,再调用父类去完成
如果父类有自定义构造方法
- 那么子类的构造方法必须显示调用父类的构造方法
- 如果父类里面有内部类
- 子类中有同名的内部类
- 那么父类中的内部类就被屏蔽了
- 如果非要使用父类中的内部类,只能使用全类名Personl.内部类名
多态:
多态polymorphic:
- 1.同一个方法 多种实现=在不同的子类中有不同的实现
- 2.如果有继承关系,子类的对象可以使用父类变量接收,类型的自动向上转换
class A{
public void info(){
System.out.println("in A ");
}
}
class B extends A{
@Override
public void info() {
System.out.println(" in B ");
}
}
class C extends A{
@Override
public void info() {
System.out.println("in C");
}
}
//C extends A;
C testc= new C();
A testc2=new C();
testc2.info();
Object testc3= new C();
//错误 只能子类向父类转
C t=new A();