心得体会
- 风平浪静、晴空万里的一天。一个人想要认真的学习,学习氛围很重要。我比较习惯一个人学习,有时候遇到问题就自己冥思苦想,可很多时候都花费了很多时间,但还是想不出。有时候真的要多问,这样会让自己的效率变高一点。
技术
- 1.代码块
- 2.内部类
- 3.继承
- 4.多态
- 5.练习小demo
具体操作
1.代码块
- 在java中用{}括起来的称为代码块,代码块在对象创建之前就优先被调用
修饰符{
预先执行的内容
}
class Person{
int age;
{
age=30;
System.out.println("代码块 age="+age);
}
//静态代码块
static{
// age=20;静态代码块里面不能调用成员变量和实例方法
System.out.println("静态代码块");
}
public Person(){
System.out.println("无参构造方法 age"+age);
}
public Person(int age){
this.age=age;
System.out.println("有参的构造方法");
}
}
- a.类里面可以有多个代码块。例如:在下图代码中,一个Person类里面有两个代码块
//下面有两个代码块
{
age=30;
System.out.println("代码块 age="+age);
}
static{
// age=20;静态代码块里面不能调用成员变量和实例方法
System.out.println("静态代码块");
}
- b.代码块的执行顺序和出现的先后顺序相同。例如:下面代码中,上面的代码块会优先被执行,因为上面的代码先出现
{
age=30;
System.out.println("代码块 age="+age);
}
{
age=20;
System.out.println("静态代码块");
}
- c.尽量不要在类里面写多个代码块
- d.代码块前面加static,称为静态代码块,静态代码块里面不能调用成员变量和实例方法
static{
age=20;//错误!!!静态代码块里面不能调用成员变量和实例方法
System.out.println("静态代码块");
}
2.内部类
定义一个类 可以在多个地方定义
- 1、单独创建一个文件管理一个类
- 2、直接在文件里面 类A的上面和下面创建
- 3、直接在某个类A内部创建一个类( 一个类A依附于另一个类B)
- 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
class RelativeLayout {
String view;
LayoutParams layoutParams ;
//在显示一个视图前 必须告诉系统这个视图的具体位置
public void show( float left, float top,float right, float bottom){
LayoutParams layoutParams=new LayoutParams(left,right,top,bottom) ;
System.out.println("视图:"+view+"显示出来了");
System.out.println("left"+left+"right"+right+"top"+top+"bottom"+bottom);
}
//定义一个内部类 用于管理相对布局的具体布局属性相对布局的具体布局属性
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;
}
}
}
上图中
public class LayoutParams{//内容}
为class RelativeLayout
的内部类
静态内部类的使用
class testLayout{
public static void main(String[] args){
RelativeLayout rl=new RelativeLayout();
rl.view="分享按钮";
//显示这个视图
//准备好这个视图的布局属性
//RelativeLayout.LayoutParams params= rl.new LayoutParams(20,20,20,20);
//rl.show(params);
rl.show(20,20,20,20);
TestInner ti=new TestInner();
ti.test();
}
}
class TestInner{
int a;
static int b;
Inner inner;
class Inner{
//非静态的内部类 可以访问外部类的属性和方法
public Inner(){
a=20;
b=30;
show();
}
}
public void test(){
inner=new Inner();
}
public void show(){
System.out.print("a="+a+" b="+b);
}
}
非静态的内部类 可以访问外部类的属性和方法。
- 如下图
class Inner{}
是一个非静态的内部类,a,b是外部类class TestInner{}
定义的属性,内部类class Inner{}
可以访问外部类class TestInner{}
的属性
class TestInner{
int a;
static int b;
Inner inner;
class Inner{
//非静态的内部类 可以访问外部类的属性和方法
public Inner(){
a=20;
b=30;
show();
}
}
public void test(){
inner=new Inner();
}
public void show(){
System.out.print("a="+a+" b="+b);
}
}
3.继承
a.继承 :
A extends B
(A继承于B,A就是B的子类,B就是A的父类)
- 子类获得父类的方法和属性 并且需要添加自己的方法和属性(为甚么需要继承)
- Java里面只能单继承,变相多继承
- 所有的类都直接或间接继承于Object类
- 当调用子类的一个方法时,如果没有就会在父类里面去查找
b.如果在子类里面需要调用父类的方法或者显示调用父类的属性,就 使用
super
public void walk() {
super.walk();
}
- 什么情况下需要在一个方法里面调用super的对应方法?
- 当一个方法需要完成一个功能,又不能单独完成,必须要父类
做相应的工作时,需要调用super的对应方法
- 1.父类做完之后 子类再操作
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
- 2.子类做点事情之后 在调用父类去完成
protected void onDestroy() {
super.onDestroy();
}
c.如果子类里面需要重新实现父类的方法,就需要重写
@Override
//方法的重写
@Override
public void walk(){
super.walk();
System.out.println("学生优雅的走");
}
d.如果父类有自定义构造方法,子类的构造方法也必须显示调用父类的构造方法
- 如果子类中的构造方法没有显示调用父类的构造方法,可以为父类加一个默认的构造方法
1.父类中自定义的构造方法,如下图
public Person1(String name,int age){
this.name=name;
this.age=age;
}
2.子类的构造方法也必须显示调用父类的构造方法
public Student(String name,int age ,int id,String school){
super(name,age);
this.id=id;
this.school=school;
}
e. 如果父类有内部类,子类中有同名的内部类,那么父类中的内部类就被屏蔽了
- 此时如果非要使用父类中的内部类,只能使用全类名
4.多态
- 1.同一种方法多种实现=在不同的类中有不同的实现
2.如果有继承关系:子类的对象可以使用父类变量接收,类型自动向上转换
class a{
public void info(){
System.out.println("int A");
}
}
class b extends a{
@Override
public void info(){
System.out.println("int B");
}
}
class c extends a{
@Override
public void info(){
System.out.println("int C");
}
}
//c继承于a
c textc= new c();//新建子类c的对象 textc
a textc2=new c() ;//新建子类c的对象 textc2,类型向父类a转换
textc2.info();
Object textc3=new c();//新建子类c的对象 textc3,类型向 Object类转换
}
上面输出结果之所以是int c,因为多态只是类型的转换,创建的对象还是子类c的对象
5.练习小demo
分析:将多个公务员和公司职员放在一个数组里面,数组里面只能放一种类型,从而想到用继承和多态,将公务员和公司职员转化为同一种类型
1.定义一个Person类
class Person3 {
String name;
int age;
public Person3(String name, int age) {//提供有参数的构造方法
this.name = name;
this.age = age;
}
public void walk() {//walk方法
System.out.println("走路");
}
public void eat() {//eat方法
System.out.println("吃饭");
}
}
2.定义Person3的一个子类管理公务员相关信息
class Servant extends Person3{
int Salary;
int count;//看杂志的数量
public Servant(String name, int age, int Salary, int count){
super(name,age);
this.Salary=Salary;
this.count=count;
}
@Override//子类里面需要重新实现父类的方法,需要重写
public void walk() {
super.walk();
}
@Override
public void eat() {
super.eat();
}
@Override
public String toString() {
return "Servant{" +
"name='" + name + '\'' +
", age=" + age +
", Salary=" + Salary +
", count=" + count +
'}';
}
}
3.定义Person3的一个子类管理公司职员相关信息
class worker extends Person3{
int Salary;
int tech;
public worker(String name, int age,int Salary,int tech){
super(name,age);
this.Salary=Salary;
this.tech=tech;
}
@Override
public void walk() {
super.walk();
}
@Override
public void eat() {
super.eat();
}
@Override
public String toString() {
return "worker{" +
"name='" + name + '\'' +
", age=" + age +
", Salary=" + Salary +
", tech=" + tech +
'}';
}
}
4.创建main函数,将公务员和职员放到数组,打印数组全部信息
class Test{
public static void main(String[] args){
ArrayList peoples=new ArrayList<>();
Person3 c1=new Servant("小王",20,10000,520);
Person3 c2=new Servant("小明",20,10000,250);
Person3 c3=new Servant("小李",20,10000,250);
Person3 c4=new Servant("小红",20,10000,250);
peoples.add(c1);
peoples.add(c2);
peoples.add(c3);
peoples.add(c4);
Person3 w1=new worker("小丽",18,10000,"ios");
Person3 w2=new worker("小芳",20,10000,"Android");
Person3 w3=new worker("小蒋",20,10000,"Web");
Person3 w4=new worker("小华",20,10000,"ios");
peoples.add(w1);
peoples.add(w2);
peoples.add(w3);
peoples.add(w4);
for(Person3 p:peoples){
//找到p到底是哪个类型的对象
if(p instanceof Servant){
//公务员
Servant c=(Servant )p;
c.cShow();
c.walk();
c.eat();
}else{
//员工
worker w=(worker)p;
w.wShow();
w.walk();
w.eat();
}
}
}
}